对于原有app集成tinker,仍是比较简单的,根据tinker上的wiki的指示操做便可。
具体步骤以下:java
buildscript {
dependencies {
classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.7.9'
}
}复制代码
dependencies {
//可选,用于生成application类
provided 'com.tencent.tinker:tinker-android-anno:1.7.9'
//tinker的核心库
compile 'com.tencent.tinker:tinker-android-lib:1.7.9'
}
...
...
//apply tinker插件
apply plugin: 'com.tencent.tinker.patch'复制代码
dexOptions {
jumboMode = true
}复制代码
tinker的最佳实践,防止因为字符串增多致使force-jumbol,致使更多的变动最后能够把tinker相关的代码挪动到tinkerpatch.gradle中android
改造SampleApplication,经过SampleApplicationLike代理SampleApplication的行为。具体能够看wiki和SampleApplication相关的改动能够参考 TinkerDemogit
从1.7.8开始,tinker又支持加固了,只须要修改tinkerpatch.gradle中的这部分github
buildConfig {
applyMapping = getApplyMappingPath()
applyResourceMapping = getApplyResourceMappingPath()
tinkerId = getTinkerIdValue()
keepDexApply = false
isProtectedApp = true //开启加固
}复制代码
patchsdk 使用的是 github.com/baidao/tink…步骤以下api
repositories {
jcenter()
}
dependencies {
...
compile 'com.dx168.patchsdk:patchsdk:1.1.3'
}复制代码
使用ApplicationLike代理原来的Applicationbash
@SuppressWarnings("unused")
@DefaultLifeCycle(application = "com.dx168.patchsdk.sample.MyApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = false)
public class MyApplicationLike extends TinkerApplicationLike {
public MyApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
@Override
public void onCreate() {
super.onCreate();
String appId = "20170112162040035-6936";
String appSecret = "d978d00c0c1344959afa9d0a39d7dab3";
PatchManager.getInstance().init(getApplication(), "http://xxx.xxx.xxx/hotfix-apis/", appId, appSecret, new ActualPatchManager() {
@Override
public void cleanPatch(Context context) {
TinkerInstaller.cleanPatch(context);
}
@Override
public void patch(Context context, String patchPath) {
TinkerInstaller.onReceiveUpgradePatch(context, patchPath);
}
});
PatchManager.getInstance().register(new Listener() {
...
});
PatchManager.getInstance().setTag("your tag");
PatchManager.getInstance().setChannel("");
PatchManager.getInstance().queryAndPatch();
}
}复制代码
对于渠道包,若是不是须要使用热修复,那么怎么生成渠道包均可以的。
对于flavor编译渠道包,会致使不一样的渠道包因为BuildConfig变化致使classes.dex差别,这种方案是不可取的。
将渠道信息写在apk文件的zip comment中,是很是推荐的,例如可使用项目packer-ng-plugin或者可以使用V2 Scheme的walle, 也包括最新出来的多渠道打包神器ApkChannelPackage,说一下区别,若是要使用热修复的话,对于不须要加固的app,那么生成渠道包,这三种方案均可以采用;对于要加固的app,只能采用ApkChannelPackage这种方案中的根据已有APK生成渠道包(若是有其余的方案,请记得告诉我)。这篇文章对多渠道打包工具对比作了详细的区分。目前采用的也是ApkChannelPackage方案。微信
以TinkerDemo为例app
根据生成补丁的若干步骤,来测试补丁包是否有效,在第三步生成渠道包后,安装其中的一个渠道apk到手机上,而后呢,我这边是经过补丁管理后台上传的补丁,而后客户端pull补丁,根据log,能够清晰的看到补丁是否下载完成,是否有效。下载完补丁后,会进行dex合成。而后在后台或者屏幕关闭后app会被杀死,重启后补丁才会生效,这个时候咱们才真正修复了问题。ide
博客地址:工具
若是你以为此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部