天天看点

Tinker热修复,配置时的坑

首先,配置时我参考的是这一篇: 微信热修复Tinker使用

和链接中文章中不同的是【我踩过的坑】以下几点:

  1. 配置app.gradle 时,需要tinker库依赖,还需要:
    compile “com.android.support:multidex:1.0.1”
  2. app.gradle 中的 default config 添加:

    multiDexEnabled true

    ,同时添加:

    dexOptions {

    javaMaxHeapSize “2g”

    preDexLibraries = false

    jumboMode=true

  3. app.gradle 中的

    ignoreWarning=false

    ,置为

    ignoreWarning=true

    我第一次编译 tinkerPatchDebug 时耗费四五个小时,还不行,出现了“远程主机强制关闭了一个现有连接…”。后来把这个参数改了,就很顺利了。官方解释如下:
    Tinker热修复,配置时的坑
  4. 继承自

    DefaultApplicationLike

    的类,根本不是Application类型,能使用的生命周期只有

    onCreate()

    ,如果需要使用Application,仍需在方法中添加:
    Application app=getApplication()

大概的一个流程,【好麻烦,千万别弄错了】

第一步:运行到手机上,然后取出 build/apk/下的包,放置到配置文件中,

oldApk

所指定的位置,作为基准包

第二步:进行代码的修改

第三步:运行右侧

Gradule

里的

app/Tasks/tinker/tinkerPatchDebug

第四步:编译成功后,取出

build/outputs/tinkerPatch/debug/patch_signed_7zip.apk

,即是生成的差异补丁包。将补丁包放入手机中指定的位置。

注意事项:

1. 程序运行如果无误的话,会在第一次运行时加载补丁包,第二/三/四次运行时会显示修改后的程序。同时,放入手机中的补丁包会自动删除。【这才代表找到补丁,并且加载补丁成功】

2. 假设基准包是A,打了补丁a成功后,还想打第二个补丁,就必须将修改后的代码(即补丁a想要修复的代码)重新作为基准包B,生成第二个补丁b。

如果,仍将A作为基准包,则生成的第二个补丁b,已经打了第一个补丁的程序将无法加载补丁b。

Tinker修复成功的概率很高,也不是100%,所以关于如何打补丁,如何部署补丁,还需要公司内部权衡。

3. 生成的补丁包以

.apk

结尾,但发布时最好不使用这个后缀,

以防被运营商挟持

,Tinker支持任意后缀名。

这些是我收集的关于Tinker资料的参考链接:

原理:微信 Tinker 负责人张绍文关于 Android 热修复直播分享记录

源码解释:Android 热修复方案Tinker

接入:微信热修复Tinker使用

官方接入指南:Tinker 接入指南