Tinker: 红米2A Android4.4.4安装debug包打开app crash

Created on 27 May 2017  ·  5Comments  ·  Source: Tencent/tinker

异常类型:app运行时异常

手机型号:Xiaomi HM 2A

手机系统版本:Android4.4.4

tinker版本: 1.7.11

gradle版本: 3.4.1

是否使用热更新SDK: Patch SDK

系统:如:Mac

堆栈/日志:

05-27 18:40:39.072 10693-10693/com.pintec.dumiao E/Tinker.UncaughtHandler: catch exception when loading tinker:java.lang.RuntimeException: Unable to instantiate application com.pintec.dumiao.app.DumiaoApplication: com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:createDelegate failed
                                                                               at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4427)
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:147)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:136)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5135)
                                                                               at java.lang.reflect.Method.invokeNative(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:515)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
                                                                               at dalvik.system.NativeStart.main(Native Method)
                                                                            Caused by: com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:createDelegate failed
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.createDelegate(TinkerApplication.java:112)
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.ensureDelegate(TinkerApplication.java:118)
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.onBaseContextAttached(TinkerApplication.java:131)
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.attachBaseContext(TinkerApplication.java:146)
                                                                               at android.app.Application.attach(Application.java:185)
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:991)
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:975)
                                                                               at android.app.LoadedApk.makeApplication(LoadedApk.java:504)
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4427) 
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:147) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:136) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5135) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) 
                                                                               at dalvik.system.NativeStart.main(Native Method) 
                                                                            Caused by: java.lang.ClassNotFoundException: com.pintec.dumiao.app.DumiaoApplicationLike
                                                                               at java.lang.Class.classForName(Native Method)
                                                                               at java.lang.Class.forName(Class.java:251)
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.createDelegate(TinkerApplication.java:106)
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.ensureDelegate(TinkerApplication.java:118) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.onBaseContextAttached(TinkerApplication.java:131) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.attachBaseContext(TinkerApplication.java:146) 
                                                                               at android.app.Application.attach(Application.java:185) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:991) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:975) 
                                                                               at android.app.LoadedApk.makeApplication(LoadedApk.java:504) 
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4427) 
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:147) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:136) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5135) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) 
                                                                               at dalvik.system.NativeStart.main(Native Method) 
                                                                            Caused by: java.lang.NoClassDefFoundError: com/pintec/dumiao/app/DumiaoApplicationLike
                                                                               at java.lang.Class.classForName(Native Method) 
                                                                               at java.lang.Class.forName(Class.java:251) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.createDelegate(TinkerApplication.java:106) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.ensureDelegate(TinkerApplication.java:118) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.onBaseContextAttached(TinkerApplication.java:131) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.attachBaseContext(TinkerApplication.java:146) 
                                                                               at android.app.Application.attach(Application.java:185) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:991) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:975) 
                                                                               at android.app.LoadedApk.makeApplication(LoadedApk.java:504) 
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4427) 
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:147) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:136) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5135) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) 
                                                                               at dalvik.system.NativeStart.main(Native Method) 
                                                                            Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pintec.dumiao.app.DumiaoApplicationLike" on path: DexPathList[[zip file "/data/app/com.pintec.dumiao-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.pintec.dumiao-1, /vendor/lib, /system/lib]]
                                                                               at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                                               at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
                                                                               at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
                                                                               at java.lang.Class.classForName(Native Method) 
                                                                               at java.lang.Class.forName(Class.java:251) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.createDelegate(TinkerApplication.java:106) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.ensureDelegate(TinkerApplication.java:118) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.onBaseContextAttached(TinkerApplication.java:131) 
                                                                               at com.tencent.tinker.loader.app.TinkerApplication.attachBaseContext(TinkerApplication.java:146) 
                                                                               at android.app.Application.attach(Application.java:185) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:991) 
                                                                               at android.app.Instrumentation.newApplication(Instrumentation.java:975) 
                                                                               at android.app.LoadedApk.makeApplication(LoadedApk.java:504) 
                                                                               at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4427) 
                                                                               at android.app.ActivityThread.access$1500(ActivityThread.java:147) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                               at android.os.Looper.loop(Looper.java:136) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5135) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) 
                                                                               at dalvik.system.NativeStart.main(Native Method) 

是运行时异常,编译打包通过命令行方式 ./gradlew assembleDebug 安装在红米2A Android4.4.4的手机上,打开app,直接crash,以上是log信息,使用红米3 Android5.1.1的手机安装,打开app,没有任何问题

是否开启tinker编译参数 tinkerEnabled = isRelease()
isRelease()方法内的代码如下:

def isRelease() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;
    if (tskReqStr.contains("assemble")) {
        println tskReqStr
        pattern = Pattern.compile("assemble(\\w*)(Release|Debug)")
    }  else if (tskReqStr.contains("tinkerPatch")) {
        println tskReqStr
        pattern = Pattern.compile("tinkerPatch(\\w*)(Release|Debug)")
    } else {
        pattern = Pattern.compile("generate(\\w*)(Release|Debug)")
    }
    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()) {
        String task = matcher.group(0).toLowerCase()
        println("[BuildType] Current task: " + task)
        return task.contains("release")
    } else {
        println "[BuildType] NO MATCH FOUND"
        return false;
    }
}

接入方式,采用的是ApplicationLike的形式,使用注解生成Application。

使用release编译,生成apk文件,打补丁包,都是正常的,下发补丁修复app一切ok,就是不明白为啥在Android4.4.4的手机上,安装debug包有问题?

如果把 tinkerEnabled 的值修改为 tinkerEnabled = true,那么Android4.4.4安装debug版本的app也是可以正常打开的,不会crash

Most helpful comment

最终解决办法是在build.gradle文件中配置multiDexKeepProguard文件

buildTypes {
        debug {
            multiDexKeepProguard file('multidexConfig.pro')
        }
}

multidexConfig.pro文件的内容为app/build/intermediates/tinker_intermediates/tinker_multidexkeep.pro里面的内容,这样就做到了将ApplicationLike类放在main dex keep了

All 5 comments

经过测试华为 MT7-TL00 Android4.4.2安装debug包,打开app同样crash

分包问题,如果关了。需要将ApplicationLike类放在main dex keep

最终解决办法是在build.gradle文件中配置multiDexKeepProguard文件

buildTypes {
        debug {
            multiDexKeepProguard file('multidexConfig.pro')
        }
}

multidexConfig.pro文件的内容为app/build/intermediates/tinker_intermediates/tinker_multidexkeep.pro里面的内容,这样就做到了将ApplicationLike类放在main dex keep了

@xingstarx 你用的是改造application的吧,哈哈,我也是遇到了这个问题,关闭tinker之后,因为使用的是改造的原因,所以还需要keep

@vihuela 嗯,是的。

Was this page helpful?
0 / 5 - 0 ratings