Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: teprinciple/UpdateAppUtils
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 1.5.1
Choose a base ref
...
head repository: teprinciple/UpdateAppUtils
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
Loading
Showing with 4,319 additions and 1,485 deletions.
  1. +34 −0 .github/workflows/android.yml
  2. +170 −73 README.md
  3. +0 −118 UpdateAppUtils/build.gradle
  4. +0 −36 UpdateAppUtils/src/main/AndroidManifest.xml
  5. +0 −199 UpdateAppUtils/src/main/java/activity/UpdateAppActivity.java
  6. +0 −147 UpdateAppUtils/src/main/java/model/UpdateBean.java
  7. +0 −43 UpdateAppUtils/src/main/java/util/UpdateAppService.java
  8. +0 −87 UpdateAppUtils/src/main/res/layout/dialog_confirm.xml
  9. +0 −87 UpdateAppUtils/src/main/res/layout/view_version_tips_dialog.xml
  10. +0 −8 UpdateAppUtils/src/main/res/values/colors.xml
  11. +0 −5 UpdateAppUtils/src/main/res/values/strings.xml
  12. +0 −17 UpdateAppUtils/src/test/java/teprinciple/library/ExampleUnitTest.java
  13. +27 −18 app/build.gradle
  14. +2 −1 app/src/main/AndroidManifest.xml
  15. +77 −0 app/src/main/java/com/example/teprinciple/updateappdemo/CheckMd5DemoActivity.kt
  16. +85 −0 app/src/main/java/com/example/teprinciple/updateappdemo/JavaDemoActivity.java
  17. +0 −25 app/src/main/java/com/example/teprinciple/updateappdemo/KotlinDemoActivity.kt
  18. +0 −113 app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.java
  19. +166 −0 app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.kt
  20. +1,402 −0 app/src/main/java/com/example/teprinciple/updateappdemo/SpanUtils.java
  21. +5 −0 app/src/main/res/drawable/bg_btn.xml
  22. BIN app/src/main/res/drawable/bg_custom_update.png
  23. BIN app/src/main/res/drawable/bg_custom_update_dialog.9.png
  24. +0 −9 app/src/main/res/drawable/bg_dialog_confirm.xml
  25. BIN app/src/main/res/drawable/ic_close.png
  26. BIN app/src/main/res/drawable/ic_logo.png
  27. BIN app/src/main/res/drawable/ic_update.png
  28. +3 −6 app/src/main/res/layout/{activity_kotlin_demo.xml → activity_java_demo.xml}
  29. +23 −25 app/src/main/res/layout/activity_main.xml
  30. +0 −20 app/src/main/res/layout/activity_start.xml
  31. +29 −0 app/src/main/res/layout/check_md5_demo_activity.xml
  32. +92 −0 app/src/main/res/layout/view_update_dialog_custom.xml
  33. BIN app/src/main/res/mipmap-hdpi/ic_launcher.png
  34. BIN app/src/main/res/mipmap-mdpi/ic_launcher.png
  35. BIN app/src/main/res/mipmap-xhdpi/ic_launcher.png
  36. BIN app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  37. BIN app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  38. +1 −3 app/src/main/res/values/strings.xml
  39. +2 −2 app/src/main/res/values/styles.xml
  40. +0 −17 app/src/test/java/com/example/teprinciple/updateappdemo/ExampleUnitTest.java
  41. +20 −8 build.gradle
  42. +2 −2 gradle/wrapper/gradle-wrapper.properties
  43. BIN img/demo.png
  44. BIN img/update_ui_change.png
  45. BIN img/update_ui_custom.png
  46. BIN img/update_ui_downloading.png
  47. BIN img/update_ui_fail.png
  48. BIN img/update_ui_force.png
  49. BIN img/update_ui_plentiful.png
  50. BIN img/update_ui_simple.png
  51. +92 −0 readme/README_1.5.2.md
  52. +48 −0 readme/version.md
  53. +46 −0 readme/自定义UI.md
  54. BIN update.jks
  55. 0 {UpdateAppUtils → updateapputils}/.gitignore
  56. +49 −0 updateapputils/build.gradle
  57. 0 {UpdateAppUtils → updateapputils}/proguard-rules.pro
  58. 0 ...eAppUtils → updateapputils}/src/androidTest/java/teprinciple/library/ExampleInstrumentedTest.java
  59. +38 −0 updateapputils/src/main/AndroidManifest.xml
  60. +18 −0 updateapputils/src/main/java/constant/DownLoadBy.kt
  61. +24 −0 updateapputils/src/main/java/constant/UiType.kt
  62. +0 −61 updateapputils/src/main/java/customview/ConfirmDialog.java
  63. +23 −0 updateapputils/src/main/java/extension/BooleanKtx.kt
  64. +57 −0 updateapputils/src/main/java/extension/ContextKtx.kt
  65. +63 −0 updateapputils/src/main/java/extension/CoreKtx.kt
  66. +23 −0 updateapputils/src/main/java/extension/StringKtx.kt
  67. +10 −0 updateapputils/src/main/java/listener/Md5CheckResultListener.kt
  68. +15 −0 updateapputils/src/main/java/listener/OnBtnClickListener.kt
  69. +21 −0 updateapputils/src/main/java/listener/OnInitUiListener.kt
  70. +30 −0 updateapputils/src/main/java/listener/UpdateDownloadListener.kt
  71. +44 −0 updateapputils/src/main/java/model/UiConfig.kt
  72. +23 −0 updateapputils/src/main/java/model/UpdateConfig.kt
  73. +22 −0 updateapputils/src/main/java/model/UpdateInfo.kt
  74. +323 −0 updateapputils/src/main/java/ui/UpdateAppActivity.kt
  75. +255 −0 updateapputils/src/main/java/update/DownloadAppUtils.kt
  76. +165 −0 updateapputils/src/main/java/update/UpdateAppReceiver.kt
  77. +31 −0 updateapputils/src/main/java/update/UpdateAppService.kt
  78. +175 −0 updateapputils/src/main/java/update/UpdateAppUtils.kt
  79. +22 −0 updateapputils/src/main/java/update/UpdateFileProvider.kt
  80. +38 −0 updateapputils/src/main/java/util/AlertDialogUtil.kt
  81. +0 −92 updateapputils/src/main/java/util/DownloadAppUtils.java
  82. +115 −0 updateapputils/src/main/java/util/FileDownloadUtil.kt
  83. +14 −0 updateapputils/src/main/java/util/GlobalContextProvider.kt
  84. +40 −0 updateapputils/src/main/java/util/SPUtil.kt
  85. +115 −0 updateapputils/src/main/java/util/SignMd5Util.kt
  86. +0 −126 updateapputils/src/main/java/util/UpdateAppReceiver.java
  87. +0 −129 updateapputils/src/main/java/util/UpdateAppUtils.java
  88. +7 −0 updateapputils/src/main/res/anim/dialog_enter.xml
  89. +7 −0 updateapputils/src/main/res/anim/dialog_out.xml
  90. +5 −0 updateapputils/src/main/res/drawable/bg_update_btn.xml
  91. +2 −5 ...in/res/drawable/bg_dialog_confirm.xml → updateapputils/src/main/res/drawable/bg_update_dialog.xml
  92. BIN updateapputils/src/main/res/drawable/ic_update_logo.png
  93. +92 −0 updateapputils/src/main/res/layout/view_update_dialog_plentiful.xml
  94. +79 −0 updateapputils/src/main/res/layout/view_update_dialog_simple.xml
  95. +15 −0 updateapputils/src/main/res/values-en/strings.xml
  96. +7 −0 updateapputils/src/main/res/values/colors.xml
  97. +15 −0 updateapputils/src/main/res/values/strings.xml
  98. +7 −3 {UpdateAppUtils → updateapputils}/src/main/res/values/styles.xml
  99. +4 −0 updateapputils/src/main/res/xml/network_security_config.xml
  100. 0 {UpdateAppUtils → updateapputils}/src/main/res/xml/update_file_paths.xml
34 changes: 34 additions & 0 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# workflow的名称,会显示在github 的项目的Actions的右边列表中,如下图
name: Android CI

# 在满足以下条件触发这个workflow
on:
push:
# 在指定的远程分支 master上,发生推送时
branches: [ master ]

jobs:
# 多个job,如果有多个,每个以“-”开头,这里只有一个 job
build:

runs-on: ubuntu-latest # 该job 运行的系统环境,支持ubuntu 、windows、macOS

# 下面是多个step ,每个以“-”开头
steps:
- uses: actions/checkout@v2 # step:检查分支
- name: set up JDK 1.8 # step:设置jdk版本
uses: actions/setup-java@v1 # 引用公共action
with:
java-version: 1.8
- name: Build with Gradle # step:打包apk
# 运行打包命令
run: chmod +x gradlew &&./gradlew assembleRelease

#step:上传apk 到action,在右上角查看
# 官方文档 https://help.github.com/cn/actions/automating-your-workflow-with-github-actions/persisting-workflow-data-using-artifacts#uploading-build-and-test-artifacts
- name: Upload APK
uses: actions/upload-artifact@v1
with:
name: app
path: app/build/outputs/apk/release/app-release.apk

243 changes: 170 additions & 73 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,97 +1,194 @@
# UpdateAppUtils1.5.1
### 一行代码,快速实现app在线下载更新 A simple library for Android update app
### 适配Android6.0、7.0、8.0
![](update.gif)
# UpdateAppUtils2.0

[ ![](https://img.shields.io/badge/platform-android-green.svg) ](http://developer.android.com/index.html)
[ ![Download](https://api.bintray.com/packages/teprinciple/maven/updateapputils/images/download.svg) ](https://bintray.com/teprinciple/maven/updateapputils/_latestVersion)

### 一行代码,快速实现app在线下载更新 A simple library for Android update app

## 集成
compile引入
```
dependencies {
compile 'com.teprinciple:updateapputils:1.5.1'
}
```
#### UpdateAppUtils2.0 特点
* Kotlin First,Kotlin开发
* 支持AndroidX
* 支持Md5签名验证
* 支持自定义任意UI
* 适配中英文
* 适配至Android 10
* 通知栏图片自定义
* 支持修改是否每次显示弹窗(非强更)
* 支持安装完成后自动删除安装包

## 使用
更新检测一般放在MainActivity或者启动页上,
在请求服务器版本检测接口获取到versionCode、versionName、最新apkPath后调用。
UpdateAppUtils2.0功能结构变化巨大,建议使用2.0以上版本;[2.0以前版本文档](https://github.com/teprinciple/UpdateAppUtils/blob/master/readme/README_1.5.2.md)

#### 效果图
<img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_simple.png" width="285"> <img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_plentiful.png" width="285"> <img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_change.png" width="285">
<img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_custom.png" width="285"> <img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_downloading.png" width="285"> <img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/update_ui_fail.png" width="285">

### 集成

#### 快速使用
```
UpdateAppUtils.from(this)
.serverVersionCode(2) //服务器versionCode
.serverVersionName("2.0") //服务器versionName
.apkPath(apkPath) //最新apk下载地址
.update();
repositories {
jcenter()
}
```

#### Kotlin代码调用完全一样
Support
```
implementation 'com.teprinciple:updateapputils:2.3.0'
```
private fun update() {
val apkPath:String = "http://issuecdn.baidupcs.com/issue/netdisk/apk/BaiduNetdisk_7.15.1.apk"
UpdateAppUtils.from(this)
.serverVersionCode(2)
.serverVersionName("2.0")
.apkPath(apkPath)
.update()
}

AndroidX项目
```
注意,由于操作失误bintray 中updateapputilsX被我删掉,
所以2.3.0以后使用updateapputilsx。之前的仍使用updateapputilsX
//implementation 'com.teprinciple:updateapputilsX:2.2.1'
implementation 'com.teprinciple:updateapputilsx:2.3.0'
```

### 使用
下面为kotlin使用示例,Java示例请参考[JavaDemo](https://github.com/teprinciple/UpdateAppUtils/blob/master/app/src/main/java/com/example/teprinciple/updateappdemo/JavaDemoActivity.java)
#### 1、快速使用

#### 更多配置使用
##### 注意:部分手机SDK内部初始化不了context,造成context空指针,建议在application或者使用SDK前先初始化
```
UpdateAppUtils.from(this)
.checkBy(UpdateAppUtils.CHECK_BY_VERSION_NAME) //更新检测方式,默认为VersionCode
.serverVersionCode(2)
.serverVersionName("2.0")
.apkPath(apkPath)
.showNotification(false) //是否显示下载进度到通知栏,默认为true
.updateInfo(info) //更新日志信息 String
.downloadBy(UpdateAppUtils.DOWNLOAD_BY_BROWSER) //下载方式:app下载、手机浏览器下载。默认app下载
.isForce(true) //是否强制更新,默认false 强制更新情况下用户不同意更新则不能使用app
.update();
UpdateAppUtils.init(context)
```

#### 说明
```
1、UpdateAppUtils提供两种更新判断方式
CHECK_BY_VERSION_CODE:通过versionCode判断,服务器上versionCode > 本地versionCode则执行更新
CHECK_BY_VERSION_NAME:通过versionName判断,服务器上versionName 与 本地versionName不同则更新
2、UpdateAppUtils提供两种下载apk方式
DOWNLOAD_BY_APP:通过App下载
DOWNLOAD_BY_BROWSER:通过手机浏览器下载
UpdateAppUtils
.getInstance()
.apkUrl(apkUrl)
.updateTitle(updateTitle)
.updateContent(updateContent)
.update()
```

#### 关于适配Android6.0、7.0、8.0

库内部已经完全适配至8.0,你可以不用再对该库进行适配

#### 文章地址:[《UpdateAppUtils一行代码实现app在线更新》](http://www.jianshu.com/p/9c91bb984c85)
#### 2、多配置使用
```
// ui配置
val uiConfig = UiConfig().apply {
uiType = UiType.PLENTIFUL
cancelBtnText = "下次再说"
updateLogoImgRes = R.drawable.ic_update
updateBtnBgRes = R.drawable.bg_btn
titleTextColor = Color.BLACK
titleTextSize = 18f
contentTextColor = Color.parseColor("#88e16531")
}
// 更新配置
val updateConfig = UpdateConfig().apply {
force = true
checkWifi = true
needCheckMd5 = true
isShowNotification = true
notifyImgRes = R.drawable.ic_logo
apkSavePath = Environment.getExternalStorageDirectory().absolutePath +"/teprinciple"
apkSaveName = "teprinciple"
}
#### 更新日志
1.5.1<br>
库内部适配至Android8.0
<br>1.4<br>
使用[filedownloader](https://github.com/lingochamp/FileDownloader)替换DownloadManager,避免部分手机DownLoadManager无效,同时解决了重复下载的问题,且提高了下载速度<br>
增加接口UpdateAppUtils.needFitAndroidN(false),避免不需要适配7.0,也要设置FileProvider<br>
<br>1.3.1<br>
修复部分bug,在demo中加入kotlin调用代码<br>
<br>1.3<br>
增加接口方法 showNotification(false)//是否显示下载进度到通知栏;<br>updateInfo(info)//更新日志信息;下载前WiFi判断。<br>
<br>1.2<br>
适配Android7.0,并在demo中加入适配6.0和7.0的代码<br>
<br>1.1<br>
适配更多SdkVersion
UpdateAppUtils
.getInstance()
.apkUrl(apkUrl)
.updateTitle(updateTitle)
.updateContent(updateContent)
.updateConfig(updateConfig)
.uiConfig(uiConfig)
.setUpdateDownloadListener(object : UpdateDownloadListener{
// do something
})
.update()
```
#### 3、md5校验说明
为了保证app的安全性,避免apk被二次打包的风险。UpdateAppUtils内部提供了对签名文件md5值校验的接口;
首先你需要保证当前应用和服务器apk使用同一个签名文件进行了签名(一定要保管好自己的签名文件,否则检验就失去了意义),
然后你需要将UpdateConfig 的 needCheckMd5 设置为true,并在Md5CheckResultListener监听中,监听校验返回结果。具体使用可参考
[CheckMd5DemoActivity](https://github.com/teprinciple/UpdateAppUtils/blob/master/app/src/main/java/com/example/teprinciple/updateappdemo/CheckMd5DemoActivity.kt)
```
UpdateAppUtils
.getInstance()
.apkUrl(apkUrl)
.updateTitle(updateTitle)
.updateContent(updateContent)
.updateConfig(updateConfig) // needCheckMd5设置为true
.setMd5CheckResultListener(object : Md5CheckResultListener{
override fun onResult(result: Boolean) {
// true:检验通过,false:检验失败
}
})
```

#### 4、自定义UI
UpdateAppUtils内置了两套UI,你可以通过修改[UiConfig](#UiConfig)进行UI内容的自定义;
当然当内部UI模板与你期望UI差别很大时,你可以采用[完全自定义UI](https://github.com/teprinciple/UpdateAppUtils/blob/master/readme/%E8%87%AA%E5%AE%9A%E4%B9%89UI.md)

### Api说明
#### 1、UpdateAppUtils Api

| api | 说明 | 默认值 | 必须设置 |
|:-------------- |:------------------------------------ |:--------------------- |:------ |
| fun apkUrl(apkUrl: String)| 更新包服务器url | null | true |
| fun update() | UpdateAppUtils入口 | - | true |
| fun updateTitle(title: String) | 更新标题 | 版本更新啦! | false |
| fun updateContent(content: String) | 更新内容 | 发现新版本,立即更新 | false |
| fun updateConfig(config: UpdateConfig) | 更新配置 | 查看源码 | false |
| fun uiConfig(uiConfig: UiConfig) | 更新弹窗UI配置 | 查看源码 | false |
| fun setUpdateDownloadListener() | 下载过程监听 | null | false |
| fun setMd5CheckResultListener() | md5校验结果回调 | null | false |
| fun setOnInitUiListener() | 初始化更新弹窗UI回调 | null | false |
| fun deleteInstalledApk() | 删除已安装的apk | - | false |
| fun setCancelBtnClickListener() | 暂不更新按钮点击监听 | - | false |
| fun setUpdateBtnClickListener() | 立即更新按钮点击监听 | - | false |

#### 2、UpdateConfig:更新配置说明

| 属性 | 说明 | 默认值 |
|:--------------------- |:------------------------------------ |:------ |
| isDebug | 是否输出【UpdateAppUtils】为Tag的日志| true |
| force | 是否强制更新,强制时无取消按钮 | false |
| apkSavePath | apk下载存放位置 | 包名目录 |
| apkSaveName | apk保存文件名 | 项目名 |
| downloadBy | 下载方式 | DownLoadBy.APP |
| needCheckMd5 | 是否需要校验apk签名md5 | false |
| checkWifi | 检查是否wifi | false |
| isShowNotification | 是否显示通知栏进度 | true |
| notifyImgRes | 通知栏图标 | 项目icon |
| serverVersionName | 服务器上apk版本名 ||
| serverVersionCode | 服务器上apk版本号 ||
| alwaysShow | 是否每次显示更新弹窗(非强更) | true |
| thisTimeShow | 本次是否显示更新弹窗(非强更) | false |
| alwaysShowDownLoadDialog| 是否需要显示更新下载进度弹窗(非强更) | false |
| showDownloadingToast | 开始下载时是否显示Toast | true |

#### 3、UiConfig:更新弹窗Ui配置说明 <div id = "UiConfig"/>

| 属性 | 说明 | 默认值 |
|:--------------------- |:------------------------------------ |:------ |
| uiType | ui模板 | UiType.SIMPLE |
| customLayoutId | 自定义布局id | false |
| updateLogoImgRes | 更新弹窗logo图片资源id | - |
| titleTextSize | 标题字体大小 | 16sp |
| titleTextColor | 标题字体颜色 | - |
| contentTextSize | 内容字体大小 | 14sp |
| contentTextColor | 内容字体颜色 | - |
| updateBtnBgColor | 更新按钮背景颜色 | - |
| updateBtnBgRes | 更新按钮背景资源id | - |
| updateBtnTextColor | 更新按钮字体颜色 | - |
| updateBtnTextSize | 更新按钮文字大小 | 14sp |
| updateBtnText | 更新按钮文案 | 立即更新 |
| cancelBtnBgColor | 取消按钮背景颜色 | - |
| cancelBtnBgRes | 取消按钮背景资源id | - |
| cancelBtnTextColor | 取消按钮文字颜色 | - |
| cancelBtnTextSize | 取消按钮文字大小 | 14sp |
| cancelBtnText | 取消按钮文案 | 暂不更新 |
| downloadingToastText | 开始下载时的Toast提示文字 | 更新下载中... |
| downloadingBtnText | 下载中 下载按钮以及通知栏标题前缀,进度自动拼接在后面 | 下载中 |
| downloadFailText | 下载出错时,下载按钮及通知栏标题 | 下载出错,点击重试 |

### Demo体验
<img src="https://github.com/teprinciple/UpdateAppUtils/blob/master/img/demo.png" width="220">

### 更新日志

#### 2.3.0
* 修复部分手机context空指针异常
##### [更多历史版本](https://github.com/teprinciple/UpdateAppUtils/blob/master/readme/version.md)
Loading