Android HotFix

热修复流派

  • Native: 利用JNI改变调用方法的入口
  • Java:多dex打包,补丁dex插入前面
    • Qzone: 差量dex
    • Tinker: 全量dex(dexdiff算法本地合成)

ClassLoader

  • 加载Java代码到虚拟机
  • 双亲委派模式找出Java类:先托管给父类查找,如果父类查找不到再自己查找,如此递归。
  • Android平台下提供特定的DexClassLoader,会按顺序在dex数组中查找类,如果找到会忽略后面的相同类。

Android编译方式

  • JIT 及时编译:安装快,运行时速度会变慢
  • AOT Ahead of time:安装包变大,安装时间变长,运行速度变快
  • 混合编译:上述方式的综合

Android虚拟机发展

  • Dalvik:~Android4.0
  • ART: Android5.0~
  • ART beta: Android4.0
  • ART: Android Run Time代替Dalvik的新虚拟机

编译方式与版本对应关系

  • JIT:Dalvik虚拟机 ~Android4.0
  • AOT:ART虚拟机 Android5.0~Android6.0
  • 混合编译:Android7.0~

插桩CLASS_ISPREVERIFED

  • 优化dex -> odex,为了提升加载速度
  • 满足条件的类会被打桩CLASS_ISPREVERIFED标记,不再引入其他dex文件的代码
  • 被打桩的类引用热修复的类时会报错
  • 打桩是为了优化Java代码的装载速度,当A类被标记,引用的B类不在原理的dex文件而在补丁dex文件中时,会报错