老大让我把项目里的AndFix改为Tinker,遇到各种问题,网上的文章大同小异不清不楚,折腾了好几天好不容易搞出来了,来为跟我一样的菜鸟们指点迷津。
Tinker的接入主要有两种方式,一种是Tinker推荐使用的gradle接入,一种是命令行的接入。
一. gradle接入
1.project目录下gradle添加
buildscript {
dependencies {
classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.11')
}
}
module目录下gradle添加
dependencies {
provided('com.tencent.tinker:tinker-android-anno:1.7.11')
compile('com.tencent.tinker:tinker-android-lib:1.7.11')
}
apply plugin: 'com.tencent.tinker.patch'
2. 改造Application,有两种方式
a. 把项目原来的Application的父类改为继承DefaultApplicationLike,再加上注解
public class MyApplication extends DefaultApplicationLike {
@DefaultLifeCycle(
application = "tinker.sample.android.app.SampleApplication", //application name to generate
flags = ShareConstants.TINKER_ENABLE_ALL) //tinkerFlags above
public class MyApplication extends DefaultApplicationLike
b. 也可以将项目原来的Application的父类改为继承TinkerApplication,然后将原来Application的所有代码移动到新建的ApplicationLike类中,再在继承了TinkerApplication的原来的Application类中加上注解
public class MyApplication extends TinkerApplication {
public SampleApplication() {
super(
ShareConstants.TINKER_ENABLE_ALL,
"tinker.sample.android.app.SampleApplicationLike");
}
}
划重点,无论哪种方式,都可以在ApplicationLike的子类中通过getApplication()方法获取项目的Application!!!
3.写个点击去启动加载补丁事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk");
}
});
4. 将Tinker官方Demo的 build.gradle的配置根据你的需要一一加到你的项目里面,这里有两个需要注意的地方,第一,AndroidManifest里面的Application名和你自己build.gradle
里面loader属性里面的Application都要改为目前的Application名,第二,如果没有使用git,会报找不到tinkerId错误,可以考虑改为项目的版本号。
5.通过gradle assemble debug/release打包。
在build/bakApk目录下生成apk,mapping和R三个文件,将三个文件的文件名一一对应填入gradle中的对应位置。
再执行tinkerPathDebug/tinkerPathRelease,在build/outputs/tinkerPath目录下生成的_7zip.apk即为补丁文件,放到手机对应的位置,重新打开app。
感觉搞完真的不容易,罗里吧嗦的步骤,最麻烦的是配置gradle的部分,如果项目中原先的gradle是比较复杂的打包方式,改动起来更加繁琐,对于这种情况,可以采用命令行的接入的形式。
二、命令行接入
1.module目录下gradle添加
dependencies {
provided('com.tencent.tinker:tinker-android-anno:1.7.11')
compile('com.tencent.tinker:tinker-android-lib:1.7.11')
}
2.3步与上述gradle接入步骤相同
4.在AndroidManifest中加入以下配置,value可以使用项目的版本号
5.将 tinker-patch-cli通过gradle的buildTinkerSdk打成jar。
将tinker-patch-cli目录下的tool_output文件夹中copy到自己的项目目录下,并将jar包也复制到该文件夹下,这里的release.keystore可以替换成自己项目的key。
6.修改tinker_config.xml里面的以下两项为自己项目的Application和key。
7.将tinker_proguard.pro的混淆规则全部copy到自己的项目的混淆规则中,将其中的Application改为自己项目的Application。
8.通过Build/Genernate Signed APK打包出有BUG的apk命名为old.apk,将生成的mapping文件复制到你项目中与proguard-rules.pro同一目录下,在proguard-rules.pro中加上
-applymapping mapping.txt
确保后续打包和线上的包使用同一个mapping文件。
将old.apk移动到tool_output目录下。
9.修复BUG,通过Build/Genernate Signed APK打包apk命名为new.apk,将new.apk移动到tool_output目录下。
10.在tool_output目录下打开命令行,执行
java -jar tinker-patch-cli-1.7.11.jar -old old.apk -new new.apk -config tinker_config.xml -out output
如果成功生成补丁,目录如下图所示
注意,如果你的项目为了解决65535问题而使用了multidex,那么很有可能在生成补丁过程中遇到以下问题