0基础编写TWRP的Device Tree
发表于:2023-05-05 | 分类: 安卓教程

大家好诶,很多机型,尤其是新机器没有Twrp,很困难呐,但是呢由于vab或者啥的又导致没法移植,很多人呢想搞编译又苦于没电脑,没dt,所以呢我今天就教教各位如何用手写一个Twrp并在手机上进行编译操作,我相信我的教程人类都可以看懂,当然前提你要有一些刷机基础,而且我确信我在文中所用的专业名词都可以在百度里面搜到,所以你只要认真+细心一定可以学懂哦

一,准备工作

1.了解你手机的分区(可以用【底层探测器】 来查看)

第一种是有独立recovery分区

这种分区包含System As Root分区(Sar)近几年小米三星都应该用的这种分区
A only分区,老机型偏多

第二种是将recovery集成在boot分区里面
A/B分区(近几年新机,出场安卓8-10居多)
V-AB分区(出场安卓11机型居多)

其他:

要注意你的手机是否为动态分区,这点很重要跟后来的教程有关,一般v-ab都为动态分区,近两年新机大多都是动态分区

img

比如我的LGV50就为AB分区

2.下载/提取你手机的官方刷机包,并解包

这点应该不会很难吧,各位但凡有刷机基础应该都可以办到

下载好的官方包
如果你是我上面说的第一种分区就提取recovery.img
如果你是第二种就提取boot.img
无官方包提取我推荐这个工具【镧·系统工具箱 2.0】

img

现在就需要解包工具啦
因为recovery.img和boot.img的解包方式是一样的,所以这两个解包工具是通用的,虽然我知道有很多很棒的免费解包工具,但是小白我还是推荐【魇·工具箱 - 镜像工具】,虽然收费但是有独立gui确实很方便,以下的教程我将用这个工具

解包具体流程如下

找到boot分解这个选择(就算你的是recovery也是可以用这个的)

img

找到你提取的文件

img

点击后稍等片刻,出现这张图片后解包成功

img

然后各位可以用【MT管理器】(手机上做开发很推荐)找到
/data/data/com.nightmare/files/home/AIK-mobile/
目录里面就是你解包完成后的文件

img

现在我也给各位讲讲这里面的两个文件夹分别是
第一个是RamDisk文件夹
各位点开后大概能看出这是一套和安卓系统非常相向的文件结构,其实recovery也是基于Linux开发的,你解开的就好比是recovery的system分区,这个东西要保留好,我们一会要从中提取很多文件!但是切忌不要尝试移动这个文件夹,因为这个文件夹里面有硬链接
如果你随意移动可能会导致你现在的系统崩溃

img

第二个文件夹是split_img文件夹
我在上面跟各位说过因为recovery也是基于Linux开发的一套系统
所以他也需要内核来进行启动,所以我们在这里面提取的就是你twrp要提取的内核啦

img

二,开始编写dt

1.关于dt和编译你所需要了解的

可能很多人不知道twrp是如何来的,这里我就给各位讲讲
如果你用的是正统的twrp制造方法,那么简单来讲可以分为两大步
第一步,编写device tree
第二步,编译twrp

twrp是一套完整的通用源码
device tree呢就好比我们在里面写下关于我机器的各种特征,各种参数
然后twrp的源码来读取我们写的device tree,并根据我们写的参数来进行编译,生产你们平时用的twrp
而这步呢一般情况下就统称为编译

我们来制造twrp时呢大多数时候是可以不用碰twrp源码,我们只需要写device tree就可以,然后进行编译,所以这一步我就来教各位如何写twrp的dt(device tree)

2.了解一个dt的文件结构

img

这是一个dt必须的组层,注意我图中划掉的部分是不必要的,现在我像各位详解下每个文件的作用
(1)prebuilt文件夹

img

这个文件夹的作用非常好理解,里面就是存放我们在第一步提取出来的内核
像这种提取出来的内核又名为预编译内核
预编译内核顾名思义就是已经预备编译好的内核
其中image.gz为内核本体
下面的dtb.img也是从刚才的第一步里面提取出来的
有部分机型可能会提取出来dtbo如果有的话也要放进来

img

这俩文件都是从提取出来的预编译部分重命名出来的

其中xxx-kernel就是image.gz
xxx-dtb就是dtb.img
(2)root文件夹
一般情况下都是要直接在这个文件夹里面直接新建个recovery文件夹,而这里面的文件来源都是在刚才RamDisk里面提取的init.xxx.rc,如果要修复解密要➕更多的东西,但是由于这里是小白教程就不多教了
提取的位置在RamDisk根目录下,提取所有的rc脚本过来

img

(3)剩下的mk文件都是各种机型参数和编译选择的填写位置
我大概说下每个的作用,具体看下文的教程

Android.mk
用于声明你机型的机型代号,比如你的手机是小米5那么你的代号就是gemini

AndroidProduct.mk
用于告知twrp源码你写机型名称的那个mk的名字,这样才能让twrp读取到你的mk去编译

BoardConfig.mk
一般用于写机型的内核分区等配置文件

device.mk
如果你不是AB/vab分区一般用不到这个,这个是写AB分区配置的

twrp_机型代号.mk/omni_机型代号.mk
这两个名字根据你twrp源码的安卓版本对应,如果你是安卓11就用twrp开头的,如果是以下的就用omni

recovery.fstab
这个文件是用来声明个个分区的挂载位置,也是提取自RamDisk

3.真正开始手写dt

(1)利用mt管理器搭建一个dt框架
首先新建个文件夹
将文件夹命名为android_device_品牌英文名_机型代号
其实命名成啥都行,不过嘛,把这玩意命名成这种格式是一种标准,建议跟进下
然后按照我所列出的树状图来新建文件和文件夹

img

mt管理器点下面那排的➕号能调出来新建面板

img

建好了后差不多长这样

img

如果你自己对照后发现和我一样那么证明这步你成功啦
(2)提取文件到dt里面
咱们先从最简单的开始recovery.fstab
一般这个文件会存在在ramdisk/etc/recovery.fstab,将这个文件放到dt根目录下

img

如果没有这个文件可以去找你手机的vendor/etc或system/etc下的fstab文件(大于2k)并重命名为recovery.fstab拷贝到dt根目录下

img

提取rc脚本到root/recovery,这些脚本直接从RamDisk根目录下找到并复制进去

img

标蓝部分均为rc脚本,就是xxx.rc这种

要拷贝的最后一个文件就是预编译内核啦,这个不在RamDisk而在split_img下,

img

将文件后有dtb的命名为dtb.img,将有kernel命名为image.gz放到dt的prebuilt目录下

img

如果你的机型解出来的还有后面有-dtbo结尾的,将其命名为dtbo.img也放进来
(3)编辑mk文件
好了各位,这步要切入正题了,各位要认真观看反复观摩哟
先从Android.mk开始,这步是最简单的
首先你要知道你的机型代号,然后将我提供例子里面的代码复制下来,将蓝字部分改为你的机型代号,这步的含义很简单就是写下你的机型代号,所以我就不多讲了,上面# 后面的那些话都是注释,也建议各位保留下来,不要复制的时候删掉

img

AndroidProducts.mk
同样也是将我提供的例子的代码复制下来,将蓝字部分改为你自己所命名的文件名称,这步不知道我在说啥的,往上面翻,看我画的树状图
这步的作用是在告诉twrp的源码你的文件名称

img

BoardConfig.mk
家人吗大的要来了,这步听我慢慢道来
从头开始看

img

上面那些#开头的注释不用管
首先是

DEVICE_PATH := device/duoqin/k61v1

将其改成

DEVICE_PATH := device/品牌英文名称/机型代号

这里的作用是声明你dt所存放的位置

img

然后我标蓝的这块基本不用动,一个的作用是跳过依赖检查,还有个是声明CPU类型,两个都做了通用化处理,各位直接去我提供的例子里面复制就好

img

接着是

TARGET_OTA_ASSERT_DEVICE := k61v1

将其改为

TARGET_OTA_ASSERT_DEVICE := 你的机型代号,注意空格

这里的作用是验证刷机包的机型验证,有的时候你刷机碰到错误7就是因为这里的机型和你刷机包里面刷机脚本的机型对不上

img

这部分代码应该也不用动,也做了通用化处理,这步是告诉你twrp源码的分区文件格式

img

然后就是内核部分啦,这部分改动的比较多
首先是内核的cmdline部分,你不懂啥意思?没关系跟着我做就好啦
首先找到刚才找预编译内核的那个目录,找到这个后面带cmdline的文件

img

然后点击他选择编辑文本,将里面的话复制出来

img

然后将

BOARD_KERNEL_CMDLINE := bootopt=64S3,32N2,64N2 buildvariant=user

改为

BOARD_KERNEL_CMDLINE := 你复制的,注意空格

img

下面这两个实在声明你预编译内核的位置,如果你还多个dtbo.img就在

TARGET_PREBUILT_DTB := $(DEVICE_PATH)/prebuilt/dtb.img的下面多➕一行
TARGET_PREBUILT_DTBOIMAGE := $(DEVICE_PATH)/prebuilt/dtbo.img

然后再➕一行

BOARD_INCLUDE_RECOVERY_DTBO := true

这里是声明你使用dtbo.img而且告诉twrp dtbo的位置
下面的部分不用管,直到这部分

img

TARGET_KERNEL_SOURCE := kernel/duoqin/k61v1_64_bsp
TARGET_KERNEL_CONFIG := k61v1_64_bsp_defconfig

改为

TARGET_KERNEL_SOURCE := kernel/厂家英文名/机型代号
TARGET_KERNEL_CONFIG := 机型代号_defconfig

这步是在说明内核源码的位置
接下来是

img

# Platform
TARGET_BOARD_PLATFORM := mt6761

将这里改为

# Platform
TARGET_BOARD_PLATFORM := 你的soc型号

比如高通855就写sm8150,865就是sm8250
下面这部分不用动

img

这部分都是写了一些自适应分辨率和,默认启动logcat之类的参数,也是可以直接复制的
接下来这步就在不同的手机上有不同的区别了,首先确定你的手机是否为动态分区
如果是动态分区搞清楚整个super分区大小,并搞清楚整个super里面都包含哪些分区

img

搞清楚后将

# Dynamic Partition
BOARD_SUPER_PARTITION_SIZE := 4294967296
BOARD_SUPER_PARTITION_GROUPS := main
BOARD_MAIN_SIZE := 4294967296
BOARD_MAIN_PARTITION_LIST := product vendor system

改为

# Dynamic Partition
BOARD_SUPER_PARTITION_SIZE := super分区大小(字节为单位)
BOARD_SUPER_PARTITION_GROUPS := main
BOARD_MAIN_SIZE := super分区大小(字节为单位)
BOARD_MAIN_PARTITION_LIST := 包含在super里面的分区名称,用空格间隔

如果你不是动态分区直接把这些删掉就好
下面这部分基本可以照抄了

img

如果你的设备没有avb验证那么可以把

# AVB
BOARD_AVB_ENABLE := true
BOARD_AVB_VBMETA_SYSTEM := system product
BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
BOARD_AVB_VBMETA_VENDOR := vendor
BOARD_AVB_VBMETA_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_VBMETA_VENDOR_ALGORITHM := SHA256_RSA2048
BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_RECOVERY_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_RECOVERY_ALGORITHM := SHA256_RSA2048
BOARD_AVB_RECOVERY_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_RECOVERY_ROLLBACK_INDEX_LOCATION := 3

删掉
下一步确定你的手机是否有独立rec分区,这步我让你们在准备工作中做了,如果有rec分区

img

我选中这部分删掉,如果是ab,vab啥的就留着,这部分是在告诉twrp他是不是要把twrp编译进boot分区
下一部分是

# Bootloader
TARGET_BOOTLOADER_BOARD_NAME := k61v1
TARGET_NO_BOOTLOADER := true
TARGET_USES_UEFI := true

代码啦
改为

# Bootloader
TARGET_BOOTLOADER_BOARD_NAME := 机型代号
TARGET_NO_BOOTLOADER := 有fastboot就写true没有就写false
TARGET_USES_UEFI := true(这行只有vab分区需要留下,如果不是就删掉)

img

马上就到这个文件的最后一部啦

# Partitions
BOARD_FLASH_BLOCK_SIZE := 131072
BOARD_BOOTIMAGE_PARTITION_SIZE := 33554432

改成

# Partitions
BOARD_FLASH_BLOCK_SIZE := 131072
BOARD_BOOTIMAGE_PARTITION_SIZE := 你boot分区的大小,上面的数字是32mb,还是已字节为单位,如果你是我上面说的第一种分区就直接扬了这行

device.mk
如果你既不是动态分区,也不是第二种分区,那么这步你就跳过,直接看下一步
如果你是vab分区那么直接把我这段复制过去

img

只需要改动

LOCAL_PATH := device/duoqin/k61v1

改为

LOCAL_PATH := device/厂家英文名/机型代号

如果你只是动态分区,那么需要你保留我标蓝的部分

img

其他全部扬掉
只需要改动

LOCAL_PATH := device/duoqin/k61v1

改为

LOCAL_PATH := device/厂家英文名/机型代号

如果你不是动态分区只是ab分区
删掉我标蓝部分

img

只需要改动

LOCAL_PATH := device/duoqin/k61v1

改为

LOCAL_PATH := device/厂家英文名/机型代号

并将

AB_OTA_PARTITIONS += \
boot \
system \
product \
dtbo \
vbmeta \
vbmeta_system \
vendor

改成你机器所存在的AB分区
最后一个是twrp_你机型代号.mk
这步很简单

img

改为

img

三,编译

这一步教程非常多,各位百度就好了

上一篇:
安卓编译环境配置