首页 > 解决方案 > 使用 javassist 注入代码时 Android 运行时崩溃

问题描述

我写了一个插件和cutom一个Transform,使用javassist插入代码,编译成功,但是应用程序崩溃了,

下面是我的代码

val onResume = clazz.getDeclaredMethod("onResume")
onResume.insertAfter("com.bingliu.demo.gerrit.utils.Logger.printInfo(\"onResume called\");")

这是崩溃日志

2020-08-05 17:31:25.663 32579-32579/com.bingliu.demo.gerrit D/AndroidRuntime: Shutting down VM
2020-08-05 17:31:25.673 32579-32579/com.bingliu.demo.gerrit E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bingliu.demo.gerrit, PID: 32579
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/bingliu/demo/gerrit/utils/Logger;
        at com.bingliu.demo.gerrit.MainActivity.onResume(MainActivity.kt:24)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
        at android.app.Activity.performResume(Activity.java:7305)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3777)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3817)
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.bingliu.demo.gerrit.utils.Logger" on path: DexPathList[[zip file "/system/framework/com.google.android.wearable.jar", zip file "/data/app/com.bingliu.demo.gerrit-9Hd8Mg1Nxp1QtE6jwM3iOg==/base.apk"],nativeLibraryDirectories=[/data/app/com.bingliu.demo.gerrit-9Hd8Mg1Nxp1QtE6jwM3iOg==/lib/arm, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.bingliu.demo.gerrit.MainActivity.onResume(MainActivity.kt:24) 
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412) 
        at android.app.Activity.performResume(Activity.java:7305) 
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3777) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3817) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6680) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

摇篮代码

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation gradleApi()
    implementation 'com.android.tools.build:gradle:4.0.1'
    implementation 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72'
    implementation 'org.javassist:javassist:3.26.0-GA'
}

标签: androidandroid-gradle-pluginjavassist

解决方案


我喜欢这个错误,因为没有为 Logger.class 调用 CtClass#writeFile(String directoryName)


推荐阅读