• 六月
  • 02
  • 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+腾讯乐固进行热更新集成就结束了,如果文章存在错误或误导性,欢迎批评指正。

 

原创文章,转载请注明出处

正在加载评论...

0 / 240

警告

确定