简述:这篇文章仅仅介绍atlas的基本实现原理。
这是atals中bundle加载过程包括class 和 resource
第15步:
|
|
可以看到bundle.optDexFile() 点进去看看
|
|
接着点
|
|
接着点
|
|
接着点入optDexFileLocked()
|
|
RuntimeVariables.sDexLoadBooster 是DexLoadBooster() 对象,是在AtlasBridgeApplication 中初始化,在BridgeApplicationDelegate 中赋值给RuntimeVariables.sDexLoadBooster 的。
所以这段反射代码最终执行的方法是DexLoadBooster()的loadDex 方法 代码如下:
|
|
接着点
|
|
这就是Android代码加载Dex文件的代码了
现在已经将dex文件加载到内存中封装成对象了,接着查BundleClassLoader的代码,这个流程是class文件的加载过程
|
|
|
|
|
|
|
|
|
|
到这里我们的上面拿到的DexFile对象用上了,并且调用了loadClass方法
查看loadClass方法
|
|
点入:
|
|
点入:
|
|
发现这是一个native方法,到此结束
总结:Atlas 通过反射为每个Bundle创建了一个ClassLoader ,将so文件中的dex文件加载到内存中以后最终调用defineClass方法加载class文件。
附属DexFile源码:
|
|