android - 使用 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'
}
解决方案
我喜欢这个错误,因为没有为 Logger.class 调用 CtClass#writeFile(String directoryName)
推荐阅读
- node.js - 我想创建不和谐的自动提醒机器人,但是如果用户同时在自动提醒列表中写入 2 条消息,则只会出现 1 条自动提醒
- cakephp - 调用未定义的方法 Utils\Model\Behavior\WhoDidItBehavior::getConfig()
- python-3.x - 我尝试制作图形计算器但收到此错误
- api - 我是一名 Python 新手,尝试使用 Open Weather 的免费 API,但收到 {'cod': '404', 'message': 'Internal error'}。我怎样才能解决这个问题?
- node.js - 带有编译和 nodemon 问题的 Typescript npm 脚本
- siebel - 在 siebel 中自定义小程序标题
- flutter - 如何在 FLutter 中使用 pushNamed 将数据从一个屏幕传递到另一个屏幕?
- c - C (K&R) 中关于 getchar 和 putchar 的问题
- apache-kafka - 未设置 Logstash Kafka 配置`ssl_keystore_location`
- tensorflow - Tensorflow 数据集 - 什么是 pandas dataframe.info 等价物?