【Android构建系统】了解Soong构建系统

背景介绍

在Android7.0之前,Android使用GNU Make描述和执行build规则。Android7.0引入了Soong构建系统,弥补Make构建系统在Android层面变慢、容易出错、无法扩展且难以测试等缺点。

Soong利用Kati GNU Make克隆工具和Ninja构建系统组件来加速Android的构建。

下面从两个方面来了解Soong构建系统:

  • 使用Soong构建系统构建自己模块要熟悉的两个内容,即.bp和.go。
  • Soong构建系统和Make构建系统的差异。

1.Soong构建系统中.bp和.go的关系

在Android的Soong构建系统中,.bp (Blueprint)文件和.go(Golang)文件共同协作,关系大概如下:

1. .bp文件,声明式构建配置

.bp文件用于定义模块及其属性,采用类似JSON的声明式语法,描述模块的构建规则(如源文件、依赖项、编译选项等)

.bp文件不支持条件语句或控制流,仅用于静态配置。

Soong预定义了模块类型,如cc_library,cc_binary,  java_library等。

 例如,Android15源码中Camera HAL AIDL Demo中的一段:

//hardware/google/camera/common/hal/aidl_service/Android.bp
cc_binary {name: "android.hardware.camera.provider@2.7-service-google",defaults: ["hardware_camera_service_defaults","camera_service_eager_hal_defaults",],init_rc: ["android.hardware.camera.provider@2.7-service-google.rc],
}

2. .go文件,逻辑处理与扩展

.go文件用于实现复杂的构建逻辑,例如

  • 解析.bp文件并生成Ninja构建规则
  • 处理条件编译、环境变量、动态依赖等无法在.bp中直接表达的逻辑
  • 扩展模块类型或自定义构建行为(如通过Go的发射机制)

使用GO语言编写,灵活性高,可调用Android构建系统的底层API。

例如,通过LoadHook动态修改模块属性:

func myHook(ctx android.LoadHookContext) {if ctx.AConfig().IsEnvTrue("USE_FEATURE_X") {ctx.AppendProperties(map[string]interface{}{"cflags": ["-DFEATURE_X"]})}
}

3.协作关系

.bp负责“做什么”(声明模块和属性), .go负责“怎么做”(实现复杂逻辑和生成构建规则)

转换流程:

  1. Soong解析所有.bp文件,生成模块依赖图。
  2. .go代码处理模块间的动态逻辑(如根据产品配置选择源码)。
  3. 最终转换为Ninja可执行的构建规则。

4.协作的典型例子1-条件编译

在.bp中通过arch或target(.go中预定义的变量)分平台配置,而跨模块的全局条件(如产品型号)需要在.go中实现。

cc_library {srcs: ["generic.cpp"],arch: { arm: { srcs: ["arm.cpp] } },
}

 如果arch是arm, srcs是arm.cpp。arch是soong中预定义的变量,用于分平台构建。

5.协作的典型例子2-模块级别控制

例如, Android15 Camera HAL AIDL Demo构建中的一段:

gch_lazy_hal_cc_defaults {name: "camera_service_eager_hal_defaults",enabled: true,soong_config_variables: {use_lazy_hal: {enabled: false,},},
}gch_lazy_hal_cc_defaults {name: "camera_service_lazy_hal_defaults",enabled: false,soong_config_variables: {use_lazy_hal: {enabled: true,},},
}

6.总结

.bp文件.go文件
语法声明式,类JSON命令式,Go语言
灵活性有限,无逻辑控制高,可编程
适用场景模块定义、静态依赖动态逻辑、构建规则扩展
维护者开发者构建系统工程师/高级开发者

2.Soong构建系统和Make构建系统的差异

这两种构建系统在设计理念、语法结构和执行效率等方面又着显著的差异。以下从多个维度对这两种构建系统进行对比分析。

基本概念与发展背景

Make构建系统

  • Android早期使用的构建系统,基于GNU Make实现
  • 通过Android.mk文件定义构建规则
  • 随着Android项目复杂度增加,逐渐暴露出性能瓶颈和可维护性问题

Soong构建系统

  • Android 7.0(Nougat)引入的新构建系统,旨在取代Make
  • 使用Android.bp文件(Blueprint格式)定义构建规则
  • 采用Go语言编写,与Kati和Ninja构建系统组件配合使用
  • 设计目标式解决Make系统在大型项目中的性能瓶颈

语法结构与配置方式

Make语法特点

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libexample
LOCAL_SRC_FILES := example.cpp
include $(BUILD_SHARED_LIBRARY)
  • 命令式语法,包含变量定义和流程控制
  • 需要手动管理依赖关系
  • 基于shell命令执行构建任务

Soong语法特点

cc_library_shared {name: "libexample",srcs: ["example.cpp"],
}
  • 声明式语法,类似JSON格式
  • 不支持条件语句和控制流,复杂逻辑由Go代码处理
  • 强类型变量和属性系统
  • 更简洁直观的模块定义方式

系统架构与工作原理

Make系统架构

  • 串行构建方式,依赖关系手动指定
  • 扩展性差,配置复杂度随项目规模增长而急剧上升
  • 增量构建能力有限

Soong系统架构

  •  自动分析模块依赖关系并生成构建图
  • 支持并行构建,充分利用多核CPU
  • 高效的增量构建机制,仅重新编译变更部分
  • 模块化设计,易于扩展

性能与效率对比

构建速度

  • Make系统在大型项目上构建速度较慢,特别是全量构建时
  • Soong通过并行构建和精确的依赖分析,显著提升构建速度

资源利用率

  • Make系统资源利用率低,主要受限于串行执行
  • Soong能充分利用现代多核处理器,实现高效资源利用

增量构建

  • Make需要开发者手动维护依赖关系,增量构建不可靠
  • Soong自动跟踪文件变更,增量构建精确高效

功能特性对比

特性Make构建系统Soong构建系统
语法类型命令式声明式
依赖管理手动指定自动处理
并行构建有限支持原生支持
增量构建基本支持高效支持
扩展性有限高度可扩展
跨平台需要适配原生支持
学习曲线相对简单较陡峭
条件编译支持通过Go代码实现
模块化有限高度模块化
与Android集成逐渐淘汰深度集成

实际应用场景

适合使用Make的场景

  • 维护旧的Android项目代码
  • 小型项目或原型开发
  • 需要与现有Make系统集成的场景

适合使用Soong的场景

  • 新的Android平台开发
  • 大型复杂项目
  • 需要高效并行构建的环境
  • 需要精确增量构建的项目

迁移于兼容性

  • Soong设计时考虑了与Make系统的兼容性
  • 提供androidmk工具可将Android.mk转换为Android.bp
  • 过渡期间采用混合模式:Make由Kati解析生成ninja文件,再与Soong的ninja文件合并
  • 完全迁移到Soong是Android构建系统的未来方向

Make构建系统作为Android早期的构建解决方案,已经逐渐无法满足现代大型项目的需求。Soong构建系统通过声明式配置、自动依赖管理和并行构建等特性,显著提升了Android项目的构建效率和可维护性。

Make和Soong构建系统的使用建议

  1. 新项目应直接采用Soong构建系统
  2. 旧项目可逐步将Android.mk转换为Android.bp
  3. 复杂构建逻辑可通过Go扩展实现
  4. 充分利用Soong提供的工具链(bpfmt等)提高开发效率

随着Android生态的发展,Soong构建系统将持续演进,可能最终向Bazel构建系统过渡,但其核心优势仍将在Android构建领域发挥重要作用。

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

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

相关文章

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539:简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 模板题及讲解:洛谷 P3374 【模板】树状数组 【解题思路】 解法1:树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…

仓颉开发语言入门教程:搭建开发环境

仓颉开发语言作为华为为鸿蒙系统自研的开发语言,虽然才发布不久,但是它承担着极其重要的历史使命。作为鸿蒙开发者,掌握仓颉开发语言将成为不可或缺的技能,今天我们从零开始,为大家分享仓颉语言的开发教程,…

玉米籽粒发育

成熟玉米籽粒的结构 玉米籽粒的组成 成熟的玉米籽粒主要由以下三部分组成: 母体组织:包括种皮、胎座和花梗。种皮由珠被发育而来,起到保护种子的作用,并在种子的休眠和萌发中发挥重要作用。胚:包含根分生组织、茎分…

sherpa-ncnn:音频处理跟不上采集速度 -- 语音转文本大模型

目录 1. 问题报错2. 解决方法 1. 问题报错 报错: An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 fo…

Postman一直打不开的解决办法

Postman 是一款非常流行的开源 API 开发工具,主要用于构建、测试、调试和文档化应用程序接口(API)。但有时它的性能不会特别稳定,功能限制和扩展性不足;应用于开发、测试、运维等环节,尤其在开发 RESTful A…

问题|对只允许输入的变量是否进行了更改

“对只允许输入的变量是否进行了更改”这一问题的核心是:在编程中,某些变量被设计为仅用于输入(只读),但在代码中可能被意外修改,导致潜在错误。以下是详细解释: 1. 什么是“只允许输入的变量”…

RPC与SOAP的区别

一.RPC(远程过程调用)和SOAP(简单对象访问协议)均用于实现分布式系统中的远程通信,但两者在设计理念、协议实现及应用场景上存在显著差异。 二.对比 1.设计理念 2.协议规范 3.技术特性 4.典型应用场景 5.总结 三.总结…

c#的内存指针操作(仅用于记录)

c#也可以直接操作内存指针,如下为示例: unsafe {byte[] a {1,2,3};fixed (byte* p1 a, p2 &a[^1]){Debugger.Log(1, "test", $"max index:{p2-p1}");Debugger.Log(1, "test", $"address:{(long)p1:X}")…

Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示

Jsp技术入门指南【十三】基于 JSTL SQL 标签库实现 MySQL 数据库连接与数据分页展示 前言一、回顾SQL标签的内容1. 什么是JSTL SQL标签?2.为什么要用SQL标签?3.第一步:引入SQL标签库4. SQL标签的核心功能:连接数据库标签常用属性&…

羽毛球订场小程序源码介绍

基于ThinkPHP、FastAdmin以及UniApp开发的羽毛球订场小程序源码,这款小程序旨在为羽毛球爱好者提供便捷的场地预订服务。 该小程序前端采用UniApp框架开发,具有良好的跨平台兼容性,可以一键发布至iOS和Android平台,极大地提高了开…

Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目

环境: Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程: 链接遇到的问题(问题:解决方案) 点击Linux打包按钮,跳转至网页而不是执行打包流程:用VS打开项…

SpringBoot 3.x 集成 MyBatisPlus

文章目录 集成 MyBatisPlus第 1 步:创建 SpringBoot 项目第 2 步:添加 MyBatisPlus 依赖第 3 步:编写 CRUD 代码创建 Entity创建 Mapper创建 Service编写 Controller第 4 步:执行初始化 SQL第 5 步:配置第 6 步:测试测试 ControllerMapper 层单元测试参考🚀 目标 1:基…

java基础-抽象类和抽象方法

1.abstract 可以修饰:类、方法 (1)修饰类: 类不能被实例化; 抽象类一定有构造器,便于子类实例化时调用; (2)修饰方法:抽象方法 只有方法的声明&#xff…

解决电脑问题(8)——网络问题

电脑网络出现问题的原因较为复杂,以下是从网络连接、网络配置以及网络环境等方面的常见问题及解决方法: 网络连接问题 检查物理连接:对于有线网络,检查网线是否插好,网线有无破损、断裂等情况。对于无线网络&#xff…

ubuntu 20.04 ping baidu.coom可以通,ping www.baidu.com不通 【DNS出现问题】解决方案

ping baidu.coom可以通,ping www.baidu.com不通【DNS出现问题】解决方案 检查IPV6是否有问题 # 1. 检查 IPv6 地址,记住网络接口的名称 ip -6 addr show# 2. 测试本地 IPv6,eth0换成自己的网络接口名称 ping6 ff02::1%eth0# 3. 检查路由 ip…

【AI生成PPT】使用ChatGPT+Overleaf自动生成学术论文PPT演示文稿

【AI生成PPT】使用ChatGPTOverleaf自动生成学术论文PPT演示文稿 文章摘要:使用ChatGPTBeamer自动生成学术论文PPT演示文稿​​Beamer​​是什么Overleaf编辑工具ChatGPT生成Beamer Latex代码论文获取prompt设计 生成结果 文章摘要: 本文介绍了一种高效利…

JVM 垃圾回收器

以下是对主流 JVM 垃圾回收器的详细解析,涵盖 一、Serial GC(单线程串行回收器) 二、Parallel GC(吞吐量优先回收器) 三、CMS(Concurrent Mark Sweep,低延迟回收器) 四、G1&…

从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector

一、三维世界的数学基石 在Three.js的三维世界里,所有视觉效果的实现都建立在严密的数学基础之上。其中向量(Vector) 和矩阵(Matrix) 是最核心的数学工具,它们就像构建数字宇宙的原子与分子,支…

ArcGIS Pro 3.4 二次开发 - 内容

环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 内容1 工程1.1 创建一个空工程1.2 使用指定名称创建新工程1.3 使用Pro的默认设置创建新工程1.4 使用自定义模板文件创建新工程1.5 使用 ArcGIS Pro 提供的模板创建工程1.6 打开现有工程1.7 获取当前工程1.8 获取当前工程的…

【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…