深入MTK Android BSP:如何确定编译目标与查找项目设备树

在联发科(MTK)平台的 Android BSP 开发中,我们常常遇到两个核心问题:

  • lunch 时到底该选哪个产品目标?

  • 项目使用的设备树(DTS)到底是怎么被绑定的?

本文基于真实的项目结构,拆解 MTK BSP 的配置体系,帮助你快速定位编译目标和设备树绑定关系。

1. 理解 MTK BSP 的板级配置目录

以 Android 14(或类似版本)的 BSP 为例,板级相关的配置通常位于:

bash 复制代码
device/mediatek/
├── build/          # 编译脚本,包含 vendorsetup.sh
├── common/         # 公共配置
├── kernel/         # 内核相关模板
├── mt8189/         # 某一芯片公板配置(如 mt8189)
├── vendor/         # 更多产品变体(SKU)的 Vendor 分区配置
└── ...

而我们常见到的 device/mediateksample/ 目录,则存放着备选的硬件参考设计(Reference Design),例如:

bash 复制代码
device/mediateksample/
├── aiot8391p2_64_bsp
├── aiot8391p3_64_bsp
├── vf_aiot_32_ago
├── vf_aiot_64_ab
└── vf_aiot_64_arm82

这些目录每一个都对应一个独立的 lunch 目标,即一个可以编译的完整产品。


2. 如何确定当前项目应该选择哪个编译目标?

如果你接手一个新项目,需要立刻知道应该 lunch 哪一个,请按以下顺序操作:

2.1 查看 AndroidProducts.mk(最权威的产品列表)

进入 device/mediateksample/ 目录,打开 AndroidProducts.mk 文件:

bash 复制代码
cd device/mediateksample
cat AndroidProducts.mk

你会看到类似这样的内容:

bash 复制代码
PRODUCT_MAKEFILES += $(LOCAL_DIR)/aiot8391p2_64_bsp/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/aiot8391p3_64_bsp/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_32_ago/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_64_ab/device.mk
PRODUCT_MAKEFILES += $(LOCAL_DIR)/vf_aiot_64_arm82/device.mk

每行的目录名就是可用的 lunch 目标名称。通常第一个条目或者带有明显项目代号的就是当前 SDK 的默认目标。

2.2 如果已经执行过 sourcelunch

直接查看环境变量:

bash 复制代码
echo $TARGET_PRODUCT

2.3 使用 get_build_var 随时查询

在源码根目录,先加载编译环境,再查询:

bash 复制代码
source build/envsetup.sh
get_build_var TARGET_PRODUCT

注意 :如果之前没有执行 lunch$TARGET_PRODUCT 为空,菜单中也可能看不到 MTK 的产品。这是因为 MTK 通常不通过 add_lunch_combo 注册到全局菜单,你必须直接指定产品名:

bash 复制代码
lunch aiot8391p3_64_bsp

3. 设备树绑定:公版与项目专用 DTS 分离

确定了 lunch 目标后,下一个问题就是:当前项目绑定了哪一个设备树(DTS)?

MTK BSP 的一大特点是:公版 DTS 与项目 DTS 分离管理

3.1 内核主 Makefile 中看到的都是公版

如果你打开 kernel-6.1/arch/arm64/boot/dts/mediatek/Makefile,会看到诸如:

bash 复制代码
dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-evb.dtb
dtb-$(CONFIG_ARCH_MEDIATEK) += mt8192-evb.dtb
...

这些是芯片厂商提供的通用评估板(EVB)设备树 ,用于让开发者快速跑通一个基础系统,并不包含你的项目专用设备树

3.2 项目专用设备树在哪里?

你的项目设备树(例如 aiot8391p3_64_bsp.dtb)一般存在于以下位置之一:

  • vendor/mediatek/kernel_modules/ 下的某个模块目录

  • vendor/mediatek/dts/kernel-6.1/drivers/misc/mediatek/dts/

  • 甚至是 device/mediatek/mt8189/ 下的某个子目录

快速搜索方式

bash 复制代码
TARGET_BOARD_PLATFORM := mt8189
bash 复制代码
find . -name "*aiot8391*" -o -name "*mt8391*"
# 或直接查找生成的 dtb
find out/target/product/aiot8391p3_64_bsp/ -name "*.dtb"

3.3 板级配置中如何指定设备树?

进入你的产品目录(如 device/mediateksample/aiot8391p3_64_bsp),查看 BoardConfig-vext.mkBoardConfig-kernel.mk:

bash 复制代码
grep -E "TARGET_BOARD_PLATFORM|TARGET_KERNEL_DEVICE_TREE" *.mk

通常你会看到:

bash 复制代码
TARGET_BOARD_PLATFORM := mt8189

但可能没有显式定义 TARGET_KERNEL_DEVICE_TREE。这意味着设备树列表完全由内核构建系统或 Vendor 模块管理,而最终运行时的选择由 Bootloader 根据硬件 ID 完成。

如果想追溯具体的 DTS 文件,需要去查看 vendor/mediatek/ 中的 Android.mkKbuild,它们可能包含类似:

bash 复制代码
include $(CLEAR_VARS)
LOCAL_MODULE := aiot8391p3_64_bsp.dtb
LOCAL_SRC_FILES := aiot8391p3_64_bsp.dts

4. 总结:一套清晰的定位流程

  1. 确定编译目标

    → 查看 device/mediateksample/AndroidProducts.mk,找出符合项目代号的产品名。

    → 直接 lunch <产品名>无需依赖菜单

  2. 定位设备树

    → 先看产品目录下的 BoardConfig-vext.mk,确认 TARGET_BOARD_PLATFORM

    → 如果未显式指定 DTS,则去 vendor/mediatek/ 下搜索与产品名相关的 .dts.dtb

    → 内核主 Makefile 中的列表仅包含公版,不可作为项目参考。

  3. 理解分离设计

    MTK 将"芯片平台通用配置"与"客户项目特定配置"解耦,保证了上游代码的整洁,也让不同项目的硬件差异被隔离在较小的自定义模块中。

掌握了这套方法,你就能在任何 MTK BSP 项目中快速找到正确的编译目标和设备树绑定,无需再在陌生的目录结构中碰运气。

相关推荐
数据知道14 小时前
PHP 代码审计实战——ThinkPHP、Laravel 历史漏洞模式深度剖析
android·网络·web安全·网络安全·php·laravel
拍客圈14 小时前
换服务器 mozcjpeg 5.0.0
android
蜡台15 小时前
Jetpack Compose 稳定性、重组优化(Stable / @NonRestartableComposable)
android·kotlin·compose·jepack
__Witheart__16 小时前
3588 Android 13 预装apk失败 —— 不再使用apps.mk
android
__Witheart__16 小时前
3588 Android 串口软件提示“没有串口读写权限”
android
搭贝17 小时前
国资报送责任制怎么建?三级责任矩阵设计
android·数据库·人工智能·线性代数·低代码·矩阵·制造
hunterandroid17 小时前
[鸿蒙从零到一] ArkUI 声明式渲染管线深度解析:Diff、复用与局部刷新
android
林栩link18 小时前
【车载 Android】从 AAR 到 Plugin:Launcher 卡片插件化解耦实践
android
小小测试开发19 小时前
RAG应用评测:从指标体系到LLM-as-a-Judge的自动化落地
android·运维·人工智能·自动化
paopao_djshddhdj19 小时前
钉钉与钉钉服务商有什么区别?为什么建议选择服务商
android·钉钉