深入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 项目中快速找到正确的编译目标和设备树绑定,无需再在陌生的目录结构中碰运气。

相关推荐
美狐美颜SDK开放平台5 小时前
美颜SDK开发详解:如何优化美颜SDK在低端安卓机上的性能?
android·ios·音视频·直播美颜sdk·视频美颜sdk
casual_clover5 小时前
【Android】实现状态栏背景透明,系统时间/图标直接显示在页面背景上
android·透明状态栏
blackorbird5 小时前
Android Pixel 10 零点击漏洞利用链
android
_kerneler5 小时前
[qemu+kvm] vfio-platform irq 注入过程
android
亚空间仓鼠5 小时前
Docker容器化高可用架构部署方案(十一)
android·docker·架构
我命由我123455 小时前
Android 开发问题:TextView 内容超过宽度时,默认不会换行
android·开发语言·java-ee·android studio·android jetpack·android-studio·android runtime
shandianchengzi6 小时前
【科普】安卓|安卓手机上如何简便实现Ctrl+Z(需要键盘或一台Windows电脑)
android·windows·智能手机·计算机外设·安卓·科普·记录
赏金术士14 小时前
Compose 教学项目
android·kotlin·compose
晓梦林14 小时前
ximai靶场学习笔记
android·笔记·学习