美文网首页IT之家生产力程序员
tinker热修复遇到的问题

tinker热修复遇到的问题

作者: ChasenZhang | 来源:发表于2020-07-16 17:32 被阅读0次

    如果你按照官方文档一步步对接,还是遇到

    • 打补丁包报错啊!!!
    • 只改了一行代码,补丁包异常得大啊!!!
    • 补丁包打不上啊!!!
    • 就算打上了补丁也闪退啊!!!
    • 然后开始咆哮:是不是tinker有问题啊,是不是tinker兼容有问题啊,是不是tinkerbug很多啊,像我这样的天才程序员怎么可能有错,肯定是tinker有bug,哼,小拳拳锤你小胸口。

    那么这篇文章可能、大概、或许、说不定帮得到你

    我用的是bugly,跟直接用tinker其实区别不大。

    tinker-support版本  1.2.0
    tinker lib版本  1.9.14
    

    那么,开始我的表演

    Round 1

    打补丁包时报如下错误:

    Warning:ignoreWarning is false, but we found loader classes are found in old secondary dex. Found classes:xxx
    java.lang.RuntimeException: com.tencent.tinker.build.util.TinkerPatchException: 
        loader classes are found in old secondary dex. Found classes: XXX
    Caused by: com.tencent.tinker.build.util.TinkerPatchException: 
        loader classes are found in old secondary dex. Found classes: XXX
    

    说我们的 loader classes被分在了 old secondary dex,开什么国际玩笑,我明明按照文档一步步来配置的,再说了我哪知道什么鬼 loader classes,什么鬼old secondary dex。
    对tinker好感-999
    咦?注意到这句

    ignoreWarning is false
    

    说我把警告打开了,害,简单的一匹,那我立马去将他设为true忽略警告不就好了。
    一顿操作猛如虎,
    补丁包成功打出来了,然后丢到bugly,冲杯coffee靠着背椅,美滋滋。
    打开app,然后发现,咦,怎么肥事?为什么补丁打不上去,为什么打上去了又闪退了?
    MMP!我这聪明绝顶的程序员怎么可能出错,一定是tinker有bug!

    正确的姿势:将项目的minSdkVersion设置为19

    因为android官方在minSdkVersion>=21的时候改了分包逻辑,如果报了以上错误,请检查自己项目的minSdkVersion是不是>=21哦。
    具体可看 官方issue:multiDexKeepProguard won't work if minSDK >= 21

    Round 2

    ojbk,这回把minSdkVersion降到了19,应该一帆风顺了吧?
    一顿操作,打apk包,报错

    Execution failed for task ':app:transformClassesAndResourcesWithR8ForRelease'.
    

    啥?啥玩意?有完没完,这下apk包都不给我打了是吗我丢。
    一顿排查,发现该错误出现有很多种原因,我是这样解决的。
    在app的builde文件里添加这个设置

    android{
        defaultConfig{
            multiDexEnabled true
        }
    }
    

    Round 3

    再次ojbk,apk包顺利打出来了,冲杯coffee靠着背椅,美滋滋。
    一顿操作,修复bug,准备打补丁包,然后报了一个熟悉的错

    Execution failed for task ':app:transformClassesAndResourcesWithR8ForRelease'.
    

    WTF?不是解决了吗MMP。
    稍安勿躁骚年,
    查了资料,目前tinker版本对R8的支持还不太好,所以需要将R8关闭。
    在gradle.properties文件下添加

    android.enableR8 = false
    

    禁用R8。

    Round 4

    害,折腾了一早上,重新打包。
    你以为革命的道路就从此一帆风顺了?
    too young too simple。
    打包报错

    Warning: there were 26 unresolved references to classes or interfaces.
             You may need to add missing library jars or update their versions.
             If your code works fine without the missing classes, you can suppress
             the warnings with '-dontwarn' options.
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    

    emmmm,看起来像是混淆的警告问题。
    objk,在对应的混淆规则文件里添加,忽略警告就好了

    -ignorewarnings
    

    简单粗暴有效。
    哼,一个能打的都没有。

    Round 5

    重新打包,对顺利已经是一种奢求了,
    果然,打包报错

    Execution failed for task ':app:transformClassesWithDexBuilderForRelease'.
    > com.android.build.api.transform.TransformException: 
    com.android.builder.dexing.DexArchiveBuilderException: 
    com.android.builder.dexing.DexArchiveBuilderException: 
    Failed to process XXXX
    

    纳尼?这又是什么鬼,这一堆什么鬼东西完全看不懂。
    后来发现是混淆文件的问题,把下面这句注释掉就可以了

    -dontshrink
    

    Round 6

    重新打包,成功,不会吧?成功了?
    试试打补丁,咦?也成功了?不会吧?
    美滋滋。
    看到补丁包,咦??怎么那么大?我只改了1句代码啊,怎么生成了好几M的补丁啊,
    检查一下对应的混淆映射文件,看看有没有映射对。
    如果基准包使用了资源混淆andResGuard,那么可能是你对接的姿势不正确,
    附上官方tinker+andResGuard的整合sample
    如果还是不懂的朋友,下一篇文章介绍如何整合tinker+andResGurad

    Round 7

    打上补丁,咦???为什么还是打不上,为什么打上补丁了还是闪退??!!!
    那么请检查一下tinker配置的isProtectedApp属性是否为true,如果为true,那么该补丁仅用于已加固的包,所以不要混着用哦。
    附上有关isProtectedApp属性的官方说明
    另外再提一点,无论isProtectedApp是否为true,基准包都是不能加固的哦,不然补丁会打不出来或者出现问题。

    相关文章

      网友评论

        本文标题:tinker热修复遇到的问题

        本文链接:https://www.haomeiwen.com/subject/guiphktx.html