APK加壳与脱壳学习一
类ClassLoader讲解
1
2
3
4
5
6JVM的类加载器包括三种
1) BootStrap ClassLoader (引导类加载器) C/C++代码实现的加载器,加载指定的JDK的核心类库,比如java.lang、java.uti.。JAVA虚拟机的启动都是通过Bootstrap,该ClassLoader在java里无法获取,负责加载/lib下的类
2)Extensions ClassLoader(拓展类加载器) JAVA实现类为ExtClassLoader,提供除了系统类之外的额外功能,可以在java里获取,负责加载/lib/ext下的类
3)Application ClassLoader
JAVA中实现类为AppClassLoader,开发人员开发的代码就是由它来加载,ClassLoader.getSystemClassLoader返回的就是这个类加载器。自定义类加载器,通过继承java.lang.ClassLoader类的方式来实现自己的类加载器
双亲委派
Bootstrap ClassLoader
|
Extension ClassLoader
|
Application ClassLoader
|
Custom ClassLoader 自定义
先Bootstrap ClassLoader加载核心类库,从上向下的顺序。
双亲委派模式(了解)
什么事情先给祖先去完成,如果祖先完不成,再交给儿子完成,
为什么要有双亲委派:
A. 避免重复加载,如果已经加载过一次class, 可以直接读取已经加载的Class
B. 更加安全,无法自定义类来替代系统的类,可以防止核心APi库备随意更改
类加载的时机:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15隐式加载:
```
创建类的实例
访问类的静态变量
调用类的静态方法
使用发射方式来强制创建某个类或接口的java.lang.Class对象
初始化某个类的子类
```
显示加载:
LoadClass()
forName()类加载步骤:
1
2
3
4
5
6
7装载 查找和导入Class文件
链接
a 检查 class文件数据的正确性
b 准备 给类的静态变量分配存储空间
c 解析 将符号引用转成直接引用
初始化 调用<clinit>函数,对静态变量,静态代码块执行初始化工作Android ClassLoader的继承关系
http://liuwangshu.cn/application/classloader/2-android-classloader.html
ClassLoader
BootClassLoader BaseDexClassLoader
PathClassLoader DexClassLoader InMemoryClassLoader
四大组件是由PathClassLoader来加载的
四大组件:Activity Service Content provider Broadcast
例子:
插件开发,通过ClassLoader来加载dex文件,DexClassLoader来加载放在sdcard目录下的dex