一、接入
按照官方文档https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20170526100125接入。
-
接入时使用
enableProxyApplication = true
方式接入 -
tinker-support.gradle
中的bakPath
更改,默认是在build
文件夹下,每次clen
会清空bakPath = file("${rootProject.rootDir}/tinkerApk/") 复制代码
-
tinker-support.gradle
中的tinkerId
命名规范:- 基准包:tinkerId = "base-"+versionName
- 补丁包:tinkerId = "patch-"+versionName+"补丁序号"
二、Jenkins
打包
-
正常打包流程还是按照之前的步骤执行
-
打patch包时增加配置
#打补丁包时打开,格式固定为patch-版本号-序号 export tinkerId=patch-4.8.21-6 #基准包路径 export baseApkDir=app-1124-14-32-57#3.打[基准包]时注释,打[补丁包]需要打开 sed -i '/def baseApkDir/c'"def baseApkDir =\"${baseApkDir}\";" app/tinker-support.gradle #打补丁包时打开,PS:为了和其他tinkerId区分,查找的tinkerId前加了空格 sed -i '/tinkerId/c'"tinkerId =\"${tinkerId}\";" app/tinker-support.gradle 复制代码
-
tinkerId
按照规范去修改 -
baseApkDie
目录为有Bug
的线上包的路径,拷贝最近一次打包的目录 -
修改执行的
Gradle Task
为buildTinkerPatchOnlineRelease
-
三、热修复流程
- 发现
Bug
- 基于
tag
拉hotfix
分支 - 在
hotfix
分支打包 - 修复
bug
并提交 - 打补丁包
- 测试补丁
- 全量下发
四、测试流程
1.在AndroidStudio中chek线上bug包代码,在Bugly.init
之后增加
Bugly.setIsDevelopmentDevice(getApplicationContext(), BuildConfig.DEBUG);
复制代码
2.签名一定与线上签名保持一致
3.运行代码
4.将补丁包上传至bugly
热修复平台,选择开发设备下发
5.重启App
,进入主界面之后,等待1-2分钟
6.再次重启App
注:如未修复,请重复5,6步骤两到三次
五、遇到的坑
-
如果有多
Flavors
配置,需要在tinker-support.gradle
中配置buildAllFlavorsDir = "${bakPath}/${baseApkDir}" 复制代码
去掉一些配置 只有打开
buildAllFlavorsDir
才可以去掉// 编译补丁包时,必需指定基线版本的apk,默认值为空 // 如果为空,则表示不是进行补丁包的编译 // @{link tinkerPatch.oldApk } baseApk = "${bakPath}/${baseApkDir}/app-release.apk"// 对应tinker插件applyMapping baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"// 对应tinker插件applyResourceMapping baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt" 复制代码
-
涉及到渠道需要上传加固包的比如 360、应用宝,需要在
tinker-support.gradle
中配置isProtectedApp = true 复制代码
注意:这个配置不会影响非加固包
-
注掉这个属性,官方文档有时候有这个属性,有时候没有。加了这个属性会导致编译不过
// 是否开启反射Application模式enableProxyApplication = false 复制代码
-
混淆规则使用
proguard-android.txt
不要使用混淆优化proguard-android-optimize.txt
,不然在打差异包再次混淆时会报错proguardFiles getDefaultProguardFile('proguard-android.txt') 复制代码
-
7z配置
-
本地配置
sevenZip {zipArtifact = "com.tencent.mm:SevenZip:1.1.10" } 复制代码
-
Jenkins服务器配置
sevenZip {zipArtifact = "com.tencent.mm:SevenZip:1.1.10"path = "/usr/bin/7za"} 复制代码
-
-
资源混淆
AndResGuard
目前暂时不支持资源混淆
六、目前效果
出现过一次线上bug,使用Tinker热修复,配合bugly发布平台,总耗时大概20分钟,到目前为止修复率很高,而且没有引起任何二次bug
复制代码