ClassLoader

APK加壳与脱壳学习一

  1. 类ClassLoader讲解

    1
    2
    3
    4
    5
    6
    JVM的类加载器包括三种
    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返回的就是这个类加载器。

  2. 自定义类加载器,通过继承java.lang.ClassLoader类的方式来实现自己的类加载器

  3. 双亲委派

    Bootstrap ClassLoader

    ​ |

    Extension ClassLoader
    

    ​ |

     Application ClassLoader
    

    ​ |

    Custom ClassLoader 自定义

    先Bootstrap ClassLoader加载核心类库,从上向下的顺序。

    1. 双亲委派模式(了解)

      什么事情先给祖先去完成,如果祖先完不成,再交给儿子完成,

      为什么要有双亲委派:

      A. 避免重复加载,如果已经加载过一次class, 可以直接读取已经加载的Class

      B. 更加安全,无法自定义类来替代系统的类,可以防止核心APi库备随意更改

    2. 类加载的时机:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      隐式加载:

      ​```
      创建类的实例
      访问类的静态变量
      调用类的静态方法
      使用发射方式来强制创建某个类或接口的java.lang.Class对象
      初始化某个类的子类

      ​```
      显示加载:

      LoadClass()

      forName()
      1. 类加载步骤:

        1
        2
        3
        4
        5
        6
        7
        装载 查找和导入Class文件
        链接
        a 检查 class文件数据的正确性
        b 准备 给类的静态变量分配存储空间
        c 解析 将符号引用转成直接引用
        初始化 调用<clinit>函数,对静态变量,静态代码块执行初始化工作

      2. 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

    3. https://luyanan.com/news/info/20370901287043.html