Android构建系统:从Makefile到Soong的迁移指南
1. Android构建系统演进与文件格式变迁在Android平台开发中构建系统经历了从Makefile到Soong的重大变革。早期Android.mk文件采用GNU Make语法随着项目规模扩大这种基于文本处理的构建方式逐渐暴露出性能瓶颈和可维护性问题。2016年Google引入Soong构建系统采用基于Go语言编写的Android.bpBlueprint文件作为新的构建描述格式。这种转换不仅仅是简单的语法替换更代表着构建理念的升级声明式 vs 命令式Android.bp采用纯粹的声明式语法只描述构建什么而非如何构建静态分析友好消除了Android.mk中复杂的条件判断和宏展开支持更高效的依赖分析并行构建优化明确的模块边界定义使得构建任务可以更安全地并行执行2. 核心转换难点解析2.1 宏变量处理机制差异Android.mk中常见的宏变量使用模式包括LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE : foo LOCAL_SRC_FILES : $(TARGET_ARCH)/module.cpp对应的Android.bp实现需要转换为cc_binary { name: foo, srcs: [${TARGET_ARCH}/module.cpp], }关键差异点变量作用域Android.mk的变量是全局可修改的而Android.bp的属性是模块私有的展开时机Makefile在读取时立即展开Blueprint在生成ninja文件时展开条件逻辑Android.bp不支持ifdef等条件语句需通过go语言插件处理复杂逻辑2.2 常见宏变量转换对照表Android.mk宏Android.bp等效方案注意事项$(call my-dir)自动处理无需显式声明bp文件中路径始终相对于Android.bp所在目录$(LOCAL_PATH)不再需要每个模块的srcs路径都是相对于当前bp文件$(TARGET_ARCH)${TARGET_ARCH}需要确保Soong版本支持该变量$(PRODUCT_VAR)通过product_variables配置需在bp文件中定义product_variables字段3. 实战转换指南3.1 基础转换步骤模块类型映射LOCAL_MODULE : foo→name: fooinclude $(BUILD_SHARED_LIBRARY)→cc_library_shared {}include $(BUILD_STATIC_LIBRARY)→cc_library_static {}源文件处理cc_binary { name: demo, srcs: [ main.cpp, utils.cpp, ], }依赖关系转换LOCAL_SHARED_LIBRARIES : liblog libcutils↓shared_libs: [ liblog, libcutils, ],3.2 高级转换技巧条件编译处理ifeq ($(TARGET_ARCH),arm64) LOCAL_SRC_FILES arm64/neon.cpp else LOCAL_SRC_FILES generic/impl.cpp endif转换方案target: { android_arm64: { srcs: [arm64/neon.cpp], }, android: { srcs: [generic/impl.cpp], }, }自定义宏转换 对于项目自定义的宏变量推荐两种处理方式通过go编写的soong插件实现复杂逻辑在bp文件中定义const变量const { MY_FEATURE_FLAG: true, } cc_binary { cflags: [-DMY_FLAG${MY_FEATURE_FLAG}], }4. 常见问题排查4.1 变量未展开问题现象构建时出现$(TARGET_ARCH)等变量未被替换解决方案确认Soong版本支持该变量检查build/soong/android/variable.go对于自定义变量改用const定义或soong插件4.2 路径解析错误典型错误cc_binary { srcs: [$(LOCAL_PATH)/file.cpp], // 错误用法 }正确写法cc_binary { srcs: [file.cpp], // 自动相对于当前bp文件 }4.3 产品差异化配置旧方案ifeq ($(PRODUCT_MODEL),PIXEL) LOCAL_CFLAGS -DGOOGLE_HARDWARE endif新方案product_variables: { pixel: { cflags: [-DGOOGLE_HARDWARE], }, },5. 转换工具与验证方法5.1 官方转换工具Google提供的androidmk工具可处理基础转换$ androidmk Android.mk Android.bp工具限制无法处理复杂条件逻辑不转换自定义宏变量需要人工检查生成的bp文件5.2 验证转换结果推荐分阶段验证语法检查$ build/soong/soong_ui.bash --make-mode nothing构建产物对比$ mm -j32 # 使用旧系统构建 $ m -j32 # 使用新系统构建 $ diff -r out/target/product/old out/target/product/new6. 性能优化建议模块化拆分将大型Android.mk拆分为多个Android.bp每个功能模块对应独立的bp文件避免全局变量// 不推荐 const { COMMON_FLAGS [-Wall], } // 推荐 cc_defaults { name: my_defaults, cflags: [-Wall], }利用cc_defaultscc_defaults { name: base_flags, cflags: [-O2], ldflags: [-Wl,--gc-sections], } cc_binary { name: optimized, defaults: [base_flags], }在实际项目迁移中我们发现最大的挑战往往不是语法转换而是构建思维的转变。从命令式的构建脚本转向声明式的构建描述需要开发者更清晰地定义模块边界和依赖关系。一个实用的技巧是先在Android.bp中构建最简单的版本再逐步添加复杂功能比一次性完整转换成功率更高。

相关新闻

学术论文写作哪个AI工具最专业?2026实测对比,科研人按需选择

学术论文写作哪个AI工具最专业?2026实测对比,科研人按需选择

一、前言当下AI辅助科研写作已经成为学生与科研从业者的主流选择,从论文选题、文献梳理、大纲搭建,到正文撰写、语句润色、格式排版、答辩材料制作,优质的AI工具可以大幅降低写作压力、提升整体创作效率。市面上论文写作AI工具种类繁多&#…

2026/7/31 3:24:36 阅读更多 →
5分钟搭建企业级电商聊天系统:MallChat让购物更有温度 [特殊字符][特殊字符]

5分钟搭建企业级电商聊天系统:MallChat让购物更有温度 [特殊字符][特殊字符]

5分钟搭建企业级电商聊天系统:MallChat让购物更有温度 🛒💬 【免费下载链接】MallChat mallchat的后端项目,是一个既能购物又能聊天的电商系统。以互联网企业级开发规范的要求来实现它,电商该有的购物车,订…

2026/7/31 3:24:36 阅读更多 →
Cadence Allegro板间复用:从原理到实战的PCB布局高效复用指南

Cadence Allegro板间复用:从原理到实战的PCB布局高效复用指南

1. 项目背景与核心价值:为什么我们需要“板间复用”在电子设计自动化领域,尤其是使用Cadence Allegro进行复杂PCB设计时,一个高频出现的痛点就是:如何在多个PCB项目之间,高效、准确地复用已经完成布局的模块或器件&…

2026/7/31 3:24:36 阅读更多 →

最新新闻

PyRadiomics安装全攻略:从环境配置到实战避坑指南

PyRadiomics安装全攻略:从环境配置到实战避坑指南

1. 项目概述:为什么PyRadiomics的安装总让人头疼?如果你正在医学影像、特别是影像组学领域摸索,那么PyRadiomics这个工具包的大名你一定听过。它是一个强大的Python库,能够从医学影像(如CT、MRI)中自动化提…

2026/7/31 3:57:48 阅读更多 →
Python自动化跨库查询:从NCBI蛋白名到Uniprot登录号与基因名

Python自动化跨库查询:从NCBI蛋白名到Uniprot登录号与基因名

1. 项目概述:为什么需要跨库查询蛋白信息?如果你在生物信息学或者分子生物学领域工作过,哪怕只是处理过一次高通量测序数据,大概率都遇到过这个场景:你手头有一串从文献、数据库或者自己分析结果里拿到的蛋白名称&…

2026/7/31 3:57:48 阅读更多 →
Go语言 sql.Null 类型详解:处理数据库 NULL 值的正确姿势

Go语言 sql.Null 类型详解:处理数据库 NULL 值的正确姿势

1. 引言:数据库 NULL 值处理的痛点 在 Go 语言中操作数据库时,一个常见且棘手的问题是如何处理 SQL 中的 NULL 值。Go 的基本数据类型(如 int、string、bool)无法直接表示 SQL 的 NULL 状态。如果数据库某字段为 NULL,…

2026/7/31 3:57:48 阅读更多 →
深入解析Go语言WaitGroup并发同步机制

深入解析Go语言WaitGroup并发同步机制

1. WaitGroup 的设计哲学与核心诉求在并发编程的世界里,协程同步是个永恒的话题。当我们启动多个 goroutine 并行执行任务时,常常需要等待所有子任务完成后再继续主流程。这种"等待所有"的场景,正是 sync.WaitGroup 的用武之地。Wa…

2026/7/31 3:57:48 阅读更多 →
Altium Designer新手入门:从原理图到PCB的完整设计流程与实战技巧

Altium Designer新手入门:从原理图到PCB的完整设计流程与实战技巧

1. 项目概述:从零到一的硬件设计初体验自学AD(Altium Designer)的第二天,目标很明确:把昨天画好的原理图,变成一块实实在在、能拿去打样的PCB图。这感觉就像你刚学会用笔画房子的平面图,现在要开…

2026/7/31 3:57:48 阅读更多 →
OpenClaw安装方法2026,最简单的部署方式推荐

OpenClaw安装方法2026,最简单的部署方式推荐

折腾了半天才发现,OpenClaw安装其实没那么玄乎 说实话,我第一次接触OpenClaw的时候,真的被各路教程给整懵了。有的说要配复杂的环境变量,有的要改Nginx配置,还有的动不动就让你编译源码……我电脑小白一个&#xff0c…

2026/7/31 3:56:48 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻