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/11/10 10:26:00 阅读更多 →
5分钟搭建企业级电商聊天系统:MallChat让购物更有温度 [特殊字符][特殊字符]

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

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

2026/11/4 16:19:27 阅读更多 →
Cadence Allegro板间复用:从原理到实战的PCB布局高效复用指南

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

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

2026/11/8 3:53:38 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/10 23:32:01 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/10 23:32:03 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/11 2:31:33 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/11 17:16:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/11 17:16:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/10 23:32:10 阅读更多 →

日新闻

周新闻

月新闻