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

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

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

2026/10/3 6:16:25 阅读更多 →
Cadence Allegro板间复用:从原理到实战的PCB布局高效复用指南

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

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

2026/10/2 18:58:15 阅读更多 →

最新新闻

LeetCode 437 路径总和 III:从暴力解到前缀和优化的完整思路

LeetCode 437 路径总和 III:从暴力解到前缀和优化的完整思路

Day 16 的刷题计划轮到 LeetCode 437 路径总和 III。说实话,刚开始我有点轻敌:前面刚把路径总和 I、II 都过了一遍,觉得二叉树路径问题无非就是递归套递归,用 JavaScript 写起来也不会难到哪里去。等我真正动手才发现,…

2026/10/9 4:04:31 阅读更多 →
Java Servlet图书管理系统:零框架部署与课设实战指南

Java Servlet图书管理系统:零框架部署与课设实战指南

简介:这是一份面向计算机专业本科生的Java课程设计与期末大作业实战资源,基于B/S架构实现功能完整的图书管理系统,帮助学习者掌握JDBC连接MySQL、ServletJSP前后端交互、MVC分层开发等核心技能。资源包共93个文件,包含40个Java业务…

2026/10/9 4:04:31 阅读更多 →
红黑树学习笔记:从规则、旋转变色到插入删除实操

红黑树学习笔记:从规则、旋转变色到插入删除实操

红黑树大概是数据结构里退学率最高的一章,没有之一。链表、栈、队列这些结构,说白了就是换种方式组织数据,看两遍代码基本能上手。但红黑树不一样,它天生带着一堆规则、旋转、变色、再平衡,哪怕你对着博客把插入的六种…

2026/10/9 4:04:31 阅读更多 →
栈上变量覆写:一道CTF入门题的PWN解题全流程

栈上变量覆写:一道CTF入门题的PWN解题全流程

不用多说,直接进正题。今天要拆的这道题是HappyNewYearCTF系列里的第三题,题目全名叫“栈上变量覆写2”。一看到这个名字,基本就能猜个大概:又是栈上变量被覆写的路子,而且这题带个“2”,说明同系列里还有一…

2026/10/9 4:04:31 阅读更多 →
Spring Boot 3 接入 AI 生图:异步管道与防刷限流架构实践

Spring Boot 3 接入 AI 生图:异步管道与防刷限流架构实践

做 AI 应用的朋友应该都有体会:同一张图,老手能生成得又快又稳,新手可能连接口都调不明白,或者好不容易调通了,一上线就被刷爆了配额。这段时间我正好把一个 AI 生图功能从零接入到一个 Spring Boot 3 的现有后端里&am…

2026/10/9 4:04:31 阅读更多 →
4G显存也能流畅跑大模型:llama.cpp与GGUF量化实战指南

4G显存也能流畅跑大模型:llama.cpp与GGUF量化实战指南

如果你的电脑还在用 4GB 显存的显卡,比如 GTX 1650、RTX 3050 Laptop 或者 AMD 那边的 RX 6500 XT,想跑本地大模型,第一反应可能是到处找精简版、量化版,或者干脆放弃转用云 API。但今天我直接说结论:4G 显存完全能跑&…

2026/10/9 4:03:31 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →