运行Androidapp(运行进程文件机器码转换)「运行android程序」

运行Androidapp(运行进程文件机器码转换)

一、虚拟机流程Android App的运行首先要从虚拟机说起。
从Android4.4开始,谷歌在原有以Dalvik虚拟机方式运行App的基础上,新增了ART模式。
两者的优缺点在于:1、Dalvik模式下,App每次运行都需要通过即时编译器将dex文件字节码转换为机器码(转换加运行),虽然会加快安装过程,但是会拖慢每次启动运行的效率。
2、ART模式下,App在第一次安装的时候,就会进行预编译,将字节码编译成机器码,机器码保存了下来。
这样会使设备和app的安装与首次变慢,但后续每次启动运行都省去了转换机器码的工作,提高了运行效率。
下面来看一下JVM、Dalvik、ART虚拟机的整体流程如下图所示。
虚拟机整体流程二、ART模式下app运行过程下面着重介绍一下ART模式下app运行的一般过程:Zygote进程是Android系统的第一个进程,用来孵化和启动其他app。
但是Zygote其实是一个不完整的Android程序进程,虽然它的内存空间包含了app所需要的所有核心库文件,但它并不具有特定app代码。
Zygote进程通过调用系统fork()函数来快速创建自身的副本进程。
之所以通过Zygote进程复制新的进程是因为其比从主系统文件中加载新进程要快得多。
也就是说,通过Zygote复制可以使app的启动速度更快。
Zygote复制进程新的app进程生成后,就需要加载属于本app的程序代码,这些程序代码就存储在apk文件包的classes.dex文件中。
在ART模式下,通过dex2oat命令将dex文件中的字节码转为本地oat格式文件。
oat格式文件是一种Android系统自带的elf文件格式,不仅包含dex文件内容,而且还包含有dex转换的机器指令。
因此系统在app每次运行时不需要每次重新转换机器指令,用oat文件中已经转好的机器指令直接运行app。
将dex字节码转换为oat格式文件转换后的oat文件存储在操作系统的/data/dalvik-cache目录下。
形式如下:/data/dalvik-cache/arm/data/data@App@com.demo.test-1@test.apk@classes.dex该路径包含包名,不与其他app隔离开。
还包含cup架构,转换后的机器代码与cpu架构是相关的。
系统将oat文件和相关库文件加载到内存,并且直接映射到app进程的内存区域,app的初始化从这里开始。
app初始化

联系我们

在线咨询:点击这里给我发消息