Android.mk中宏定义的高级用法剖析-安卓framework高级实战

背景:

前面的blog有讲解如何在Android.mk中进行控制安卓cpp源码中ifdef定义变量-干货技能分享,主要就是针对c++代码中经常出现的#ifdef判断进行了剖析和实战

在这里插入图片描述
但是仅仅有上面的ifdef判断这个宏是否存在是不是对宏定义作用没有发挥到最大,是否可以让宏定义有自己的内容呢?
在这里插入图片描述简单说就是想要让Product.mk中可以定义传递对应的值到cpp代码的宏定义中

实现对宏定义值传递

在这里插入图片描述
上面就是一个经典使用mk传递具体的系统的节点路径到cpp代码中,cpp代码中就可以方便根据mk传递进来的字节节点路径进行相关的设置。

使用该方法可以大大提高代码的灵活性,大家可以设想一下,在一套代码需要适配不同的产品目标时候,可以使用同一套代码逻辑来实现,差异变化的路径部可以在Product.mk中进行定义,不同的Product也可以设置不一样的节点路径。

更多framework技术干货,请关注下面“千里马学框架”

<think>嗯,用户关于Android.bp宏控功能的问题需要仔细分析。用户提到"Android.bp能否使用宏控",这是Android构建系统迁移后常见的痛点。 从引用内容来看,用户已经查阅过相关资料,特别是引用[2]明确指出Android.bp通过go语言实现流程控制。用户应该是开发者,正在处理构建配置迁移或模块定制化需求。用户情绪较为急切,因为提问直接且引用了多篇技术文档。 结合历史记录,上次回答详细解释了两种宏控方案,这次需要更突出核心差异。用户可能遇到的实际场景是:迁移Android.mk时卡在条件编译环节,或需要动态控制模块编译路径。 准备这样结构化回答:首先明确肯定回答支持宏控,然后对比新旧机制差异。特别注意强调三个关键点:定义位置(build配置层)、作用域(模块级或全局)、语法约束(纯文本+go扩展)。 </think>Android.bp **支持宏控制编译**,但实现方式与传统的`Android.mk`有显著区别(因其纯文本特性限制了流程控制能力)。以下是两种核心方法: --- ### 📌 方法一:在 `Android.bp` 文件中直接定义宏(无流程控制) 适用于**静态宏定义**(无需条件判断): ```python cc_library { name: "lib_example", srcs: ["example.cpp"], cflags: [ "-DMACRO_NAME=1", // 定义宏 MACRO_NAME 并赋值为1 "-DFEATURE_ENABLED", // 定义开关宏 FEATURE_ENABLED ], } ``` - **用途**:无条件启用宏(如全局配置)。 - **限制**:无法根据编译环境动态开关[^2][^4]。 --- ### ⚙️ 方法二:通过Go脚本(`*.go`)实现条件宏控 适用于**动态条件判断**(如根据设备类型、编译参数开关宏): 1. **定义Go脚本**(如 `feature_control.go`): ```go package mymodule import "android/soong/android" func init() { android.RegisterModuleType("custom_library", customFactory) } func customFactory() android.Module { module := cc.DefaultsFactory() android.AddLoadHook(module, customHook) return module } func customHook(ctx android.LoadHookContext) { type props struct { Cflags []string } p := &props{} // 条件判断:若变量 MY_FEATURE 为true,则添加宏 if ctx.Config().IsEnvTrue("MY_FEATURE") { p.Cflags = append(p.Cflags, "-DFEATURE_X_ENABLED") } ctx.AppendProperties(p) } ``` 2. **在 `Android.bp` 中关联Go脚本**: ```python bootstrap_go_package { name: "my_go_package", pkgPath: "android/soong/mymodule", deps: ["soong-build"], srcs: ["feature_control.go"], } custom_library { name: "lib_dynamic", srcs: ["dynamic.cpp"], } ``` - **关键点**: - Go脚本通过 `ctx.Config()` 读取环境变量(如 `MY_FEATURE`)或Soong配置[^2][^3]; - 宏控逻辑在Go层实现,`Android.bp`仅声明模块依赖[^3]。 --- ### 🔍 对比总结 | **方案** | 适用场景 | 灵活性 | 复杂度 | |-------------------|----------------------------|------------|------------| | **直接 `cflags`** | 无条件静态宏 | 低 | ✅ 简单 | | **Go脚本控制** | 需动态判断(如环境变量、产品配置) | ✅ 高 | ⚠️ 需Go编程 | > 📌 **迁移注意**: > Android 8.0起逐步用`Android.bp`替代`Android.mk`,9.0后强制使用。复杂宏控需借助Go语言扩展能力[^2][^4]。 --- ### ❓ 相关问题 1. **如何传递环境变量给Soong构建系统以控制Go脚本的条件判断?** 2. **在Android.bp中如何为特定CPU架构(如arm64)定义不同的宏?** 3. **能否在Android.bp中直接使用`ifeq`条件语句?若不能,替代方案是什么?** 4. **如何调试Go脚本中宏控逻辑的执行结果?** [^1]: [Android.bp宏控编译指南](引用1) [^2]: [Android.bp宏开关实现原理](引用2) [^3]: [Go脚本与Android.bp协同添加宏](引用3) [^4]: [Android.mkAndroid.bp的宏控迁移](引用4)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值