您的位置:

AOT编译:Android系统构建的优化选择

一、AOT编译

AOT编译,全称是Ahead-Of-Time Compile,字面意思是提前编译,是与JIT(Just-In-Time Compile)相对应的一种编译方式。它是指在代码运行之前就将代码转换成机器码,并且保存到二进制文件中。当代码需要执行的时候,直接加载已经编译好的二进制文件就可以了。

相对于JIT的解析运行方式,AOT编译提高了代码的执行效率,因为减少了解析和编译的时间,提高了代码的执行速度,降低了启动时间。

在Android系统中,AOT编译是从Android 2.2版本开始引入的。在Android 5.0之前,采用的是Dalvik虚拟机作为应用程序运行环境,这个虚拟机就采用了AOT方式进行编译。而在Android 5.0之后,采用的是ART虚拟机,也是采用了AOT编译方式。

二、AOSP编译Fastboot

Android系统是以源码形式发布的,通常开发者要自己编译成可用的镜像(system.img,userdata.img,boot.img等)才能在设备上运行。Fastboot就是Android编译的一个非常重要的工具,它可以用来烧写镜像,进行Bootloader的解锁操作等。在AOSP编译过程中,快速构建一个可用的系统镜像的步骤如下:


source build/envsetup.sh         // 提供 "lunch"命令
lunch aosp_arm-eng               // 选择编译目标类型
make -j32                        // 进行编译

在进行完编译之后,可以得到一个system.img文件,这个文件就是编译出来的Android系统的核心组件。如果需要将这个文件烧写到设备上面,可以使用以下命令:


sudo fastboot flash system system.img
sudo fastboot reboot

三、AOT编译器

在Android系统中,AOT编译器是将Java编译成机器码的重要工具。在Dalvik虚拟机时代,它的实现就是dexopt程序,可以把Dalvik字节码编译成本地可执行的机器码,存储到odex文件中。在ART虚拟机时代,AOT编译的实现就是dex2oat,它可以将dex文件编译成 ELF 对象文件,保存在 oat 文件中。

在使用dex2oat编译的时候,可以指定多个参数来控制编译的结果,例如:


dex2oat --dex-file=/system/app/SystemUI/SystemUI.apk --oat-file=/system/app/SystemUI/oat/arm64/SystemUI.odex --instruction-set=arm64 --compiler-filter=quicken

--dex-file参数指定了需要编译的dex文件,--oat-file参数指定了需要输出的oat文件路径,--instruction-set参数指定了目标处理器架构,--compiler-filter参数可以指定要使用的编译器。

四、编译AOSP

编译AOSP,需要使用Repo和Git来同步源代码。Repo是Google开发的一个命令行工具,它可以用来管理多个Git仓库,使得多个库在构建时能够保持同步。其中,Android源代码本身就是由多个Git仓库组成的。以下是编译AOSP的步骤:


$ mkdir ~/my-android
$ cd ~/my-android
$ sudo apt-get install git         // 安装git
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  // 下载repo工具
$ chmod +x ~/bin/repo              // 将repo工具设置为可执行
$ git config --global user.name "Your Name"           // 设置用户名
$ git config --global user.email "you@example.com"    // 设置邮件地址
$ repo init -u https://android.googlesource.com/platform/manifest     // 下载Android源代码
$ repo sync -j8                                          // 同步源代码
$ source ./build/envsetup.sh; lunch aosp_arm-eng        // 设置环境变量,选择编译目标类型
$ make -j8                                              // 开始编译

五、AOT编译代码

在进行AOT编译时,主要是对Java代码进行编译,并且将其转换成机器码保存到二进制文件中。Java代码本身是由Class文件组成的,其中包含了Java语言的字节码和一些元数据。因此,在进行AOT编译时,需要首先进行Class文件的预处理工作,将Class文件解析成指令集,然后再将指令集编译成机器码。

通常情况下,Java代码的编译分为两个阶段:前端和后端。前端负责将Java代码转换成指令集,这个过程通常在运行时完成;后端负责将指令集转换成机器码,这个过程通常在编译时进行。

六、AOT编译模式

在Android系统中,AOT编译可以分为两种模式:启动时编译和预编译。启动时编译即在运行应用程序时,对需要执行的代码进行实时编译;而预编译即将整个应用程序在安装时就全部编译好,然后保存到OAT文件中。Android系统的ART虚拟机采用的就是预编译模式,这样可以降低应用程序的启动时间,提高系统的性能。

七、AOT编译后进一步加密

由于AOT编译产生的可执行文件通常是裸露的机器码,因此在一些需要程序加密的场合,可能需要进一步对AOT编译结果进行处理,添加补丁,以达到加密的目的。这个过程通常是通过扫描AOT编译结果并且解析出其中的代码段和数据段进行处理。

八、AOT编译安卓

在Android系统中,AOT编译是非常重要的一个环节,可以提高程序的执行效率和系统性能。对于开发者来说,了解AOT编译的原理和机制,能够更好地进行程序开发和优化工作,提高应用程序的质量和性能表现。

九、AOT编译知乎

知乎上有关AOT编译的话题评论如下:

评论1:AOT技术在APP开发中,对提高APP启动速度具有极其重要的作用,因为我们在开发APP时,从UI与设计方面下手经常带来强的效果与Experience,但效果与Experience并不能直接提升一个APP的启动速度;关于AOT技术的文章不多,但是还是希望程序猿们多学习这方面的知识,提高APP的性能。

评论2:AOT编译技术在移动应用领域的应用非常广泛,这个过程就是将高级语言代码(如Java)编译为机器语言代码,这样可以提高应用程序的运行速度,降低耗电量,提高效率。

评论3:众所周知,AOT编译在安卓系统中扮演着非常重要的角色,在应用程序的启动速度和性能优化上起到了至关重要的作用。AOT编译的方式就是在应用程序启动之前,将应用程序的代码编译成机器码,以便更快地执行。同时,AOT编译的方式也可以带来较大的安全性、稳定性和性能稳定性、有效缓解动态编译所带来的效率问题和过程中的需要的消耗问题。

AOT编译:Android系统构建的优化选择

2023-05-20
提高Android应用性能的关键:深入理解Android R

2023-05-14
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
印象笔记记录java学习(Java成长笔记)

2022-11-12
优化编译安装mysql(编译器优化是什么意思)

2022-11-09
优化Android应用性能的ABI选择

2023-05-14
mysql编译安装优化(mysql 优化配置)

2022-11-12
python课堂整理32(python笔记全)

2022-11-12
探索Android应用构建的奥秘

一、反编译Android应用 想要了解一个App的构建原理,我们可以使用反编译的方式获得源码,并深入研究其代码逻辑。反编译的过程需要使用到工具,具体步骤如下: 1、下载并安装Android Studi

2023-12-08
Tableth:将平板电脑变为生产工具的理想选择

2023-05-21
Android BuildConfig:优化您的构建配置

一、BuildConfig简介 BuildConfig是一个在Android Studio项目编译时自动生成的Java类,它包含了当前项目的许多编译时细节,包括但不限于应用的包名、版本号、是否为deb

2023-12-08
优化java编译,java系统优化

2022-11-19
提升Android构建效率:选择合适的Gradle Plug

2023-05-14
java思维导图,java思维导图知乎

2023-01-08
java学习笔记(java初学笔记)

2022-11-14
Android系统:从应用开发到系统优化

2023-05-22
关于已前的学习笔记java的信息

2022-11-18
golang笔试,go的面试题

2022-11-27
下载Android源码,准备构建你的自由与创新

一、为什么要下载Android源码 Android操作系统作为全球智能手机领域的重要操作系统,由于其开放性与广泛的应用,已经成为众多厂商的选择。但是,这也造成了一定的问题,比如安全漏洞、隐私泄露以及系

2023-12-08
java笔记,大学java笔记

2022-11-28