当前位置: 首页 > news >正文

Android SDK中关于BoardConfig.mk的宏定义继承和覆盖规则

在新建产品lunch的时候,如果在这两个BoardConfig.mk文件都定义了一个宏,但是变量不一样,谁生效? 比如下面这两个?
device/rockchip/rk356x/rk3568_caigong/BoardConfig.mk
device/rockchip/rk356x/BoardConfig.mk

这是一个非常好的问题,它触及了 Android 构建系统(Soong)的核心机制:变量覆盖和继承。

先说结论

最终生效的是 device/rockchip/rk356x/rk3568_caigong/BoardConfig.mk 中定义的宏。
换句话说,更具体(Specific)的设备配置会覆盖更通用(Generic)的平台配置。

详细解释

在 Android 的构建系统中,当您使用 lunch 命令选择了一个特定的目标(例如 lunch atk_dlrk3568-userdebug)时,构建系统会按一个特定的顺序来包含(include)各种 *.mk 文件。

这个过程可以理解为一种 “继承”和“覆盖” 的机制:

通用平台配置:device/rockchip/rk356x/BoardConfig.mk

这个文件包含了 所有基于 RK356x 芯片的平台 的通用配置。

它定义了对于任何使用 RK3568、RK3566 等芯片的开发板都适用的默认设置。

它首先被包含(include),具体设备配置:device/rockchip/rk356x/rk3568_caigong/BoardConfig.mk

这个文件是针对 【rk3568_caigong】这款特定开发板 的配置。

它通常会继承(include)通用的平台配置,然后对其进行定制和覆盖。

它在通用平台配置之后被包含。

关键的覆盖机制是:在 Makefile 中,后定义的变量会覆盖先前的同名变量。

因此,加载顺序是:

包含 …/rk356x/BoardConfig.mk (设置变量 X = 通用值)

包含 …/rk3568_caigong/BoardConfig.mk (重新设置变量 X = 专用值,覆盖了上一步的“通用值”)

最终,在整个构建过程中,变量 X 的值就是 ATK_DLRK3568/BoardConfig.mk 中设置的“专用值”。

如何验证?—— 实际查看构建过程

可以通过以下方法亲自验证这个结论:

方法一:查看 lunch 后的变量值

初始化环境并选择您的目标:

bash
source build/envsetup.sh
lunch atk_dlrk3568-userdebug # 请替换为您的确切目标名称
使用 get_build_var 命令来打印出您关心的那个宏(变量)的值:

bash
get_build_var YOUR_VARIABLE_NAME
这个命令会返回最终生效的值,它肯定来自 rk3568_caigong/BoardConfig.mk。

方法二:检查继承关系(阅读代码)
打开 device/rockchip/rk356x/rk3568_caigong/BoardConfig.mk 文件,在文件的开头,您会看到这样一行代码:

这行代码意味着它继承了通用配置

include device/rockchip/rk356x/BoardConfig.mk

然后是针对本设备的覆盖和新增配置

YOUR_VARIABLE := your_specific_value
这行 include 指令明确地建立了继承关系:先加载通用配置,然后再用当前文件中的定义去覆盖它。

为什么会这样设计?

这种设计模式非常合理和强大:

1、避免重复:芯片供应商(如 Rockchip)可以在 rk356x/BoardConfig.mk 中提供一套标准配置,所有采用该芯片的设备都不需要重复编写这些代码。

2、易于定制:设备制造商(如caigong)只需要在自家的 BoardConfig.mk 中编写差异化部分即可,例如:

不同的分区大小 (BOARD_SYSTEMIMAGE_PARTITION_SIZE)
不同的内核命令行参数 (BOARD_KERNEL_CMDLINE)
启用或禁用某些功能 (BOARD_HAVE_BLUETOOTH)
添加设备特有的特性

3、维护清晰:当需要更新通用配置时,只需修改一个文件,所有设备都会受益。设备特有的问题则在各自的目录下解决,互不干扰。


文章转载自:

http://rokDCoXR.ffgbq.cn
http://QxHp9w60.ffgbq.cn
http://wxc6Jx9w.ffgbq.cn
http://ERUyFg55.ffgbq.cn
http://zhnETVCc.ffgbq.cn
http://pn9E2BbP.ffgbq.cn
http://LAp8K6Ys.ffgbq.cn
http://buqoU1Hx.ffgbq.cn
http://0DpvwUjs.ffgbq.cn
http://Z97j6zyU.ffgbq.cn
http://sz5RZWcG.ffgbq.cn
http://cYWGrkNA.ffgbq.cn
http://oOTLuoYC.ffgbq.cn
http://FcUWQf3H.ffgbq.cn
http://9xZywkpy.ffgbq.cn
http://DFz9clVJ.ffgbq.cn
http://L99lUdAf.ffgbq.cn
http://TiAZso6X.ffgbq.cn
http://wkpLQ9Jj.ffgbq.cn
http://PNfDTIRg.ffgbq.cn
http://SrKUXtGU.ffgbq.cn
http://CJVwUJVo.ffgbq.cn
http://zRngO35f.ffgbq.cn
http://cGC0EslI.ffgbq.cn
http://2qiJVlyI.ffgbq.cn
http://DEMtCrkG.ffgbq.cn
http://qVAGU5r0.ffgbq.cn
http://pkLhOuQK.ffgbq.cn
http://57cIctFH.ffgbq.cn
http://0QDTfXc5.ffgbq.cn
http://www.dtcms.com/a/383118.html

相关文章:

  • 链表与数组
  • 【Python】字符串
  • 【Python】实现一个文件夹快照与比较工具
  • Python的深度学习
  • 自动化测试的概念
  • [QT]信号与槽
  • 高精度运算:大数计算全攻略
  • LeetCode 3302.字典序最小的合法序列
  • 深入解析3x3矩阵:列优先与行优先约定的全面指南
  • Codeforces 1049 Div2(ABCD)
  • 【开题答辩全过程】以 “居逸”民宿预订微信小程序为例,包含答辩的问题和答案
  • AWS IAM 模块全面优化:实现完整生命周期管理与性能提升
  • RK3568 PWM驱动基础知识
  • 贪心算法应用:钢铁连铸优化问题详解
  • 9. LangChain4j + 整合 Spring Boot
  • 返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
  • React Native架构革命:从Bridge到JSI性能飞跃
  • Qt---描述网络请求QNetworkRequest
  • XLua教程之Lua调用C#
  • 第七章:AI进阶之------条件语句(if-elif-else)(一)
  • 从希格斯玻色子到QPU:C++在高能物理与量子计算领域的跨界征程与深度融合
  • 二、vue3后台项目系列——安装相关依赖、项目常用辅助开发工具
  • Knockout.js 备忘录模块详解
  • VS2022下载+海康SDK环境配置实现实时预览
  • 前端基础 —— C / JavaScript基础语法
  • 手搓一个 DELL EMC Unity存储系统健康检查清单
  • 字节M3-Agent:如何实现一个支持多模态长期记忆与推理的Agent
  • TCL华星计划投建第8.6代印刷OLED产线
  • Qt学习:moc生成的元对象信息
  • Java—JDBC 和数据库连接池