3.Android虚拟机和类加载机制

APK(Android Package)是Android应用程序安装包的文件格式。
它是一个压缩文件,包含了应用程序运行所需的所有资源、代码和清单文件。APK文件的扩展名是“.apk”。

具体来说,APK文件通常包含以下几个部分:

  1. AndroidManifest.xml:应用程序的清单文件,包含应用的基本信息,如包名、版本、权限请求等。
  2. classes.dex:编译后的Java字节码文件,供Android运行时(ART或Dalvik)执行。
  3. 资源文件:包括图像、布局文件、字符串资源等,通常存放在res目录下。
  4. META-INF目录:包含应用的签名文件,确保APK未被篡改。
  5. 原生库(如果有):存放使用JNI(Java Native Interface)编写的本地代码的库文件,通常位于lib目录中。

ART 和 Dalvik 虚拟机

JVM—-基于栈的虚拟机
Dalvik虚拟机—-基于寄存器的虚拟机

基于寄存器的虚拟机中没有操作数栈,但是有很多虚拟寄存器
其实和操作数栈相同,这些寄存器也存放在运行时栈中,本质上就是一个数组。
与JVM相似,在Dalvik VM中每个线程都有自己的PC和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。

与JVM版相比,可以发现Dalvik版程序的指令数明显减少了,数据移动次数也明显减少了(数据无需在操作数栈和局部变量表之间来回操作)。


ART 和 Dalvik都是基于寄存器的虚拟机

  1. Dalvik虚拟机
  • Dalvik 虚拟机执行的是dex字节码,解释执行。
    从Android 2.2版本开始,支持 JIT即时编译 (Just In Time)在程序运行过程中选择热点代码进行编译或者优化。
  1. ART虚拟机
  • ART 相当于是 Dalvik 的升级版本 ,执行的是本地机器码
  • 引入了 AOT预先编译机制 (Ahead Of Time),在安装时,ART使用设备自带的dex2oat工具来编译应用,dex中的字节码将被编译成本地机器码

Android类加载流程

Android类加载器

双亲委托机制

loadClass 与 findClass

某个类加载器在加载类时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;
只有父类加载器无法完成此加载任务或者没有父类加载器时,才自己去加载。

好处:
1、避免重复加载,当父加载器已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2、安全性考虑,防止核心API库被随意篡改。

ClassLoader加载类去使用

热修复实现原理

执行热修复 就是 插入补丁包

将.dex补丁包插入到 dexElements 数组最前面,这样

面试官问:
需要回答一个整体的过程,classLoader是怎么加载类的?
在DexPathList.java的findClass方法中是在dexElements数组中从前往后找的这个规则,就可以把补丁包插入到最前面,这样就是先找补丁包中的类了。

如何编码实现热修复?要用到什么技术?
将补丁包插入到dexElements数组中需要用到反射技术

要保证这个类没有被加载过,执行热修复才有效果(用这个类之前被修复才可以)

通过Android类加载机制的最基础的热修复实现原理

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信