微信热修复框架Tinker集成记录
Tinker 是微信官方的热补丁的解决方案,它支持动态下发代码 So库以及资源,让应用能够在不需要重新安装的情况下实现更新- Tinker
Tinker和其他热修复的区别
功能 | Tinker | Qzone | AndFix | Robust |
---|---|---|---|---|
类替换 | yes | yes | no | no |
So替换 | yes | no | no | no |
资源替换 | yes | yes | no | no |
全平台支持 | yes | yes | yes | yes |
即时生效 | no | no | yes | yes |
性能损耗 | 较小 | 较大 | 较小 | 较小 |
补丁包大小 | 较小 | 较大 | 一般 | 一般 |
复杂度 | 较低 | 较低 | 复杂 | 复杂 |
开发透明 | yes | yes | no | no |
Rom体积 | 较大 | 较小 | 较小 | 较小 |
成功率 | 较高 | 较高 | 一般 | 最高 |
gradle支持 | yes | no | no | no |
在project的build.gradle中添加依赖
|
|
在app的build.gradle中配置一些设置
|
|
其中tinker_version在project的gradle.properties里设置
|
|
app/build.gradle的配置还是比较麻烦的 具体的看注释
|
|
然后把 sample里的类导入
修改sampleappactivitylike的上方的注释 这注释的意思就是 在指定包下生成一个amsky的aoolication类
在manifest里读取内存的权限
|
|
|
|
|
|
执行api更新代码
|
|
先安装打出来的有问题的包
然后把这个patch_signed_7zip.apk放进手机 然后在更新代码 就会发现我们修改的代码已经生效了
TinkerPatch
TinkerPatch,是微信微Tinker推出的平台,来帮助开发者更好的管理补丁的下发和管理(腾讯的Bugly也可以,也是使用tinker方案)
平台 配置基本和自己集成差不多 为了编写方便观看 把对tinker的设置抽了出来
|
|
并在app的builde.gradle 中引入
|
|
application有两种设置
reflectApplication = true 的情况
若我们使用 reflectApplication 模式,我们无需为接入 Tinker 而改造我们的 Application 类。初始化 SDK 可参考 tinkerpatch-easy-sample 中的 SampleApplication 类.
|
|
我们将 Tinker 加载补丁过程的结果存放在 TinkerPatchApplicationLike 中。
- reflectApplication = false 的情况
若我们已经完成了应用的 Application 改造,即将 Application 的逻辑移动到 ApplicationLike类中。我们可以参考 tinkerpatch-sample 中的 SampleApplicationLike 类. 修改注释的方法和自己集成一样,并在mainfeast里注册application
|
|
还需要配置轮训服务器的一些设置
|
|
发布时候appversion版本号每一个都要不一样发布的时候版本号和gridle里的appversion保持一致
我们app本来的appversion就是我们升级的时候需要修改的和这个不一样,可以自己设定一个规则,比如一个三位和我们app本身的versioncode保持一致,然后每一个版本可以重复发布升级补丁。
API 详情见tinkerpatch的文档
版本问题
经过反复测试
多次升级补丁之后,你安装的版本还是当初你用apk安装的版本无论你中间安装了多少个升级包,都是当初安装的那个版本
这个补丁是 一直对照基础包来打差异包
就是1升2的时候 (2-1)+1
2升3 (3-1)+1
3升4 (4-1)+1
多渠道
关于渠道包的问题,若使用 flavor 编译渠道包,会导致不同的渠道包由于 BuildConfig 变化导致 classes.dex 差异。这里建议的方式有:
将渠道信息写在 AndroidManifest.xml 或文件中,例如 channel.ini;
将渠道信息写在 apk 文件的 zip comment 中,这种是建议方式,例如可以使用项目 packer-ng-plugin 或者可使用 V2 Scheme 的 walle;
若不同渠道存在功能上的差异,建议将差异部分放于单独的dex或采用相同代码不同配置方式实现;
已通过Walle实现:
【Android】Walle多渠道打包&Tinker热修复
http://www.jianshu.com/p/0ba717f7385f
Tinker已知问题
Tinker 不支持修改 AndroidManifest.xml,Tinker 不支持新增四大组件;
由于 Google Play 的开发者条款限制,不建议在GP渠道动态更新代码;
在 Android N 上,补丁对应用启动时间有轻微的影响;
不支持部分三星 android-21 机型,加载补丁时会主动抛出 TinkerRuntimeException:checkDexInstall failed;
由于各个厂商的加固实现并不一致,在1.7.6以及之后的版本,tinker 不再支持加固的动态更新;
对于资源替换,不支持修改 remoteView。例如 transition动画,notification icon 以及 桌面图标。