为新设备编写类原生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 验证设备代号
|