- 六月
- 02
- load
- load
walle+bugly+腾讯乐固进行热更新 2019-06-02 19:05:28
walle集成(https://github.com/Meituan-Dianping/walle):
由于我记录的过程有加固的过程,因此略过了部分配置,在这里只提供必要部分
一:创建证书,如果不先创建一个证书,那么是集成不上去的
android studio版本不同,创建方式也有所不同,总体来讲大同小异,这里以3.3为例
Build->Generate Signed Bundle/APK
选择apk next
选择Create new...
填入相关信息
参考例子
之后会自动填入
不管你cancel还是next都无所谓,反正证书已经生成出来了,而且之后怎么都要改动点什么,我选择点cancel。
打开app的build.gradle,并设置如下:
二:在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖
三:当前App的 build.gradle 添加依赖
加固会导致洗掉签名和渠道号,因此插件设置配置了也没什么用。
如何获取渠道号:
bugly集成
对于bugly集成腾讯官方文档(https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20181014122344)介绍还够详细的,不过稍有不注意,就会踩坑,因此写下本集成过程。 部分内容可能照搬腾讯的文档,不过我会尽量给大家避坑
一:添加插件依赖
工程根目录下“build.gradle”文件中添加:
二:集成sdk
在app module的“build.gradle”文件中添加
在同级目录创建tinker-support.gradle,先不管这里面写着什么,总之照搬即可
详细配置参考:https://bugly.qq.com/docs/utility-tools/plugin-gradle-hotfix/
三:初始化
在介绍初始化前,先说明一点,当你想运行时,估计会看见以下错误:
Tinker does not support instant run mode, please trigger build by assembleDebug or disable instant run in 'File->Settings...'.
解决方案,File->Settings,搜Instant Run,把Enable Instant Run to swap code/resource...的钩去掉即可。
初始化有两种方式,一种是改造(代理)Application,另一种则是反射Application,前者兼容性更好,后者接入成本低,那么我先说下前者(官方推荐):
1.先把tinker-support.gradle的enableProxyApplication设为false,然后以下接入方案:
创建一个SampleApplicationLike类,继承DefaultApplicationLike
2.创建一个SampleApplication,继承TinkerApplication
注意:这个类集成TinkerApplication类,这里面不做任何操作,所有Application的代码都会放到ApplicationLike继承类当中
参数解析
参数1:tinkerFlags 表示Tinker支持的类型 dex only、library only or all suuport,default: TINKER_ENABLE_ALL
参数2:delegateClassName Application代理类 这里填写你自定义的ApplicationLike
参数3:loaderClassName Tinker的加载器,使用默认即可
参数4:tinkerLoadVerifyFlag 加载dex或者lib是否验证md5,默认为false
3.AndroidManifest.xml的name设为SampleApplication
这么麻烦地接入是为了Application也能享受热更新的待遇,因为DefaultApplicationLike并不是一个真正的Application,它继承的只是一个普通的类。真正的Application是TinkerApplication,因此官方才说,“这里面不做任何操作”。因为在这里的任何操作,都不能享受热更新,如果你在里面修改了一些代码,你甚至连补丁都打不出来。当然,只要你有足够的自信代码不会出问题,可以在上面留点什么。
还有,官方文档并没有提到改造Application后如何获取Application,用static的方式倒是可以轻松获取,但如果就是不想通过static获取,那么反射能帮到你,在继承TinkerApplication的类里加上一段:
使用方法:
缺陷大概就是,这里面的代码若是有bug,不支持热更新吧。
那么现在介绍下反射Application接入方式:
1.先把tinker-support.gradle的enableProxyApplication设为true
2.直接继承Application,然后进行一系列配置即可。
3.AndroidManifest.xml的name直接设置已继承Application的类
官方只提到了改造Application兼容性更好,却没提到反射Application会出现怎样的兼容问题。大概官方也不确定会有怎样的问题吧?毕竟反射接入很多工作都替你做了。
四:AndroidManifest.xml配置:
不需要,因为1.3.1及以上版本,aar已经在AndroidManifest配置了,并且包含了对应的资源文件
五:混淆配置
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
-dontwarn com.tencent.tinker.**
-keep class com.tencent.tinker.** { *; }
#如果使用了support-v4包,还需要配置以下混淆规则:
-keep class android.support.**{*;}
加固:
接下来说加固了,加固并不需要你集成什么,windows/mac用户直接下载应用加固助手就能很地完成加固,还能重签名与生成渠道包(可我用的是linux),因此这里说的是如何手动加固。
1.配置tinker-support.gradle
isProtectedApp设为true,tinkerId可以随便写,你甚至可以写个md5,我个人喜欢以这种格式{应用版本}.{补丁版本},当前版本是1.0.0,因为这是初版未发布,所以补丁是0,结合起来就是1.0.0.0。至于baseApkDir,baseApk等参数,由于编译的是基线包,并非补丁包,因此这些你填了也没什么用
2.编译基线包:
打开Terminal,输入gradlew assembleRelease(注意,这个基线包千万不能丢,能不能生成补丁包,全靠这个目录)
3.把刚编译的apk上传到乐固(http://legu.qcloud.com/),加固时间有点长,大概五分钟左右
4.加固后会破坏签名和渠道号,因此需要对加固包重签名,打开android sdk,进入build-tools/28.0.3,你会看见一个apksigner
在该目录打开命令行,输入命令:
注意,使用apksigner默认是v1+v2(7以下用v1,其他v2)签名,如果只需要v1(所有版本可用),或者只需要v2(仅7或以上可用),那么需要带上参数--v1-signing-enabled 或 --v2-signing-enabled,它们默认都是true
如果想验证签名,apksigner verify -v app.apk即可
5.签名完成后,签名前的加固包就可以删掉了(我一般不删,留个纪念),注意,能删的只有签名前的加固基线包,加固前的基线包不能删,否则没法生成补丁。那么,开始生成渠道包。首先,你需要一个walle-cli.jar,下载地址:https://github.com/Meituan-Dianping/walle/releases。
然后,创建一个txt,叫啥名字随你,填上渠道号,一行一个,#为注释,如:
为了方便,我就把walle-cli-all.jar和channel.txt放在基线包的根目录里,并创建一个channel目录,用于生成渠道包
6.生成渠道包,如果你有更特别的需求,可以参考文档(https://github.com/Meituan-Dianping/walle/blob/master/walle-cli/README.md):
根据截图的布局,示例:
启动安卓7或以上模拟器,测试下能不能运行(主要验证v2签名是否有效,我这里就开8进行测试)
运行正常。
接下来,测试如何给已加固的渠道包进行补丁
1.为了便于演示,我就用toast输出渠道号
2.修改tinker-support.gradle,文字不好表达,直接用图吧
3.点开右上角的gradle,tinker-support->buildTinkerPatchRelease
4.构建完成后,你的bakApk会多了个基线包,它是为生成补丁而存在的东西,可以直接删掉
也许你会发现,outputs/apk有个tinkerPatch目录,里面也有补丁,别用那个,那个有问题。
如果运行了buildTinkerPatchRelease,buildTinkerPatchRelease生成patch却失败了,可以多运行一次,也许那一次就成功了。
5.补丁下发到的并不是马上收,需要等一小段时间,大概5分钟左右才收到
好的,收到补丁了,由于我把canNotifyUserRestart设置为true,因此会弹出这个窗,如果不希望弹出来,可以去掉。
演示下补丁后的效果
试试另一个渠道包运行
在这里,walle+bugly+腾讯乐固进行热更新集成就结束了,如果文章存在错误或误导性,欢迎批评指正。
原创文章,转载请注明出处