A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)
A lightweight, high availability Android version update framework.(一个轻量级、高可用性的Android版本更新框架)
A lightweight, high availability Android version update framework. Click instruction document to experience it!
Please read 【wisdom of asking questions】 before raising the issue and strictly follow the issue template fill in and save everyone's time.
Please read the instruction document carefully before use, important things are to be repeated for three time!!!
Please read the instruction document carefully before use, important things are to be repeated for three time!!!
Please read the instruction document carefully before use, important things are to be repeated for three time!!!
| WeChat public number | juejin | zhihu | CSDN | jianshu | segmentfault | bilibili | toutiao |
|---|---|---|---|---|---|---|---|
| 我的Android开源之旅 | Click me | Click me | Click me | Click me | Click me | Click me | Click me |
If you want to use xupdate faster, reduce the difficulty of integration, support breakpoint continuation download and other expansion functions, you can try to use XUpdateAPI.
In order to facilitate the rapid integration of X-Library, I provide a template project for your reference: https://github.com/xuexiangjys/TemplateAppProject
It supports Post or Get request to check version, and supports user-defined network requests.
Only version update under WiFi is supported。
Support silent download (background update) and automatic version update.
The user-friendly version update prompt pop-up window is provided to customize the theme style.
It supports user-defined version update checker, parser, prompter, downloader, install listener and error listener.
Support MD5 file verification, version ignore, version forced update and other functions.
It supports the user-defined file verification method【MD5 verification by default】.
Support custom request API interface.
Compatible with Android 6.0 ~ 12.0.
Support Chinese and English language (internationalization).
Support the use of the flutter plugin:flutter_xupdate。
Support the use of react native plugin:react-native-xupdate。
This framework refers to AppUpdate some ideas and UI, the various parts of the version update are separated to form the following parts:
IUpdateChecker: Check for the latest version.
IUpdateParser: Parsing the data results returned by the server.
IUpdatePrompter: Display the latest version information.
IUpdateDownloader: Download the latest version of APK installation package.
IUpdateHttpService: The interface for network request.
In addition, there are two listeners:
OnUpdateFailureListener: Listening error
OnInstallListener: Callback of application installation
Update core manager:
IUpdateProxy: Responsible for the process control of version update, calling update to start the version update process.Process after calling update:
…
Click to view the framework UML design diagram
Default version update
Background update
Force version update
Ignored version update
Custom pop up theme
Use the system pop-up prompt
Because GitHub is slow to visit recently, if you need to experience xupdate better, you can Click to build a simple version update service.
Pgyer Download password: xuexiangjys
At present, it supports the use of the mainstream development tool AndroidStudio and add dependency by configures
build.gradledirectly.
1.In the project root directory build.gradle:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
build.gradle of the application project (usually app):The following is the version description. Choose one.
dependencies {
...
// androidx project
implementation 'com.github.xuexiangjys:XUpdate:2.1.5'
}
dependencies {
...
// support project
implementation 'com.github.xuexiangjys:XUpdate:1.1.6'
}
Initialize settings at the top of the application:
…
【note】: if there is any problem, you can open debug mode to track the problem. If you also need to log on disk, you can implement the following interface.
XUpdate.get().setILogger(new ILogger() {
@Override
public void log(int priority, String tag, String message, Throwable t) {
// Realize the function of logging
}
});
(1) UpdateEntity
| Field name | Type | Default value | Description |
|---|---|---|---|
| mHasUpdate | boolean | false | Whether have the latest version |
| mIsForce | boolean | false | Force installation: app cannot be used without installation |
| mIsIgnorable | boolean | false | Whether the version can be ignored |
| mVersionCode | int | 0 | Latest version code |
| mVersionName | String | unknown_version | Latest version name |
| mUpdateContent | String | "" | Update content |
| mDownloadEntity | DownloadEntity | / | Download information entity |
| mIsSilent | boolean | false | Whether to download silently: when there is a new version, do not prompt to download directly |
| mIsAutoInstall | boolean | true | Whether to automatic install app when the download is completed |
(2) DownloadEntity
| Field name | Type | Default value | Description |
|---|---|---|---|
| mDownloadUrl | String | "" | Download address |
| mCacheDir | String | "" | File download directory |
| mMd5 | String | "" | The encrypted check value of the downloaded file (MD5 encryption is used by default), which is used to verify and prevent the downloaded APK file from being replaced (the latest demo has a tool for calculating the check value). Note that the MD5 value here is not the MD5 value of the application signature file! |
| mSize | long | 0 | Size of download file【unit: KB】 |
| mIsShowNotification | boolean | false | Whether to show download progress in the notification bar |
(3) PromptEntity
| Field name | Type | Default value | Description |
|---|---|---|---|
| mThemeColor | int | R.color.xupdate_default_theme_color | Theme colors (background colors for progress bars and buttons) |
| mTopResId | int | R.drawable.xupdate_bg_app_top | Top background image resource ID |
| mTopDrawableTag | String | "" | Top background image drawable tag |
| mButtonTextColor | int | 0 | Button text color |
| mSupportBackgroundUpdate | boolean | false | Whether background updates are supported |
| mWidthRatio | float | -1(Unconstrained) | The ratio of the width of the version update prompter to the screen |
| mHeightRatio | float | -1(Unconstrained) | The ratio of the height of the version update prompter to the screen |
| mIgnoreDownloadError | boolean | false | Whether to ignore the download exception (the update prompt box will not disappear if the download fails) |
The default file encryption verification method used in this framework is MD5 encryption. Of course, if you don't want to use MD5 encryption, you can also customize the File Encryptor IFileEncryptor. The following is the implementation of MD5 File Encryptor for reference:
…
Finally, call the XUpdate.get().setIFileEncryptor method, settings will take effect.
You can directly call the following code to complete the version update operation:
XUpdate.newBuild(getActivity())
.updateUrl(mUpdateUrl)
.update();
It should be noted that with the default version update, the JSON format returned by the request server should include the following contents:
{
"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": ""
}
Field description:
Automatic version update: auto check version + auto download APK + auto install APK (silent install).
You only need to set isAutoMode(true). However, if the device does not have root permission, it will not be able to complete automatic update (because the silent installation requires root permission).
XUpdate.newBuild(getActivity())
.updateUrl(mUpdateUrl)
.isAutoMode(true) // If you need to be completely unattended and update automatically, you need root permission【required for silent installation】
.update();
After enabling the background update, users can enter the background update after clicking the "background update" button.
XUpdate.newBuild(getActivity())
.updateUrl(mUpdateUrl)
.supportBackgroundUpdate(true)
.update();
If the user does not update, the program will not work normally. The server only needs to return the UpdateStatus field to 2.
Of course, if you customize the request return API, you only need to set the mIsForce field of UpdateEntity to true.
By setting the update top picture, theme color, button text color, width to height ratio, etc
No open issues yet, or sync has not completed.