热修复技术基础知识

一、class文件

  • 能够被JVM识别的一种文件格式
  • javac 将.java文件编译成.class文件;java 运行.class文件
  • 记录一个类的所有信息,信息远远超过java源代码
  • 一种8位字节的二进制流文件;各个数据按顺序紧密的排列,无间隙;每个类或接口都单独占据一个class文件
  • 弊端:内存占用大,不适合移动端;堆栈的加栈模式,加载速度慢;文件IO操作多,类查找慢

二、dex文件

  • 能够被DVM识别,加载并执行的文件格式
  • dx --dex --output Hello.dex Hello.class //生成.dex文件
  • dalvikvm -cp /sdcard/Hello.dex Hello //运行Hello.dex文件中的Hello类
  • 记录整个工程中所有类文件的信息,记住的是整个工程
  • 一种8位字节的二进制流文件;各个数据按顺序紧密的排列,无间隙;整个应用中所有Java源文件都放在一个dex中
  • dex文件结构由文件头(header)、索引区(string_ids,type_ids,proto_ids,field_ids,method_ids)、数据区(class_defs,data,link_data)组成

三、class文件与dex文件的异同

  • 本质上他们都是一样的,dex是从class文件演变而来
  • class文件存在许多冗余信息,dex会去除冗余并整合
  • .jar文件中会有多个.class文件,每一个class文件中均包含了各种文件结构;而.apk文件中只有一个dex文件,用来记录整个项目中类的信息

四、Java类加载

  • Bootstrap ClassLoader:加载JRE\lib\rt.jar或者-Xbootclasspath选项执行的Jar包
  • Extension ClassLoader:Load JRE\lib\ext*.jar或者Djava.ext.dirs指定目录下的jar包
  • App ClassLoader:Load CLASSPATH或者DJava.class.path所指定的目录下的类和Jar包
  • Custom ClassLoader:通过java.lang.ClassLoader的子类自定义加载class
  • 当java源文件被加载成class字节码文件后,就会通过类加载器把class字节码文件加载进去,加载过程如下:
    • loading:类的信息从文件中获取并且载入到JVM的内存中
    • Verifying:检查读入的结构是否符合JVM规范的描述
    • Preparing:分配一个结构来存储类信息
    • Resolving:把这个类的常量池中的所有的符号引用改变成直接引用
    • Initalizing:执行静态初始化程序,把静态变量初始化成指定的值

五、JVM内存

  • Java栈区

    • 作用:它存放的是Java方法执行时的所有的数据
    • 组成:由栈帧组成,一个栈帧代表一个方法的执行
  • Java栈帧

    • 每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
    • 局部变量表、栈操作数、动态链接、方法出口
  • 本地方法栈

    • 作用:本地方法栈时专门位native方法服务的
  • 方法区

    • 存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据
  • 程序计数器

六、垃圾回收

  • 引用计数算法(jdk1.2之前):每当一个对象被创建的时候,就会为该对象创建一个引用计数器,并且值+1,每当有新对象引用到此对象的时候,计数器累计+1,而当其中一个引用销毁的时候计数器就会-1,当此对象的计数器值为0时,jvm就会对其进行回收
    • 缺陷:如果两个对象互相引用,那么这两个对象互相的引用计数器至少为1,那么是不会被回收的
  • 可达性算法(根搜索算法):把所有引用关系看作一张图,从GC root结点开始遍历,如果某一个结点路径不可达,即脱离结点,则该结点会被回收
  • 标记清除算法:首先第一次从根节点开始遍历引用,遍历完之后标记那些没有被引用的结点,等待第二次扫描器扫描整个空间的时候,清除那些没有被引用的结点
    • 缺陷:每次清除不存活对象会产生内存碎片
  • 复制算法:从根节点开始遍历,如果发现对象可达,即把对象复制到另一块区域,不可达则跳过,等所有复制全处理完之后直接把之前的那块内存清空
    • 优点:当存储的对象较少时,效率很高
    • 缺点:会申请额外空间对对象进行复制
  • 标记-整理算法:从根节点开始遍历,标记不可达(不存活)的结点,然后清除被标记的不可达对象,最后将可达对象向空闲区域移动

七、Dalvik VM

  • 执行的文件不同,一个是class,一个是dex
  • 类加载的系统与JVM区别较大
  • 可以同时存在多个DVM(某一个虚拟机挂掉之后不会影响其他程序)
  • Dalvik是基于寄存器的,而JVM是基于栈的

八、ART

  • DVM使用JIT来将字节码转换成机器码,效率低,即每次运行程序就编译一次
  • ART采用了AOT预编译技术,执行速度更快,即在安装程序的时候就将字节码转换成相应的机器码,但这样会导致程序安装时间长,程序占用存储空间大(以空间换时间的思想)

九、Android类加载

  • BootClassLoader:主要加载Android framework中的字节码文件
  • PathClassloader:加载已经安装到系统中的apk文件中的字节码文件
  • DexClassLoader:加载指定目录中的字节码文件
  • BaseDexClassLoader:PathClassLoader和DexClassLoader的父类
    1、特点及作用
  • 双亲代理模型的特点:类加载前,当前类的加载器首先判断自己有没有加载过这个类,没有的话判断其父加载器有没有加载过这个类,加载过则返回,否则以此类推,当没有加载器加载过这个类的时候,那么子类直接加载
  • 类加载的共享功能
  • 类加载的隔离功能

注:同一个类=相同类名+相同包名+同一个类加载器加载的

2、Android类加载流程
3、Android动态加载难点

  • 有许多上下文环境需要注册才能使用
  • 资源的动态加载很复杂
  • 其实总体来说就是Android程序运行需要一个上下文环境
发布了110 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40833790/article/details/102646862
今日推荐