其他分享
首页 > 其他分享> > Android编译器,架构和运行时,它们如何协同工作?

Android编译器,架构和运行时,它们如何协同工作?

作者:互联网

我最近正在研究Android运行时,尤其是专注于dex2oat工具.但是dex2oat不是孤立的,而是可以与Android的启动映像,android-root,指令集,runtime-arg等一起使用.

谁能解释他们的意思和用途?和他们的内部联系?

解决方法:

好的,dex2oat是新的Android Runtime(ART)的一部分.这个想法是用一个提前编译器代替Android的字节码解释器(和JIT编译器),并提供一个新的运行时来加载和执行编译的应用程序.

葡聚糖

dex2oat实用程序是一个完整的编译套件,它为Android当前运行的每个处理器平台提供了许多编译选项,多个编译器和代码生成后端.因此,如果有人在引用dex2oat,则意味着要使用Android AOT编译器(套件).它的输入格式是dex字节码,并且输出所谓的燕麦文件,它们是ELF共享对象.与解释(或JIT编译)相比,AOT编译的优点是,如果我们在应用程序之前进行更复杂的优化,则不会降低执行时间.此外,正如我们所讨论的设备上编译器一样,应用程序仍可以以dex字节码的形式提供,但会针对其具体架构在设备上进行编译.因此,据我所知,目前有用于32位和64位的ARM,MIPS和x86后端.

启动映像

在Pre-ART之前,Android使用Zygote来分叉每个应用程序进程,并预加载和预初始化一些类以进行优化.在ART上,应预加载到每个应用程序进程中的jar库集会一次编译成所谓的启动映像.它由两个文件boot.oat和boot.art组成. Boot.oat包含已编译的代码,而boot.art包含预初始化的堆等.两者均由dex2oat生成.此引导映像作为优化加载到每个应用程序的进程中.

运行环境

现在,由于应用程序已编译为燕麦文件,因此ART提供了一个新的运行时来加载和执行它们.因此,其想法是将ELF共享对象加载到预初始化的应用程序进程中并执行该应用程序.由于代码已经编译,因此无需在运行时进行解释.一些例外情况是在永久性存储空间较低(燕麦文件很大)上运行的系统,已调试的应用程序等.在这些情况下,ART可能会引起解释.但通常,编译应用程序AOT是新的默认设置.

标签:architecture,dexopt,android,android-runtime,dex2oat
来源: https://codeday.me/bug/20191120/2046895.html