AOSP编译系统演进:从Make到Ninja的技术升级(Android13)

news2025/2/22 11:41:48

AOSP编译系统演进:从Make到Ninja的技术升级(Android13)

引言

在Android 7.0之前,Android的编译系统主要使用GNU Make和Android.mk进行构建规则的描述和执行。然而,随着项目规模的扩大,Makefile组织方式导致了编译时间的增长等问题。

为了解决这些问题,从Android 7.0开始,Google引入了Soong构建系统,Soong 构建系统正好提供了 Android build 所需的灵活性。

Soong 构建系统是在 Android 7.0 (Nougat) 中引入的,旨在取代 Make。它利用 Kati GNU Make 克隆工具和 Ninja 构建系统组件来加速 Android 的构建。

ninja作为替代GNU Make的工具,并引入了kati工具来将Android.mk转换为ninja构建规则文件。随后,在Android 8.0中,Google进一步引入了Android.bp文件,用作替代Android.mk的纯配置文件。

Android.bp文件本质上是一个基于json格式的配置文件,不包含控制流程等复杂语法。它通过Blueprint+soong的转换过程生成相应的ninja构建规则文件(build.ninja),然后使用ninja进行实际的构建工作。

通过这一系列改进,Google的目标是加速Android项目的构建过程,提高整体效率。Soong构建系统由Kati GNU Make克隆工具和Ninja构建系统组件组成,这进一步优化了Android项目的构建流程。

注意,最新消息, Google计划未来几年将AOSP编译系统全面向bazel迁移,此迁移目前处于早期阶段,但您可以对当前的 build 文件做出一些更改,以便开始针对 Bazel 做好准备。迁移完成后,Bazel 将取代 AOSP 中的所有现有构建系统和 build 配置系统(Make、Kati、Soong、基于 Make 的产品配置)。

https://source.android.google.cn/docs/setup/build/bazel/introduction?hl=zh-cn

构建流程

编译系统构成

Android的编译目录位于/build中。在Android 13源码中的build目录中,有几个重要的文件夹:

  1. blueprint:用于处理Android.bp文件,生成*.ninja文件,以供ninja处理。
  2. kati:用于处理Android.mk文件,生成*.ninja文件,同样供ninja处理。
  3. make:该文件夹包含原始的make流程,例如envsetup.sh等。
  4. soong:构建系统的核心部分,其中包括soong_ui.bash。

在build目录中,core文件夹被链接到make/core,而envsetup.sh被链接到make/envsetup.sh。这样做主要是为了对使用者屏蔽切换编译系统时的差异。

总结起来,build目录中的blueprint和kati文件夹用于处理Android.bp和Android.mk文件,生成相应的*.ninja文件供ninja处理,而make文件夹仍然保留了原始的make流程,而soong文件夹则是构建系统的核心部分。

编译流程

下图展示了soong的编译流程

在Android的编译过程中,Android.bp文件会被收集到out/soong/build.ninja.d目录。基于这些信息,blueprint工具会生成out/soong/build.ninja文件。

另一方面,Android.mk文件会由kati和ckati工具生成out/build-aosp_arm.ninja文件。

最后,这两个ninja文件会被整合合并到out/combined-aosp_arm.ninja文件中。这个合并后的ninja文件包含了Android的完整编译规则,并用于执行实际的构建操作。

编译步骤

source build/envsetup.sh
lunch aosp_arm-eng # 不清楚想要lunch的项目时,可以先执行lunch,然后在选择项目
make -j8   

编译初始化

envsetup.sh说明

编译的第一步是执行下面命令:

source build/envsetup.sh

下面是它做的一些事情

lunch说明

环境初始化完毕,我们需要启动一个编译目标,比如我们想要编译aosp_arm-eng, 那么我们只需要执行下面命令:

lunch 3
#或者
lunch aosp_arm-eng

如果你不知道想要编译的目标是什么,直接执行一个lunch命令,会列出所有的目标,直接回车,会默认使用aosp_arm-eng这个目标。

soong编译过程


当执行runKatiBuild时,有一个重要的步骤是加载build/make/core/main.mk文件。这个main.mk文件是Android Build系统的主控文件。从main.mk开始,它使用include命令将所有需要的.mk文件包含进来,最终在内存中形成一个包含所有编译脚本的集合,相当于一个巨大的Makefile文件。这个Makefile文件看起来可能很庞大,但实际上主要由三种内容构成:变量定义、函数定义和目标依赖规则。此外,mk文件之间的相互包含也非常重要。

Make 和 Soong 比较

Make示例

##Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Soong示例

##Android.bp
cc_library_shared {
     name: “libxmlrpc++”,

     rtti: true,
     cppflags: [
           “-Wall”,
           “-Werror”,
           “-fexceptions”,
     ],
     export_include_dirs: [“src”],
     srcs: [“src/**/*.cpp”],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

工具链关系

Android.mk文件、Android.bp、kati、Soong、Blueprint和Ninja之间的关系如下:

  1. Android.bp --> Blueprint --> Soong --> Ninja

    • Android.bp文件通过Blueprint工具进行生成和解析,然后传递给Soong工具进行处理,最终生成Ninja文件。
  2. Makefile或Android.mk --> kati --> Ninja

    • Makefile或Android.mk文件经过kati工具的转换,生成Ninja文件。
  3. Android.mk --> Soong --> Blueprint --> Android.bp

    • Android.mk文件可以通过Soong提供的androidmk工具转换为Android.bp文件,但仅适用于简单的配置。

在编译过程中,现有的Android.mk文件和已有的Android.bp文件分别被转换为相应的Ninja文件。从Android.mk及其他Makefile文件生成的是out/build-<product_name>.ninja文件,而从Android.bp文件生成的是out/soong/build.ninja文件。此外,还会生成一个较小的out/combined-<product_name>.ninja文件,用于将两者组合起来作为执行入口。

最终,Ninja文件是直接控制源码编译的工具。它们包含了编译所需的规则和指令,用于构建Android系统。

Soong模块编译小技巧

我们一般使用mm命令进行模块编译,但是每次修改都使用mm,那么编译时间会让你怀疑人生,因为每次执行mm都会做全局检查,重新生成*.ninja全局文件,这个速度是很慢的,所以建议如下
Android.bp或者Android.mk有改动, 或者源码文件有增删的情况下,使用mm命令。

无Android.bp或者文件增删情况下使用ninja命令,使用脚本封装一些快捷命令,这样就能跳过全局检查,节省编译时间。

参考链接

[Soong构建系统] https://android.googlesource.com/platform/build/soong/+/refs/heads/master/README.md
[Android Make构建系统] https://android.googlesource.com/platform/build/+/master/README.md
[借助 Bazel 打造 Android 平台]https://docs.bazel.build/versions/master/bazel-overview.html?hl=zh-cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1220362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

Linux输入设备应用编程(触摸屏获取坐标信息)

上一章学习了开发板外接键盘并获取键盘的的输入 Linux输入设备应用编程&#xff08;键盘&#xff0c;按键&#xff09;-CSDN博客 本章编写触摸屏应用程序&#xff0c;获取触摸屏的坐标信息并将其打印出来 一 触摸屏数据分析&#xff08;触摸&#xff0c;点击&#xff0c;松开…

进程控制3——进程程序替换

进程的创建有fork&#xff0c;进程的退出有main函数的return&#xff0c;exit&#xff0c;_exit函数 而进程的退出中&#xff0c;一个进程的退出只能有三种情况&#xff0c;退出成功结果对/不对&#xff0c;或者是运行异常收到信号终止 但是我们发现我们用代码创建的子进程它是…

直击虎牙Q3财报:转身出击,一场应对不确定性的新战事

世界上唯一不变的&#xff0c;就是变化。 今年上半年&#xff0c;中国游戏市场销售仍在同比下降&#xff0c;游戏版号和行业政策都在趋严&#xff0c;游戏直播行业仍有较多不确定因素。延续过去的老路子&#xff0c;挖掘新的增量空间有限。 不过也要看到&#xff0c;行业出现…

geoserver的ECQL查询

ECQL Reference — GeoServer 2.24.x User Manual CQL and ECQL — GeoServer 2.24.x User Manual ECQL是CQL的扩展&#xff0c;类似sql查询&#xff0c;比ogc的xml格式简单&#xff0c;可以应用在wfs和wms查询上。 通过可视化页面查看过滤效果&#xff0c;默认视图 主键不会…

Spring Task单机定时任务(使用及阻塞问题解决)

一、介绍 SpringTask是Spring自主研发的定时任务工具&#xff0c;并且存在于Spring体系中&#xff0c;不需要添加任何依赖 Spring Boot 默认在无任何第三方依赖的情况下使用 spring-context 模块下提供的定时任务工具 Spring Task。 我们只需要使用 EnableScheduling 注解就可…

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的…

基于springboot实现疫苗接种管理系统项目【项目源码】计算机毕业设计

基于springboot实现疫苗接种管理系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的…

Antv/G2 分组柱状图+折线图双轴图表

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,heightdevice-height"><title>分组柱状图折线图双轴图表</title><styl…

《Effective C++》条款20

宁以pass-by-reference-to-const替换pass-by-value class A { public:A() {cout << "A()" << endl;}A(const A& a){cout << "A(const A& a)" << endl;}~A(){cout << "~A()" << endl;} private:stri…

今天不学习今天写爱心特效HTML代码

效果&#xff1a; 操作过程 首先在桌面创建一个后缀为txt的文件&#xff0c;然后将下面的代码复制进去保存&#xff0c;再将.txt后缀改为html&#xff0c;最后点击这个文件就会出现爱心特效啦~ 具体代码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.…

Ubuntu 下C++数字雨

以前写过一个Window下的数字雨&#xff0c;像黑客帝国里那样的01数字&#xff0c;现在补充一版Linux下的。使用了curses库&#xff0c;安装方法与使用方法参照 Linux下curses函数库的详细介绍_libcurses库-CSDN博客 5-linux学习笔记之-----curses-CSDN博客 效果如下&#xf…

【TEC100TAI-KIT】青翼科技基于复微青龙JFMQL100TAI的全国产化智能异构计算平台

板卡概述 TEC100TAI-KIT是我司自主研制的一款基于上海复旦微电子复微青龙100TAI的全国产智能异构计算平台开发套件&#xff0c;该套件包含1个复微青龙100TAI核心板和1个PCIE规格的扩展底板。 该套件的核心板集成了100TAI的最小系统&#xff0c;包含一颗JFMQL100TAI900片上系统…

手撕【双向链表】带头双向循环(2)

目录 Test.c DList.h DList.c SLInsert SLErase DList.c总代码 顺序表和链表的对比 今天继续再双向循环链表的基础上做修改。 ❓提问&#xff1a;请你在10分钟内写一个带头双向循环链表。 其实我们只要把SLInsert 和 SLErase 写好就大功告成了&#xff01;&#x1f197…

TensorFlow: 框架的自动微分机制

自动微分&#xff08;Automatic differentiation&#xff09;是深度学习框架中的一个关键功能&#xff0c;它为我们提供了一种便捷且高效的方式来求解函数的导数。在TensorFlow中&#xff0c;作为一款流行且强大的机器学习框架&#xff0c;自动微分机制为用户提供了一个方便的方…

004 OpenCV akaze特征点检测匹配

目录 一、环境 二、akaze特征点算法 2.1、基本原理 2.2、实现过程 2.3、实际应用 2.4、优点与不足 三、代码 3.1、数据准备 3.2、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、akaze特征点算法 特征点检测算法…

ctyunos 与 openeuler

ctyunos-2.0.1-220311-aarch64-dvd ctyunos-2.0.1-220329-everything-aarch64-dvd glibc python3 对应openEuler 20.03 LTS SP1

Selenium操作已经打开的Chrome浏览器窗口

Selenium操作已经打开的Chrome浏览器窗口 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时&#xff0c;每次都要新打开一个窗口&#xff0c;觉得麻烦&#xff0c;所以尝试使用 Selenium 获取已经打开的浏览器窗口&#xff0c;在此记录下过程 本文使用 chrome浏览器来…

Word中NoteExpress不显示的问题

首先确认我们以及安装了word插件 我们打开word却没有。此时我们打开&#xff1a;文件->选项->加载项 我们发现被禁用了 选择【禁用项目】&#xff08;如果没有&#xff0c;试一试【缓慢且禁用的加载项】&#xff09;&#xff0c;点击转到 选择启用 如果没有禁用且没有出…

基于SSM的校园家教兼职信息交流平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…