1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xuexiangjys-XUpdate

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_ZH.md 35 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 11:13 6398b22

XUpdate

api I Star

Английский | КитайскийВидеоурок

Лёгкая и высокодоступная платформа для обновления версий Android. Скорее переходите по инструкции, чтобы попробовать!

Прежде чем создавать задачу, пожалуйста, прочитайте «Вопросы с умом» и заполните шаблон задачи строго по инструкции, чтобы сэкономить время всех участников.

Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!

Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!

Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!

Обо мне

Публичный аккаунт Тупик Zhihu CSDN Jianshu Точка знания Билибили Jinritou
Путешествие моего открытого исходного кода Android Нажмите меня Нажмите меня Нажмите меня Нажмите меня Нажмите меня Нажмите меня Нажмите меня

Простое использование

Если вы хотите использовать XUpdate быстрее и снизить сложность интеграции, а также поддерживать функцию прерывистой загрузки и продолжения, вы можете попробовать использовать XUpdateAPI.

Быстрая интеграция библиотеки XSeries

Чтобы упростить интеграцию библиотек серии X, я предоставляю пустой шаблон проекта для вашей справки: https://github.com/xuexiangjys/TemplateAppProject


Особенности

  • Поддержка методов проверки версии post и get, поддержка пользовательских сетевых запросов.

  • Можно настроить проверку версии только при подключении к Wi-Fi.

  • Поддерживает автоматическое обновление в фоновом режиме и обновление без вывода сообщений.

  • Предоставляет дружественное пользователю всплывающее окно с подсказкой об обновлении версии, которое можно настроить в соответствии с темой.

  • Поддерживается настройка собственного средства проверки обновлений версии, анализатора обновлений версии, средства подсказки обновлений версии, загрузчика обновлений версии, установщика обновлений версии и обработчика ошибок.

  • Поддерживаются функции MD5-проверки файлов, игнорирования версий и принудительного обновления версий.

  • Пользовательский метод проверки файлов можно настроить (по умолчанию используется проверка MD5).

  • API интерфейса запроса можно настроить.

  • Совместимость с Android 6.0–11.0.

  • Отображение на китайском и английском языках (интернационализация).

  • Плагин Flutter можно использовать: flutter_xupdate.

  • React-Native плагин можно использовать: react-native-xupdate.

График популярности Star

Stargazers over time

Структура

Эта структура основана на некоторых идеях и интерфейсах пользовательского интерфейса AppUpdate [WVector/AppUpdate] и разделяет процесс обновления на несколько частей:

  • Средство проверки обновлений версии IUpdateChecker: проверяет наличие новой версии.

  • Анализатор обновлений версии IUpdateParser: анализирует данные, возвращаемые сервером.

  • Индикатор обновлений версии IUpdatePrompter: отображает информацию о последней версии.

  • Загрузчик обновлений версии IUpdateDownloader: загружает последнюю версию APK-пакета установки.

  • Интерфейс службы сетевого запроса IUpdateHttpService: определяет связанные интерфейсы для выполнения сетевых запросов.

Кроме того, есть два слушателя:

  • Слушатель неудачного обновления версии OnUpdateFailureListener.

  • Слушатель установки версии apk OnInstallListener.

Ядро диспетчеризации обновлений:

  • Бизнес-агент обновлений версии IUpdateProxy: отвечает за управление процессом обновления версии, вызывая update для запуска процесса обновления версии.

Процесс обновления

После вызова update процесс выглядит следующим образом:

IUpdateProxy/XUpdate --- (update) ---> IUpdateChecker --->(Запрос сервера, получение информации о последней версии)---> IUpdateParser ---> (Анализ данных, возвращённых сервером, и создание объекта UpdateEntity для обновлений версии)---> IUpdateProxy ---> (Если нет последней версии, завершите напрямую, иначе выполните следующий процесс)

    ---Автоматический режим---> IUpdateDownloader ---> (Загрузка последнего приложения apk) ---> Установка приложения

    ---Неавтоматический режим---> IUpdatePrompter ---> Подсказка о версии обновления

                                                        ---> Пользователь нажимает «обновить» ---> IUpdateDownloader ---> (загрузка последнего приложения apk) ---> Переход к экрану установки приложения

                                                        ---> Пользователь нажимает («отменить» или «игнорировать») ---> Завершение

Щелкните, чтобы просмотреть диаграмму UML структуры фреймворка


1、Демонстрация (пожалуйста, поддержите звезду)

  • По умолчанию обновляется версия

xupdate_default.png

  • Фоновое обновление

xupdate_background.png

  • Принудительное обновление версии

xupdate_force.png

  • Версия может быть проигнорирована

xupdate_ignore.png

  • Настраиваемое всплывающее окно подсказки темы

xupdate_custom.png

  • Используйте системное всплывающее окно для подсказки

xupdate_system.png

Демонстрационный сервер фонового обновления

Поскольку доступ к github в последнее время замедлился, если вы хотите лучше понять XUpdate, вы можете настроить простой сервер обновлений версий.

Скачать демо

Скачать куст

Быстрый гид по интеграции

В настоящее время поддерживается использование основного инструмента разработки AndroidStudio. Просто настройте build.gradle и добавьте зависимость.

2.1. Метод импорта в Android Studio, добавление Gradle-зависимости

  1. Сначала в build.gradle в корне проекта в разделе repositories добавьте:
allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
  1. Затем в build.gradle зависимостей приложения (обычно это app) добавьте:

Здесь приводится описание версий, выберите одну из них.

  • Версия androidx: 2.0.0 или выше
dependencies {
  ...
  // версия androidx
  implementation 'com.github.xuexiangjys:XUpdate:2.1.4'
}
  • Версия support: 1.1.6 или ниже
dependencies {
  ...
  // версия support
  implementation 'com.github.xuexiangjys:XUpdate:1.1.6'
}

2.2. Инициализация XUpdate

Выполните инициализацию конфигурации в Application:

XUpdate.get()
    .debug(true)
    .isWifiOnly(true)                                               //по умолчанию проверка версии обновления только при wifi
    .isGet(true)                                                    //по умолчанию используется get-запрос для проверки версии
    .isAutoMode(false)                                              //по умолчанию неавтоматический режим, можно настроить в соответствии с использованием
    .param("versionCode", UpdateUtils.getVersionCode(this))         //установка параметров по умолчанию для общего запроса
    .param("appKey", getPackageName())
    .setOnUpdateFailureListener(new OnUpdateFailureListener() {     //установка прослушивателя ошибок обновления версии
        @Override
        public void onFailure(UpdateError error) {
            if (error.getCode() != CHECK_NO_NEW_VERSION) {          //обработка различных ошибок
                ToastUtils.toast(error.toString());
            }
        }
    })
    .supportSilentInstall(true)                                     //установка поддержки автоматической установки, по умолчанию true
    .setIUpdateHttpService(new OKHttpUpdateHttpService())           //это обязательно! реализация функции сетевого запроса
    .init(this);                                                    //обязательно выполнить инициализацию

[Примечание]: Если возникнут какие-либо проблемы, вы можете включить режим отладки для отслеживания проблем. Если вам также необходимо регистрировать журналы на диске, вы можете реализовать следующий интерфейс:

XUpdate.get().setILogger(new ILogger() {
    @Override
    public void log(int priority, String tag, String message, Throwable t) {
        //реализация функции регистрации журнала
    }
});

2.3. Информация о сущности обновления версии

(1) Поля атрибутов UpdateEntity

Поле Тип Значение по умолчанию Примечание
mHasUpdate boolean false наличие новой версии
mIsForce boolean false принудительная установка: приложение не будет работать без установки
mIsIgnorable boolean false можно игнорировать эту версию
mVersionCode int 0 код последней версии
mVersionName String unknown_version название последней версии
mUpdateContent String "" содержание обновления
mDownloadEntity DownloadEntity / информация о загрузке
mIsSilent boolean false автоматическая загрузка: уведомление о новой версии не отображается
mIsAutoInstall boolean true установка после завершения загрузки

(2) Поля атрибутов DownloadEntity

Поле Тип Значение по умолчанию Примечание
mDownloadUrl String "" адрес загрузки
mCacheDir String "" каталог файлов загрузки
mMd5 String "" значение md5 файла загрузки (по умолчанию используется md5), используется для проверки, чтобы предотвратить замену загруженного apk-файла (в последнем демонстрационном примере есть инструмент для вычисления значения md5). Обратите внимание, что это значение отличается от значения md5 подписи приложения!
mSize long 0 размер файла загрузки [единица измерения: КБ]
mIsShowNotification boolean false показывать ли прогресс загрузки в уведомлении

(3) Поля атрибутов PromptEntity

| Поле | Тип | Значение по умолчанию | Примечание | --- | --- | --- | | mThemeColor | int | R.color.xupdate_default_theme_color | цвет темы (цвет фона верхней и нижней части) | mTopResId | int | R.drawable.xupdate_bg_app_top | изображение верхней части | mTopDrawableTag | String | "" | тег изображения верхней части | mButtonTextColor | int | 0 | цвет текста кнопки | mSupportBackgroundUpdate | boolean | false | поддержка фонового обновления | mWidthRatio | float | -1 (без ограничений) | ширина окна обновления относительно экрана | mHeightRatio | float | -1 (без ограничений) | высота окна обновления относительно экрана | mIgnoreDownloadError | boolean | false | игнорировать ошибки загрузки (окно обновления не исчезает при ошибке загрузки)

2.4. Способ проверки целостности файла

По умолчанию в этом фреймворке используется метод проверки целостности файлов с помощью MD5. Конечно, если вы не хотите использовать MD5, вы также можете настроить средство проверки файлов IFileEncryptor. Ниже приведена реализация MD5 для справки:

/**
 * По умолчанию для проверки целостности файлов используется MD5
 *
 * @author xuexiang
 * @since 2019-09-06 14:21
 */
public class DefaultFileEncryptor implements IFileEncryptor {
    /**
     * Зашифровать файл
     *
     * @param file
     * @return
     */
    @Override
    public String encryptFile(File file) {
        return Md5Utils.getFileMD5(file);
    }

    /**
``` **Проверка файла на валидность (проверка соответствия шифрования)**

* *@param encrypt* — значение шифрования, если *encrypt* пуст, то файл считается валидным.
* *@param file* — файл, который необходимо проверить.
* *@return* — валидность файла.

public boolean isFileValid(String encrypt, File file) { return TextUtils.isEmpty(encrypt) || encrypt.equalsIgnoreCase(encryptFile(file)); }

После этого можно вызвать метод `XUpdate.get().setIFileEncryptor`, чтобы изменения вступили в силу.

---

**3. Версия обновления**

3.1. **Обновление версии по умолчанию**

Чтобы выполнить обновление версии, достаточно вызвать следующий код:

XUpdate.newBuild(getActivity()) .updateUrl(mUpdateUrl) .update();

Следует отметить, что при использовании обновления версии по умолчанию ответ сервера в формате JSON должен содержать следующую информацию:

{ "Code": 0, "Msg": "", "UpdateStatus": 1, "VersionCode": 3, "VersionName": "1.0.2", "ModifyContent": "1、优化api接口。\r\n2、添加使用demo演示。\r\n3、新增自定义更新服务API接口。\r\n4、优化更新提示界面。", "DownloadUrl": "https://raw.githubusercontent.com/xuexiangjys/XUpdate/master/apk/xupdate_demo_1.0.2.apk", "ApkSize": 2048, "ApkMd5": "" }


Описание полей:

* Code: 0 означает успешное выполнение запроса, любое другое значение указывает на ошибку.
* Msg: информация об ошибке при запросе.
* UpdateStatus: статус обновления версии. 0 указывает на отсутствие необходимости обновления, 1 указывает на наличие обновления версии без необходимости принудительного обновления, а 2 указывает на необходимость принудительного обновления.
* VersionCode: номер версии, увеличивающийся автоматически. Используется для сравнения с локальной версией, чтобы определить, является ли она последней версией.
* VersionName: отображаемое название версии.
* ModifyContent: содержимое обновления версии.
* DownloadUrl: URL-адрес загрузки файла приложения APK.
* ApkSize: размер файла APK в килобайтах.
* ApkMd5: значение MD5 файла APK. Если оно отсутствует, невозможно гарантировать целостность файла APK, и каждый раз будет происходить повторная загрузка. По умолчанию используется алгоритм MD5.

3.2. **Автоматическое обновление версии**

Автоматическое обновление включает в себя автоматическую проверку версии + автоматическую загрузку APK + автоматическую установку APK (тихая установка).
Достаточно установить `isAutoMode(true)`, но если устройство не имеет прав root, полностью автоматическое обновление невозможно (поскольку для тихой установки требуются права root).

XUpdate.newBuild(getActivity()) .updateUrl(mUpdateUrl) .isAutoMode(true) //если нужно полностью без вмешательства человека, автоматическое обновление, требуется root-доступ .update();


3.3. **Поддержка фонового обновления**

После включения поддержки фонового обновления пользователи могут перейти в фоновое обновление после нажатия кнопки «Фоновое обновление», вместо того чтобы постоянно ждать обновления на экране обновления.

XUpdate.newBuild(getActivity()) .updateUrl(mUpdateUrl) .supportBackgroundUpdate(true) .update();


3.4. **Принудительное обновление версии**

Если пользователь не обновит приложение, оно не сможет нормально работать. Для этого сервер должен вернуть значение поля `UpdateStatus` равное 2.

Конечно, если вы настраиваете запрос API, просто установите поле `mIsForce` объекта `UpdateEntity` в значение true.

3.5. **Настройка темы всплывающего окна обновления версии**

Настраивая изображение верхней части, цвет темы, цвет текста кнопки, соотношение сторон и т. д., можно реализовать пользовательскую тему.

* promptThemeColor: устанавливает цвет темы.
* promptButtonTextColor: устанавливает цвет текста кнопки.
* promptTopResId: устанавливает идентификатор ресурса изображения верхней части.
* promptTopDrawable: устанавливает изображение верхней части.
* promptTopBitmap: устанавливает растровое изображение верхней части.
* promptWidthRatio: устанавливает соотношение ширины всплывающего окна к ширине экрана, по умолчанию -1, без ограничений.
* promptHeightRatio: устанавливает отношение высоты всплывающего окна к высоте экрана, по умолчанию -1, без ограничений.

XUpdate.newBuild(getActivity()) .updateUrl(mUpdateUrl) .promptThemeColor(ResUtils.getColor(R.color.update_theme_color)) .promptButtonTextColor(Color.WHITE) .promptTopResId(R.mipmap.bg_update_top) .promptWidthRatio(0.7F) .update();


3.6. **Пользовательский анализатор обновлений версии**

Реализуя интерфейс `IUpdateParser`, можно настроить анализатор.

XUpdate.newBuild(getActivity()) .updateUrl(mUpdateUrl3) .updateParser(new CustomUpdateParser()) //настроить анализатор версии .update();

public class CustomUpdateParser implements IUpdateParser { @Override public UpdateEntity parseJson(String json) throws Exception { CustomResult result = JsonUtil.fromJson(json, CustomResult.class); if (result != null) { return new UpdateEntity() .setHasUpdate(result.hasUpdate) .setIsIgnorable(result.isIgnorable) .setVersionCode(result.versionCode) .setVersionName(result.versionName) .setUpdateContent(result.updateLog) .setDownloadUrl(result.apkUrl) .setSize(result.apkSize); } return null; } }


3.7. **Настраиваемый анализатор обновлений, анализатор и всплывающее окно обновлений**

* Реализуя интерфейс `IUpdateChecker`, можно настроить анализатор.
* Реализуя интерфейс `IUpdateParser`, можно настроить анализатор.
* Реализуя интерфейс `IUpdatePrompter`, можно настроить всплывающее окно. **Обновление**

.update();

public class CustomUpdatePrompter implements IUpdatePrompтер {

private Context mContext;

public CustomUpdatePrompter(Context context) {
    mContext = context;
}

@Override
public void showPrompt(@NonNull UpdateEntity updateEntity, @NonNull IUpdateProxy updateProxy, @NonNull PromptEntity promptEntity) {
    showUpdatePrompt(updateEntity, updateProxy);
}

/**
 * Показать пользовательское сообщение
 *
 * @param updateEntity
 * @param updateProxy
 */
private void showUpdatePrompt(final @NonNull UpdateEntity updateEntity, final @NonNull IUpdateProxy updateProxy) {
    String updateInfo = UpdateUtils.getDisplayUpdateInfo(mContext, updateEntity);

    new AlertDialog.Builder(mContext)
            .setTitle(String.format("Обновить до версии %s?", updateEntity.getVersionName()))
            .setMessage(updateInfo)
            .setPositiveButton("Обновить", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    updateProxy.startDownload(updateEntity, new OnFileDownloadListener() {
                        @Override
                        public void onStart() {
                            HProgressDialogUtils.showHorizontalProgressDialog(mContext, "Загрузка прогресса", false);
                        }

                        @Override
                        public void onProgress(float progress, long total) {
                            HProgressDialogUtils.setProgress(Math.round(progress * 100));
                        }

                        @Override
                        public boolean onCompleted(File file) {
                            HProgressDialogUtils.cancel();
                            return true;
                        }

                        @Override
                        public void onError(Throwable throwable) {
                            HProgressDialogUtils.cancel();
                        }
                    });
                }
            })
            .setNegativeButton("Не обновлять пока", null)
            .setCancelable(false)
            .create()
            .show();
}

**3.8. Использование только загрузчика XUpdate для загрузки APK**

XUpdate.newBuild(getActivity()) .apkCacheDir(PathUtils.getAppExtCachePath()) // Установить каталог кэша загрузки .build() .download(mDownloadUrl, new OnFileDownloadListener() { // Установить адрес загрузки и прослушиватель загрузки @Override public void onStart() { HProgressDialogUtils.showHorizontalProgressDialog(getContext(), "Загрузка прогресса", false); }

        @Override
        public void onProgress(float progress, long total) {
            HProgressDialogUtils.setProgress(Math.round(progress * 100));
        }

        @Override
        public boolean onCompleted(File file) {
            HProgressDialogUtils.cancel();
            ToastUtils.toast("Загрузка APK завершена, путь к файлу: " + file.getPath());
            return false;
        }

        @Override
        public void onError(Throwable throwable) {
            HProgressDialogUtils.cancel();
        }
    });

**3.9. Использование только функции установки APK XUpdate**

_XUpdate.startInstallApk(getContext(), FileUtils.getFileByPath(PathUtils.getFilePathByUri(getContext(), data.getData()))); // Записать путь файла


Если у вас есть другая установка APK, вы можете реализовать свой собственный установщик APK. Вам нужно только реализовать интерфейс OnInstallListener и установить его с помощью XUpdate.setOnInstallListener.

**3.10. Конфигурация интернационализации**

Из-за ограниченных навыков автора в настоящее время поддерживаются только китайский и английский языки (по умолчанию английский). Если вам нужна поддержка других языков, просто создайте соответствующие языковые файлы в папке res вашего проекта и переведите их.

Подробные сведения о переводе см. в файле ***[xupdate_strings.xml](https://github.com/xuexiangjys/XUpdate/blob/master/xupdate-lib/src/main/res/values-zh-rCN/xupdate_strings.xml)***.

Что? Вы ещё не знаете, как настроить многоязычность в Android? Рекомендую вам прочитать эту статью: [Android Project Internationalization Multi-Language Adaptation](https://blog.csdn.net/qq_29769851/article/details/90606437).

**Конфигурация обфускации**

-keep class com.xuexiang.xupdate.entity.** { *; }

// Обратите внимание, что если вы используете пользовательский анализатор API, вам также необходимо добавить обфускацию к вашим пользовательским объектам API, например, это настраиваемая конфигурация обфускации объектов API в этом демо: -keep class com.xuexiang.xupdatedemo.entity.** { *; }


* [XUpdate документ](https://github.com/xuexiangjys/XUpdate/wiki)
* [Упрощённая библиотека XUpdate](https://github.com/xuexiangjys/XUpdateAPI)
* [Сервис управления XUpdate](https://github.com/xuexiangjys/XUpdateService)
* [Система управления XUpdate на бэкенде](https://github.com/xuexiangjys/xupdate-management)
* [Плагин XUpdate для Flutter](https://github.com/xuexiangjys/flutter_xupdate)
* [Плагин React-Native XUpdate](https://github.com/xuexiangjys/react-native-xupdate)
* [Компонент диалогового окна обновления версии Flutter](https://github.com/xuexiangjys/flutter_update_dialog)

---

## Особая благодарность

https://github.com/WVector/AppUpdate

Если проект вам понравился, рассмотрите возможность поддержать его.

> Ваша поддержка — это моя мотивация. Список всех поддержавших будет размещён ниже в качестве подтверждения. Пожалуйста, оставьте комментарий о проекте перед тем, как сделать пожертвование!

![pay.png](https://raw.githubusercontent.com/xuexiangjys/Resource/master/img/pay/pay.png)

Спасибо следующим участникам за поддержку:

Имя | Сумма | Способ
:-|:-|:-
*天 | 100¥ | WeChat
*航 | 10¥ | Alipay
X*? | 18.88¥ | WeChat
*网 | 1¥ | WeChat
Joe | 88.88¥ | WeChat

## Публичный аккаунт

> Для получения дополнительной информации, пожалуйста, отсканируйте QR-код и подпишитесь на мой личный публичный аккаунт WeChat: «Путешествие по миру Android с открытым исходным кодом».

![](https://s1.ax1x.com/2022/04/27/LbGMJH.jpg)

## Контакты

[![](https://img.shields.io/badge/нажмите%20одну%20кнопку%2C%20чтобы%20присоединиться%20к%20группе%20обмена%20QQ-720212425-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=37ea606864cafa3c8a5d6b07f04fd672936a50fd6e535c13702baf705d57e6e8)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xuexiangjys-XUpdate.git
git@api.gitlife.ru:oschina-mirror/xuexiangjys-XUpdate.git
oschina-mirror
xuexiangjys-XUpdate
xuexiangjys-XUpdate
master