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编译的方式也可以带来较大的安全性、稳定性和性能稳定性、有效缓解动态编译所带来的效率问题和过程中的需要的消耗问题。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/284824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-22 15:42
下一篇 2024-12-22 15:42

相关推荐

  • Deepin系统分区设置教程

    本教程将会详细介绍Deepin系统如何进行分区设置,分享多种方式让您了解如何规划您的硬盘。 一、分区的基本知识 在进行Deepin系统分区设置之前,我们需要了解一些基本分区概念。 …

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • 如何在树莓派上安装Windows 7系统?

    随着树莓派的普及,许多用户想在树莓派上安装Windows 7操作系统。 一、准备工作 在开始之前,需要准备以下材料: 1.树莓派4B一台; 2.一张8GB以上的SD卡; 3.下载并…

    编程 2025-04-29
  • 分销系统开发搭建

    本文主要介绍如何搭建一套完整的分销系统,从需求分析、技术选型、开发、部署等方面进行说明。 一、需求分析 在进行分销系统的开发之前,我们首先需要对系统进行需求分析。一般来说,分销系统…

    编程 2025-04-29
  • EulerOS V2R7:企业级开发首选系统

    本文将从多个方面为您介绍EulerOS V2R7,包括系统简介、安全性、易用性、灵活性和应用场景等。 一、系统简介 EulerOS V2R7是一个华为公司开发的企业级操作系统,该系…

    编程 2025-04-28
  • 云盘开源系统哪个好?

    本文将会介绍几种目前主流的云盘开源系统,从不同方面对它们做出分析比较,以此来确定哪个云盘开源系统是最适合您的。 一、Seafile Seafile是一款非常出色的云盘开源系统,它的…

    编程 2025-04-28
  • 基于Python点餐系统的实现

    在当前瞬息万变的社会,餐饮行业也在加速发展,如何更好地为客户提供更加便捷、高效、个性化的点餐服务,成为每个餐饮企业需要思考的问题。本文以基于Python的点餐系统为例,通过优化用户…

    编程 2025-04-28
  • Ubuntu系统激活Python环境

    本文将从以下几个方面详细介绍在Ubuntu系统中如何激活Python环境: 一、安装Python 在Ubuntu系统中默认已经预装了Python解释器,可以通过以下命令来检查: $…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28

发表回复

登录后才能评论