1.双亲委托模型
请求是从父类向子类开始的
2.Android中国的ClassLoader的继承体系
参考QQ空间的热补丁技术: https://zhuanlan.zhihu.com/p/20308548?columnSlug=magilu
参考Android中的ClassLoader:http://jaeger.itscoder.com/android/2016/08/27/android-classloader.html
android官方文档:https://developer.android.com/reference/java/lang/ClassLoader.html
PathClassLoader是Android中默认的ClassLoader.
PathClassLoader: /* Provides a simple {@link ClassLoader} implementation that operates on a list of files and directories in the local file system, but does not attempt to load classes from the network. Android uses this class for its system class loader and for its application class loader(s).*/ (已安装的dex + apk)
BootClassLoader 是 PathClassLoader 的父加载器,其在系统启动时创建,在 App 启动时会将该对象传进来
在Android系统启动的时候会创建一个Boot类型的ClassLoader实例,用于加载一些系统Framework层级需要的类,我们的Android应用里也需要用到一些系统的类,所以APP启动的时候也会把这个Boot类型的ClassLoader传进来。
----
DexClassLoader: /*A class loader that loads classes from .jar and .apk filescontaining a classes.dex entry. This can be used to execute code notinstalled as part of an application.*/(参数中传入的dexPath,可以是多个,以”:“分割)
3.class对象对于ClassLoader是唯一的。加载dex时,会产生新的*.class变量。(编译期间自动加入)
4.gralde中配置生成多个dex文件。
借鉴dexknife: https://github.com/ceabie/DexKnifePlugin
gradle中拆分dex: http://www.jianshu.com/p/9b9cfb20bf7d
彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(一) http://blog.csdn.net/mynameishuangshuai/article/details/52703029
彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(二)http://blog.csdn.net/mynameishuangshuai/article/details/52716877
前提是熟悉gradle打包额详细流程;
参考QQ空间hotFix.
-----------------------------------------------------------------------------
eclipse中流程:
ant打包: http://blog.csdn.net/lisdye2/article/details/52049857
多dex分割: http://blog.csdn.net/lisdye2/article/details/52094693
动态加载: http://blog.csdn.net/lisdye2/article/details/52119602
5.dex动态加载流程:
①生成补丁包的BaseDexClassLoader类;
②获取到BaseDexClassLoader中的DexPathList字段的dexElements;
③将补丁包的dexElements和本身的dexElements合并为一个新的数组(补丁包的放在前面);
④将新合并的dexElements设置到系统的dexElements中。
6.dex安全性校验
放置于私有目录下。
md5校验。
加密。
完整流程:
dex加壳--> 下载,md5校验--->存放至私有目录解密,加载完成后删除。(加载外部dex风险浅析: http://www.tuicool.com/articles/MFJJv2b )
7.需要解决的问题
CLASS_ISPREVERIFIED:
如果某个类直接方法中引用到的类(第一层级关系,不会进行递归搜索)在同一个 dex 中的话,那么这个类就会被打上 CLASS_ISPREVERIFIED 标志。
解决方式:
打桩,对性能有一定程度的影响。
so库的动态更新问题:
http://www.androidchina.net/6176.html
没有帐号? 立即注册