这里主要分两个部分,第一部分是运行官网实例,了解Tinker热修复如何使用,第二部分是建立自己的demo,接入Tinker
第一部分
1.下载官网 Tinkerdemo:
https://github.com/Tencent/tinker/(这里面主要看的就是tinker-sample-android)
2.将tinker - sample -android:导入到Android studio 中
3.修改TinkerId:导入后会发现找不到TinkerId,原因是在app的build.grandle中tinkerId和git连用了,第一种方式就是将TinkerId写死,不建议这种,第二种是建立git
建立git的步骤:
(3.1)首先下载git.exe(百度一下就能找到),然后运行安装,在Android studio 中配置git(File—setting):如下图:
(3.2) 找到tinker - sample -android项目所在的目录,然后创建git仓库:
进入项目目录中,在空白处右键,选中Git GUI Here,然后选择第一个create repository(目录选择tinker - sample -android项目所在的目录),然后会发现目录下面多了一个.git,如下图:
(3.3) 最后关联studio:
(3.4) 这时候会发现项目下的文件为红色,随便选择一个文件 右击—git—add,再一次右击—git—commit,这是会在versioncontrol 里面找到对应的数字,设置为TinkerId即可:
在menifest中设置:
到此为止,项目就可以运行了,使用方法如下:
1.调用assembleDebug编译,我们会将编译过的包保存在build/bakApk中。然后我们将它安装到手机,点击SHOW INFO按钮,可以看到补丁并没有加载.(相当于说我们现在存在bug的项目)
2.修改代码,例如将MainActivity中I am on patch onCreate的Log打开。然后我们需要修改build.gradle中的参数,将步骤一编译保存的安装包路径拷贝到tinkerPatch中的oldApk参数中。(这一步相当于我们修改了bug之后生成的新的apk)
3.调用tinkerPatchDebug, 补丁包与相关日志会保存在/build/outputs/tinkerPatch/。然后我们将patch_signed_7zip.apk推送到手机的sdcard中。
(studio 中 的Grandle —-app—tinker–tinkerPatchDebug点击运行)
运行之后:将生成的新的apk,push到手机当中(现实项目应该是从服务器当中下载)
在studio的terminal当中执行下面的话:
adb push ./app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk /storage/sdcard0/
4.点击LOAD PATCH按钮, 如果看到patch success, please restart process的toast,即可锁屏或者点击KILL SELF按钮
5.我们可以看到的确出现了I am on patch onCreate日志,同时点击SHOW INFO按钮,显示补丁包的确已经加载成功了。
到这里,官网的demo就可以完全的运行和使用了,接下来看第二部分接入
第二部分
1.建立新项目,或者说是你已经存在的项目
2.根目录的build.grandle配置:
3.在grandle.propertis 配置:
TINKER_VERSION=1.7.11
4.配置app 里面的build.grandle,(将tinker - sample -android里面app下的build.grandlle复制过来即可)
注意loader
这一项非常重要,它定义了哪些类在加载补丁包的时候会用到。这些类是通过Tinker无法修改的类,也是一定要放在main dex的类。这里需要定义的类有:
(4.1) 你自己定义的Application类;
(4.2)Tinker库中用于加载补丁包的部分类,即com.tencent.tinker.loader.*;
(4.3)如果你自定义了TinkerLoader,需要将它以及它引用的所有类也加入loader中;
(4.4) 其他一些你不希望被更改的类,例如Sample中的BaseBuildInfo类。这里需要注意的是,这些类的直接引用类也需要加入到loader中。或者你需要将这个类变成非preverify。
(4.5) 使用1.7.6版本之后版本,参数1、2会自动填写
5.配置TinkerId,和之前的一样!可以写死(不建议),可以git联合,参考前面git配置TinkerId
6.将tinker - sample -android里面除了MainActivity 以外(因为这里主要是来加载补丁,你可以用你自己的代码去写,只是用到了api,稍后再说)剩下的部分复制到自己的项目当中:
7.application的修改:
在SampleApplicationLike当中:有一个注解指定了真正的application,这里你可以改成你要生成的application,(注意这个是自动生成的,如果说你项目里面已经有了自己的application的话,记得名字不要一样,可以让你自己的application集成这个自动生成的application)
然后在menifest中指定成这个application,像我自己有一个写好的BaseApplication,那么直接继承这个MyApplication即可,然后在menifest中指定name 是BaseApplication就行了
8.运行,和之前的一样
9.比如说修改你项目中的某个部分,然后进行修改app中的build.grandle中的oldapk的位置,然后tinkerPathDebug(和之前一样啦!)将生成的apk push到手机当中,
10 在适当的时候,也就是说你想加载补丁apk的位置添加下面的代码:
//加载修复的差异包
loadPatchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/patch_signed_7zip.apk");
}
});
//清除包
cleanPatchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Tinker.with(getApplicationContext()).cleanPatch();
}
});
现实应用的时候,修复包是通过后台下载的,然后用户锁屏的时候开始合并(也就是说加载补丁包)