Dalvik虚拟机执行的是dex字节码,解释执行。从Android 2.2版本开始,支持在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。

ART(Android Runtime) 是在 Android 4.4 中引入的一个开发者选项,也是 Android 5.0 及更高版本的默认 Android 运行时。ART虚拟机执行的是本地机器码。Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者将自己的应用直接编译成目标机器码,APK仍然是一个包含dex字节码的文件。

那么,ART虚拟机执行的本地机器码是从哪里来?

前端编译器与后端编译器

解释执行&JIT&AOT

解释执行 : 程序运行过程中,逐行进行代码编译

JIT :程序运行过程中,将热点代码进行编译缓存执行

AOT:运行之前,将所有代码打包编译成机器码

dex2aot

Dalvik下应用在安装的过程,会执行一次优化,将dex字节码进行优化生成odex文件。

而Art下将应用的dex字节码翻译成本地机器码的最恰当AOT时机也就发生在应用安装的时候。ART 引入了预先编译机制(Ahead Of Time),在安装时,ART 使用设备自带的 dex2oat 工具来编译应用,dex中的字节码将被编译成本地机器码

Android N的运作方式

ART 使用预先 (AOT) 编译,并且从 Android N混合使用AOT编译,解释和JIT。

1、最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。

2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。

“类(文件)”的生命周期

类的生命周期概述

在JAVA中数据类型分为引用数据类型与基本数据类型,基本数据类型由虚拟机预先定义,引用数据类型则需要进行类加载。

按照JAVA虚拟机规范,从class文件到加载到内存当中的类,到类写在出内存位置,他的整个生命周期包含下述七个阶段

类的卸载

我们需要知道的是,一个我自己写的代码文件如何到内存当中被使用以及释放的过程

​ 1.写代码—.java—>前段编译器—>.class—–>通过IO读取进来—->解析文件结构,约定固定套路

​ —->将解出来的数据扔到方法区—->将当前这个类的信息提取出来—>推到堆当中生成Class对象

​ —->具体使用—>cinit—->卸载

字节码解析

类加载器

类加载:

​ 读取指定目录下面的相关字节码文件,解析文

系统类加载器/启动类加载器/根类加载器

​ 加载jre下的内容

扩展类加载器

​ 加载ext文件夹下的内容

应用程序类加载器

​ 加载自己工程当中的内容

自定义类加载器(热修复)

​ 提供自己去写类加载器的方案,自己去指定某个路径或者某个文件,只要你是符合jvm字节码规范

​ Dex—>N个Class文件—》应用程序类加载器–》不支持。自己写

​ 类加载器的分类=类加载器的种类

​ 不是继承关系,每个人都是独立的,每个人干自己不同的活,加载代码的路径不一致

​ ART != JVM

​ BootClassLoader—>DexBaseClassloader

Android的应用程序类加载器

类加载–》物理读取字节码文件的动作

​ loadClass—》双亲委派–》为了保证我找不到,其他人能够去找

​ findClass—>找一个路径,读取这个文件出来,形成一个字节码数组

​ defindClass—》将字节码文件读取完后进行校验,然后生成Class数据对象

​ defindClass结束,类加载结束—-

热修复原理

热修复原理就是类加载器的核心

热修复文章 : https://blog.csdn.net/sahadev_/article/details/53318251

本文地址: http://www.yppcat.top/2022/11/20/字节码文件与类加载/