Android

Android热修复3、ClassLoader原理讲解

2021-03-28  本文已影响0人  flynnny

Android热修复1、class文件与dex文件解析https://www.jianshu.com/p/dea6a368944d
Android热修复2、虚拟机深入讲解https://www.jianshu.com/p/17f7843e09bc
Android热修复3、ClassLoader原理讲解https://www.jianshu.com/p/e3970180a002
Android热修复4、热修复简单讲解https://www.jianshu.com/p/1691685aeedf
Android热修复5、AndFix详解https://www.jianshu.com/p/1cfad3d1079a
Android热修复6、Tinker详解及两种方式接入https://www.jianshu.com/p/0ae5c0c259d1
Android热修复7、引入热修复后代码及版本管理https://www.jianshu.com/p/cd5104a6205c

java中的ClassLoader回顾

12.png

Bootstrap ClassLoader和Extension ClassLoader是加载jdk特定jar包的。
App ClassLoad加载应用程序的,是应用程序真正用到的加载器。
Custom ClassLoad 我们自定义加载的ClassLoad。

13.png

Loading:从类文件中获取类的信息并且加载到JVM的内存里;
Verifying:检查读入的结构是否符合JVM规范的描述
Preparing:分配一个结构来存储累的信息
Resolving:把这个类的常量池中的所有的符号引用变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值

*这部分和Android基本一样

Android中的ClassLoader作用详解

Android中的ClassLoader的种类

.BootClassLoader:和Java中Bootstrap ClassLoader基本一样,主要加载framework的class;

.PathClassLoader:和App ClassLoad基本类似,加载已经安装到系统中的apk文件中的class文件;

.DexClassLoader:和Custom ClassLoad 基本一样,用来加载指定目录的class文件;

BaseDexClassLoader:是PathClassLoader、DexClassLoader的父类。

*一个app至少需要几个classloader才能运行呢?
答:至少要BootClassLoader和PathClassLoader
验证:

16.png 17.png

Android中的ClassLoader的特点

特点及作用:双亲代理模式来加载字节码
双亲代理模式:
classloader在加载一个字节码时首先询问当前classloader是否加载过此类,已经加载直接返回,没有则查询parents,已经加载直接返回parents的字节码文件,整个路径上都没有加载过才由自己加载;

带来的功能:
.类加载的共享功能:一旦被顶层加载过,用时都不需要被重新加载了;
.类加载的隔离功能:不同继承路线上的classloader加载的类肯定不是同一个类,用户定义的不会影响(比如string类被系统加载好了,自己定义的不能影响系统)

两个类是同一个类:包名相同、类名相同、被同一个classloader加载

Android中的ClassLoader的源码讲解

最核心方法loadclass

18.png

进入findClass()查看具体是如何查找的:

19.png

是一个空实现,没有任何行为,要交给子类去实现,就可以实现不同查找行为。
Classloder的子类有:PathClassLoader和DexClassLoader

20.png

这部分代码源码中是不可阅读的,去源码网站查看。
首先看DexClassLoader:

21.png

PathClassLoader:

22.png

他们真正的行为都是在父类BaseDexClassLoader完成的。

Android中的动态加载比一般java中的复杂在哪里

.有许多组件类需要注册才能使用
.资源的动态加载很复杂(resource中)
.Android程序运行需要一个上下文环境(最核心难点),核心要解决的问题。

上一篇下一篇

猜你喜欢

热点阅读