HOOK技术三-插件Activity启动前提分析

系列文章

HOOK技术一-HOOK技术初探
HOOK技术二-未注册Activity的启动
HOOK技术三-插件Activity启动前提分析
HOOK技术四-插件中Activity启动实战
HOOK技术五-使用LoadedApk式插件化的理论分析
HOOK技术六-LoadedApk式插件化代码实现
HOOK技术七-版本适配及总结

现象

用宿主跳转插件里面的Activity 会抛异常

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.netease.plugin_package.PluginActivity" on path:
 DexPathList[[zip file "/data/app/com.netease.hookproject-1/base.apk", zip file "/data/app/com.netease.hookproject-1/split_lib_
 dependencies_apk.apk", zip file "/data/app/com.netease.hookproject-1/split_lib_slice_0_apk.apk", zip file "/data/app/com
 .netease.hookproject-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.netease.hookproject-1/split_lib_slice_2_apk.apk"
 , zip file "/data/app/com.netease.hookproject-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.netease.hookproject-1/s
 plit_lib_slice_4_apk.apk", zip file "/data/app/com.netease.hookproject-1/split_lib_slice_5_apk.apk", zip file "/data/app/com
 .netease.hookproject-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.netease.hookproject-1/split_lib_slice_7_apk.apk",
 zip file "/data/app/com.netease.hookproject-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.netease.hookproject-1/spli
 t_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

分析原因

我们从Activity的启动开始分析,费什么会报这样的错误。

Activity --> Instrumentation —> AMS检查 —>
ActivityThread (即将加载)-(handleLaunchActivity 类加载Activity performLaunchActivity —> newActivity(cl == PathClassLoader))

PathClassLoader.loadClass —> BaseDexClassLoader -->ClassLoader.loadClass–findClass(空方法) 让覆盖的子类方法去完成 -->
BaseDexClassLoader.findClass() —>pathList.findClass

最终会由BaseDexClassLoader.findClass()这个方法找到Activity的Class,如果找不到,就会抛出上面的异常。找不到的原因也很简单,BaseDexClassLoader只会在宿主应用的classes.dex文件中查找需要的Class,插件和宿主是两个apk,插件的classes.dex没有包含在宿主中,所以找不到插件中的Activity的Class。

如何解决

设想,如果将插件的classes.dex文件与宿主的classes.dex文件融为一体。那么BaseDexClassLoader就能加载到插件中的Activity了。

你可能感兴趣的:(android)