}
}
说明:
-
DexClassLoader的构造函数比PathClassLoader多了一个,
optimizedDirectory
参数,这个是用来指定dex的优化产物odex的路径,在源码注释中,指出这个参数从API 26后就弃用了。 -
PathClassLoader主要用来加载系统类和应用程序的类,在ART虚拟机上可以加载未安装的apk的dex,在Dalvik则不行。
-
DexClassLoader用来加载未安装apk的dex。
Android系统通过Resource对象加载资源,因此只需要添加资源(即apk文件)所在路径到AssetManager
中,即可实现对插件资源的访问。
// 创建AssetManager对象
AssetManager assetManager = new AssetManager();
// 将apk路径添加到AssetManager中
if (assetManager.addAssetPath(apkPath) == 0) {
return null;
}
// 创建插件Resource对象
Resources pluginResources = new Resources(assetManager, metrics, getConfiguration());
说明:由于AssetManager的构造方法时hide
的,需要通过反射区创建。
组件生命周期管理
对于Android来说,并不是说类加载进来就可以使用了,很多组件都是有“生命”的;因此对于这些有血有肉的类,必须给他们注入活力,也就是所谓的组件生命周期管理
。
在解决插件中组件的生命周期,通常的做法是通过Hook
相应的系统对象,实现欺上瞒下,后面将通过Activity的插件化来进行讲解。
Activity插件化
四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之中,Activity插件化的主流实现方式是通过Hook
技术实现。
Activity的启动过程
上图列出的是启动一个Activity的主要过程,具体步骤如下:
-
Activity1调用startActivity,实际会调用
Instrumentation
类的execStartActivity
方法,Instrumentation是系统用来监控Activity运行的一个类,Activity的整个生命周期都有它的影子。 -
通过跨进程的binder调用,进入到
ActivityManagerService
(AMS)中,其内部会处理Activity栈。之后又通过跨进程调用进入到Activity2所在的进程中。 -
ApplicationThread
是一个binder对象,其运行在binder线程池中,内部包含一个H
类,该类继承于Handler。ApplicationThread将启动Activity2的信息通过H对象发送给主线程。 -
主线程拿到Act