当前位置: 首页 > news >正文

AOSP 编译系统 (Android build system)


一、AOSP 编译系统的作用

AOSP 编译系统的目标是:

  • 把 Android 源码(C/C++/Java/资源文件)编译/打包成可运行的 Android 系统镜像(boot.img、system.img、vendor.img 等)。
  • 提供模块化的编译机制,支持单独构建某个模块(mmm / mmma),而不用全编。

二、编译系统核心组件

1. Make + Soong + Ninja

  • 早期的 AOSP(Android 7 以前):主要依赖 GNU Make,模块描述文件是 Android.mk
  • Android 7+ 引入 Soong
    • 使用 Android.bp(类似 JSON/Blueprint 格式)来描述模块。
    • Soong 负责解析 Android.bp,生成 Ninja 构建文件。
    • Ninja 作为底层编译执行器,速度快、并行能力强。
  • 目前(Android 11+):核心以 Soong+Ninja 为主,仍兼容部分 Android.mk

2. 环境脚本

  • build/envsetup.sh
    提供了一些 shell function(如 lunch, mmm, mm, croot),本质上是构建环境的入口。

  • lunch
    指定编译目标设备和构建类型,例如:

    lunch aosp_x86_64-eng
    

    这里 aosp_x86_64 是设备/平台,eng 是构建类型。

  • 构建类型

    • eng:工程开发版,几乎没有限制,带调试工具,默认生成调试符号。
    • userdebug:接近实际发布版,但有 root 和调试开关。
    • user:正式用户版,去掉 root、调试符号、严格安全限制。

3. 常用命令

  • make -jN
    完整编译整个系统,生成所有镜像。
  • mmm path/to/module
    单独编译某个模块,结果会放到 out/...
  • mm
    在当前目录编译模块。
  • m
    等同于在顶层执行 make

三、模块化描述方式

1. Android.mk (Makefile 风格)

例子:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE    := libfoo
LOCAL_SRC_FILES := foo.c
LOCAL_CFLAGS    := -ginclude $(BUILD_SHARED_LIBRARY)

2. Android.bp (Soong/Blueprint 风格)

例子:

cc_library {name: "libfoo",srcs: ["foo.c"],cflags: ["-g"],
}
  • Soong 会把 .bp 文件解析成 .ninja,交给 Ninja 编译。

四、编译输出目录

所有产物都放在 out/target/product/<device_name>/ 下,例如:

  • system.img
  • vendor.img
  • odm.img
  • boot.img
  • system/lib64/*.so

五、调试/strip 控制

默认情况下 eng 版本已经会带 -g。但是 如果模块未特别指定,build system 仍可能在安装时 strip。 为了要确保,可以在模块的 Android.mk 或 Android.bp 加强:

Android.mk 中:

# 强制带调试信息
LOCAL_CFLAGS += -g# 禁止 strip
LOCAL_STRIP_MODULE := false

LOCAL_STRIP_MODULE := false 是关键,可以防止 build system strip 模块。


Android.bp 中的等效写法:

cc_library {name: "test",srcs: ["test.c"],cflags: ["-g",  "-O0",]strip: {none: true,},
}

六、构建系统的演进

  • Android 1.x ~ 6.x:Make-based (Android.mk)
  • Android 7.0 (Nougat):引入 Soong (Android.bp)
  • Android 9.0:更大规模迁移到 Soong
  • Android 11+:几乎全部核心模块都基于 Soong,Make 仅保留兼容和某些第三方驱动/项目。

🏗 AOSP 编译系统架构图

+------------------------------------------------------------+
|                    AOSP Source Tree                        |
| (Java, C/C++, Kotlin, Resources, Android.bp/Android.mk 等) |
+----------------------------+-------------------------------+|v
+------------------------------------------------------------+
|             build/envsetup.sh  (环境配置脚本)               |
| - 定义 m/mma/mmm/lunch/croot 等函数                         |
| - 设置编译环境变量                                           |
+------------------------------------------------------------+|v
+------------------------------------------------------------+
|   lunch <target> (<device>-eng/userdebug/user)              |
| - 确定设备 (device) 与构建类型 (eng/userdebug/user)         |
| - 设置相关环境 (TARGET_PRODUCT, TARGET_BUILD_VARIANT 等)    |
+------------------------------------------------------------+|v
+----------------------------+-------------------------------+
|             模块定义层 Module definition                   |
|------------------------------------------------------------|
| Android.mk (Make)             | Android.bp (Soong/Blueprint)|
| - LOCAL_MODULE                | - cc_library, android_app    |
| - LOCAL_SRC_FILES             | - srcs, deps, cflags         |
| - LOCAL_CFLAGS                | - strip, sdk_version         |
| …                             | …                            |
+----------------------------+-------------------------------+|v
+------------------------------------------------------------+
|  Soong (用 Go 写的构建系统解析器)                            |
| - 读取 Android.bp                                             |
| - (部分 Android.mk 通过 "soong.mk" 转换加入)                  |
| - 生成 Ninja 构建规则 (`.ninja` 文件)                        |
+------------------------------------------------------------+|v
+------------------------------------------------------------+
|  Ninja (轻量高速的构建执行器)                               |
| - 根据 Soong 生成的 ninja.build 文件                        |
| - 调用 clang/gcc/javac/aapt/aidl/protoc/dex2oat 等工具       |
+------------------------------------------------------------+|v
+------------------------------------------------------------+
|  out/target/product/<device>/                               |
| - system.img         (系统分区镜像)                          |
| - vendor.img         (厂商分区镜像)                          |
| - boot.img           (内核+ramdisk)                          |
| - recovery.img       (恢复模式镜像)                          |
| - userdata.img       (数据分区)                              |
| - system/lib(64)/*.so (编译产出库文件)                       |
+------------------------------------------------------------+

总结
AOSP 编译系统是一个 多层次的构建框架,从顶层环境配置(envsetup.shlunch),到模块定义(Android.mk/Android.bp),最终通过 Soong → Ninja 构建输出系统镜像。
它既要满足 完整系统构建 的需求,也支持 局部模块增量编译,因此开发效率较高。


http://www.dtcms.com/a/353188.html

相关文章:

  • 嵌入式C语言进阶:位操作的艺术与实战
  • 【测试】pytest测试环境搭建
  • Linux 离线环境下 Anaconda3 与核心机器学习库(scikit-learn/OpenCV/PyTorch)安装配置指南
  • 解决Visual Studio中UWP设计器无法显示的问题:需升级至Windows 11 24H2
  • 【SQL优化案例】SQL执行频率问题与优化效果预期
  • NumPy/PyTorch/C char数组内存排布
  • 网站防爆破安全策略分析
  • python项目开发:创建虚拟环境
  • 利用机器学习优化Backtrader策略原理与实践
  • 深入解析函数栈帧创建与销毁
  • 斯塔克工业技术日志:用基础模型打造 “战甲级” 结构化 AI 功能
  • 预测模型及超参数:1.传统机器学习:SVR与KNN
  • 网页版云手机怎么样
  • Enduro 克隆游戏 — 基于 HTML、CSS 与 JavaScript 的完整教程模板
  • 23种设计模式——单例模式(Singleton)​详解
  • 金仓数据库文档系统全面升级:用户体验焕然一新
  • CPU、IO、网络与内核参数调优
  • Linux 性能调优实战:CPU、磁盘 I/O、网络与内核参数
  • 系统架构设计师备考第8天——嵌入式系统
  • 工业网络安全:保护制造系统和数据
  • Linux 系统CPU-IO-网络-内核参数的调优
  • 【学习笔记】GB 42250-2022标准解析
  • 手写MyBatis第36弹:MyBatis执行流程中SQL命令类型解析
  • Effective c++ 35条款详解
  • docker run 后报错/bin/bash: /bin/bash: cannot execute binary file总结
  • Python计算点云的欧式、马氏、最近邻、平均、倒角距离(Chamfer Distance)
  • iOS技术之通过Charles抓包http、https数据
  • 【开题答辩全过程】以Trlig(服装网站)为例,包含答辩的问题和答案
  • ETH PPS 配置链路
  • 车载诊断架构 --- 基于整车功能的正向诊断需求开发