大家好诶,很多机型,尤其是新机器没有Twrp,很困难呐,但是呢由于vab或者啥的又导致没法移植,很多人呢想搞编译又苦于没电脑,没dt,所以呢我今天就教教各位如何用手写一个Twrp并在手机上进行编译操作,我相信我的教程人类都可以看懂,当然前提你要有一些刷机基础,而且我确信我在文中所用的专业名词都可以在百度里面搜到,所以你只要认真+细心一定可以学懂哦
一,准备工作
1.了解你手机的分区(可以用【底层探测器】 来查看)
第一种是有独立recovery分区
这种分区包含System As Root分区(Sar)近几年小米三星都应该用的这种分区
A only分区,老机型偏多
第二种是将recovery集成在boot分区里面
A/B分区(近几年新机,出场安卓8-10居多)
V-AB分区(出场安卓11机型居多)
其他:
要注意你的手机是否为动态分区,这点很重要跟后来的教程有关,一般v-ab都为动态分区,近两年新机大多都是动态分区

比如我的LGV50就为AB分区
2.下载/提取你手机的官方刷机包,并解包
这点应该不会很难吧,各位但凡有刷机基础应该都可以办到
下载好的官方包
如果你是我上面说的第一种分区就提取recovery.img
如果你是第二种就提取boot.img
无官方包提取我推荐这个工具【镧·系统工具箱 2.0】

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

找到你提取的文件

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

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

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

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

二,开始编写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的文件结构

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

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

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

(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_品牌英文名_机型代号
其实命名成啥都行,不过嘛,把这玩意命名成这种格式是一种标准,建议跟进下
然后按照我所列出的树状图来新建文件和文件夹

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

建好了后差不多长这样

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

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

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

标蓝部分均为rc脚本,就是xxx.rc这种
要拷贝的最后一个文件就是预编译内核啦,这个不在RamDisk而在split_img下,

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

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

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

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

上面那些#开头的注释不用管
首先是
DEVICE_PATH := device/duoqin/k61v1
将其改成
DEVICE_PATH := device/品牌英文名称/机型代号
这里的作用是声明你dt所存放的位置

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

接着是
TARGET_OTA_ASSERT_DEVICE := k61v1
将其改为
TARGET_OTA_ASSERT_DEVICE := 你的机型代号,注意空格
这里的作用是验证刷机包的机型验证,有的时候你刷机碰到错误7就是因为这里的机型和你刷机包里面刷机脚本的机型对不上

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

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

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

然后将
BOARD_KERNEL_CMDLINE := bootopt=64S3,32N2,64N2 buildvariant=user
改为
BOARD_KERNEL_CMDLINE := 你复制的,注意空格

下面这两个实在声明你预编译内核的位置,如果你还多个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的位置
下面的部分不用管,直到这部分

将
TARGET_KERNEL_SOURCE := kernel/duoqin/k61v1_64_bsp
TARGET_KERNEL_CONFIG := k61v1_64_bsp_defconfig
改为
TARGET_KERNEL_SOURCE := kernel/厂家英文名/机型代号
TARGET_KERNEL_CONFIG := 机型代号_defconfig
这步是在说明内核源码的位置
接下来是

# Platform
TARGET_BOARD_PLATFORM := mt6761
将这里改为
# Platform
TARGET_BOARD_PLATFORM := 你的soc型号
比如高通855就写sm8150,865就是sm8250
下面这部分不用动

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

搞清楚后将
# 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里面的分区名称,用空格间隔
如果你不是动态分区直接把这些删掉就好
下面这部分基本可以照抄了

如果你的设备没有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分区

我选中这部分删掉,如果是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分区需要留下,如果不是就删掉)

马上就到这个文件的最后一部啦
将
# 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分区那么直接把我这段复制过去

只需要改动
LOCAL_PATH := device/duoqin/k61v1
改为
LOCAL_PATH := device/厂家英文名/机型代号
如果你只是动态分区,那么需要你保留我标蓝的部分

其他全部扬掉
只需要改动
LOCAL_PATH := device/duoqin/k61v1
改为
LOCAL_PATH := device/厂家英文名/机型代号
如果你不是动态分区只是ab分区
删掉我标蓝部分

只需要改动
LOCAL_PATH := device/duoqin/k61v1
改为
LOCAL_PATH := device/厂家英文名/机型代号
并将
AB_OTA_PARTITIONS += \
boot \
system \
product \
dtbo \
vbmeta \
vbmeta_system \
vendor
改成你机器所存在的AB分区
最后一个是twrp_你机型代号.mk
这步很简单

改为

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