XUpdate
Лёгкая и высокодоступная платформа для обновления версий Android. Скорее переходите по инструкции, чтобы попробовать!
Прежде чем создавать задачу, пожалуйста, прочитайте «Вопросы с умом» и заполните шаблон задачи строго по инструкции, чтобы сэкономить время всех участников.
Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!
Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!
Перед использованием обязательно внимательно прочитайте инструкцию. Важные вещи повторяются трижды!
Публичный аккаунт | Тупик | Zhihu | CSDN | Jianshu | Точка знания | Билибили | Jinritou |
---|---|---|---|---|---|---|---|
Путешествие моего открытого исходного кода Android | Нажмите меня | Нажмите меня | Нажмите меня | Нажмите меня | Нажмите меня | Нажмите меня | Нажмите меня |
Если вы хотите использовать XUpdate быстрее и снизить сложность интеграции, а также поддерживать функцию прерывистой загрузки и продолжения, вы можете попробовать использовать XUpdateAPI.
Чтобы упростить интеграцию библиотек серии 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.
Эта структура основана на некоторых идеях и интерфейсах пользовательского интерфейса 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 структуры фреймворка
Поскольку доступ к github в последнее время замедлился, если вы хотите лучше понять XUpdate, вы можете настроить простой сервер обновлений версий.
Быстрый гид по интеграции
В настоящее время поддерживается использование основного инструмента разработки AndroidStudio. Просто настройте build.gradle и добавьте зависимость.
build.gradle
в корне проекта в разделе repositories добавьте:allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
build.gradle
зависимостей приложения (обычно это app) добавьте:Здесь приводится описание версий, выберите одну из них.
dependencies {
...
// версия androidx
implementation 'com.github.xuexiangjys:XUpdate:2.1.4'
}
dependencies {
...
// версия support
implementation 'com.github.xuexiangjys:XUpdate:1.1.6'
}
Выполните инициализацию конфигурации в 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) {
//реализация функции регистрации журнала
}
});
(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 | игнорировать ошибки загрузки (окно обновления не исчезает при ошибке загрузки)
По умолчанию в этом фреймворке используется метод проверки целостности файлов с помощью 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
Если проект вам понравился, рассмотрите возможность поддержать его.
> Ваша поддержка — это моя мотивация. Список всех поддержавших будет размещён ниже в качестве подтверждения. Пожалуйста, оставьте комментарий о проекте перед тем, как сделать пожертвование!

Спасибо следующим участникам за поддержку:
Имя | Сумма | Способ
:-|:-|:-
*天 | 100¥ | WeChat
*航 | 10¥ | Alipay
X*? | 18.88¥ | WeChat
*网 | 1¥ | WeChat
Joe | 88.88¥ | WeChat
## Публичный аккаунт
> Для получения дополнительной информации, пожалуйста, отсканируйте QR-код и подпишитесь на мой личный публичный аккаунт WeChat: «Путешествие по миру Android с открытым исходным кодом».

## Контакты
[](http://shang.qq.com/wpa/qunwpa?idkey=37ea606864cafa3c8a5d6b07f04fd672936a50fd6e535c13702baf705d57e6e8)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )