为新设备编写类原生device tree

来自Uotan Wiki · 刷机百科

为新设备编写类原生device tree

本页以lineageOS为例,编写设备树,根据您设备的安卓版本同步对应的lineage版本源代码进行编译,本文不涉及跨版本,请知悉。

准备工作

  • 系统环境需求
    • 运行Linux发行版的物理机/虚拟机(推荐Ubuntu 22.04或更新版本)
    • 或Windows Subsystem for Linux (WSL1/WSL2均可)
  • 必要文件准备
    • 设备原厂完整固件包(需未经过任何修改的官方版本,最新版本优先)
    • 存储空间建议预留至少50GB可用空间

固件解包流程

1. 使用归档工具处理固件包(示例):

# 使用7-zip进行循环解压直至获取镜像文件
7z x firmware.zip -oextracted_folder
# 重复操作直到得到以下关键镜像:
# - system.img/system.new.dat.br
# - vendor.img/vendor.new.dat.br
# - boot.img
# - dtbo.img(如果存在)

或使用如DNA,TIK这种专门的解包工具,这里不展开。

设备树生成步骤

推荐使用Python 3.8+环境

1. 安装必要依赖:

sudo apt update && sudo apt full-upgrade -y
sudo apt install python3 python3-pip git-lfs libxml2-utils
pip3 install aospdtgen

2. 目录结构准备:

mkdir -p ~/aosp/{system,vendor,pruodct}  # 创建标准化目录结构(必要时可添加product)
# 将解包后的文件按类型存放:
# - system/ 存放system.img解包内容
# - vendor/ 存放vendor.img解包内容
# - product/ 可选项
# - boot.img 存放boot.img等启动镜像

3. 生成设备树:

python3 -m aospdtgen ~/aosp ~/device_tree


供应商树生成指南

1. 整合到LineageOS源码:

# 假设源码目录为~/android/lineage
mv ~/device_tree/* ~/android/lineage/device
cp vendor.img ~/android/lineage/device/manufacturer/codename/

2. 执行供应商文件提取:

cd ~/android/lineage/device/<manufacturer>/<codename>
./extract-files.sh vendor.img

若你可以连接设备,也可从设备中直接提取并生成:

./extract-files.sh

如果报错,请将vendor.img镜像挂载到系统。

挂载vendor.img的完整流程

当出现"Vendor partition not found"或"Missing vendor blobs"错误时,可手动挂载vendor.img进行调试:

准备工作

1. 安装必要工具:

sudo apt install android-sdk-libsparse-utils e2fsprogs fuse2fs

2. 创建挂载点目录:

mkdir -p ~/mnt/vendor

3.挂载镜像:

sudo mount -o ro,loop,noatime vendor.img ~/mnt/vendor

4.生成供应商树:

./extract-files.sh ~/mnt/vendor

5.解除挂载:

sudo umount ~/mnt/vendor

完成后检查vendor/<manufacturer>/<codename>目录结构 默认情况下,供应商树将自动生成在源码目录下的vendor文件夹中

后期验证与调试

  • 基础结构验证:
tree -L 3 device/manufacturer/codename
# 应包含:
# ├── Android.bp
# ├── AndroidProducts.mk
# ├── BoardConfig.mk
# └── device.mk
  • 编译前检查:
source build/envsetup.sh
lunch lineage_codename-eng
mka bacon

故障排除

  • 常见错误解决方案:
错误现象 解决方案
AOSPDTGEN: Missing partition images 检查system/vendor目录是否包含完整的文件系统内容
Unsupported Android version 确认aospdtgen版本与Android版本匹配
Vendor mismatch 使用fastboot getvar all验证设备代号

*后期可根据编译器报错情况,修改设备树中的对应声明即可。