
利用Github来编译TWRP

简介
历史&更新:
上周上游仓库变更构建不可用——2024.10.1
编译问题修复完成——2024.10.5
一些更新——2025.08.11
开始尝试高通设备——2025.08.16
Github地址
TWRP & Orange Fox 构建
TWRP设备树生成:https://github.com/momo54181/action_build_twrp_device_tree
TWRP构建:https://github.com/momo54181/Action-TWRP-Builder
Orange Fox[仅支持安卓12和14]构建:https://github.com/azwhikaru/Action-OFRP-Builder
Orange Fox[支持安卓6-12]构建:https://github.com/momo54181/Lazy_Action-Recoverys-Builder
OFRP的环境变量:https://github.com/momo54181/Action-TWRP-Builder/blob/main/OFRP-Ver.md
TWRP的环境变量:https://github.com/momo54181/Action-TWRP-Builder/blob/main/TWRP-Ver.md
PS:网页最大上传25MB,客户端GitHub Desktop上传最大100MB,img镜像超过100MB的可以用工具解包然后打包就可以减小体积。
BoardConfig.mk
选中 BoardConfig.mk 并按照自己的资料复制并更改以下内容
语言
TW_EXTRA_LANGUAGES := true #添加更多国家的语言(包括亚洲语言)TW_DEFAULT_LANGUAGE := zh_CN #设置默认语言为简体中文
UI
TW_NO_BATT_PERCENT:= true #在不支持电池信息的设备上禁用电池百分比显示
TW_USE_LEGACY_BATTERY_SERVICES := true #修复温度显示 0 度且电池始终处于 100% 开启状态。(使用传统电池服务)
TW_CUSTOM_CPU_POS := 50 #设置 twrp CPU 温度位置
TW_CUSTOM_CLOCK_POS := 300 #设置 twrp CLOCK 位置
TW_CUSTOM_BATTERY_POS := 800 #设置 twrp BATTERY 位置
TW_BATTERY_SYSFS_WAIT_SECONDS := 6 #等待 6 秒以获取电池信息
TW_CUSTOM_CPU_TEMP_PATH := /sys/devices/virtual/thermal/thermal_zone3/temp #自定义CPU温度读取位置
TW_NO_REBOOT_BOOTLOADER:= true #从重启菜单中移除 reboot bootloader按钮
TW_NO_REBOOT_RECOVERY:= true #从重启菜单中移除 reboot recovery按钮
TW_EXCLUDE_MTP := true #禁用MTP模式
TW_INCLUDE_FASTBOOTD := true #设备拥有Fastbootd模式,通常在出厂Android10的设备上出现
TARGET_RECOVERY_QCOM_RTC_FIX := true #启用对高通实时时钟(RTC)的特定修复
触摸/显示/亮度
TWRP_EVENT_LOGGING:= true #启用触摸事件日志记录来帮助调试触摸屏问题(不要在发布时留下这个选项,它会很快填满你的日志文件)
BOARD_HAS_FLIPPED_SCREEN:= true #对于颠倒安装的屏幕,将屏幕上下翻转(示例机型:魅族Note5)
TW_MAX_BRIGHTNESS := 4095 #设置最高亮度TW_DEFAULT_BRIGHTNESS := 1700 #设置最低亮度
TW_BRIGHTNESS_PATH := "/sys/class/leds/lcd-backlight/brightness" #设置控制亮度的路径
TW_NO_SCREEN_BLANK := true #屏幕常亮,不自动息屏。
TW_Y_OFFSET := 115:设置 Y 轴(垂直方向)的偏移量为 115 像素。正值表示整个显示内容向下移动。
TW_H_OFFSET := -115:设置 X 轴(水平方向)的偏移量为 -115 像素。负值表示整个显示内容向左移动。
这些参数通常用于解决某些设备上 TWRP 界面显示错位的问题,比如屏幕边缘被截断或显示位置偏移等情况。通过调整这两个值,可以使 TWRP 界面在特定设备上正确对齐显示。
TARGET_SCREEN_DENSITY := 480 是用于定义设备屏幕密度(DPI)的配置参数。
TW_ROUND_SCREEN := true #设备为圆形屏幕
加密/解密
TW_INCLUDE_CRYPTO := true #是否添加解密支持
TW_INCLUDE_CRYPTO_FBE := true#是否添加解密支持[FBE]
TW_INCLUDE_FBE_METADATA_DECRYPT := false #是否使用元加密分区来参与解密BOARD_USES_METADATA_PARTITION := true #设备是否拥有元加密分区
TW_PREPARE_DATA_MEDIA_EARLY := true #启用 /data/media 的早期准备【OPPO/Realme/Oplus设备解密可能需要用到】TW_USE_FSCRYPT_POLICY := 1 #启用特定策略版本的文件系统加密技术 Fscrypt【使用元加密分区执行解密的改为2】
TW_FORCE_KEYMASTER_VER := true #强制使用特定的 Keymaster 版本。
BOARD_VNDK_VERSION := current #VNDK版本,保持current不变就OK,不必更改。
TARGET_CRYPTFS_HW_PATH := vendor/qcom/opensource/commonsys/cryptfs_hw # 解密所需依赖的源码路径(高通机型)
BOARD_USES_QCOM_FBE_DECRYPTION := true #高通的基于文件的加密(FBE)
BOARD_USES_QCOM_DECRYPTION := true #高通的基于文件的加密(FDE)
RECOVERY_SDCARD_ON_DATA := true # 设置内部存储的数据是否在 data 分区
系统文件格式/分区
TW_INCLUDE_NTFS_3G := true #增加NTFS文件格式的支持,解决NTFS格式的U盘在Rec模式无法读取的问题。
TW_OZIP_DECRYPT_KEY := 1C4C1EA3A12531AE491B21BB31613C11
这是用于解密 OZIP 格式固件的密钥。OZIP 是一些品牌(如 Realme、OPPO 等)使用的加密固件格式,此参数指定解密密钥后,TWRP 可以识别并处理这种加密格式的刷机包,实现对 OZIP 固件的刷写支持。
TW_INCLUDE_LOGICAL := my_product my_engineering my_company my_carrier my_region my_heytap my_stock my_preload my_manifest my_bigball
该参数用于指定 TWRP 需要识别和包含的逻辑分区名称。在采用动态分区(Dynamic Partitions)的设备上,除了物理分区外,还有这些逻辑分区存在。通过配置此参数,TWRP 可以正确识别并处理这些逻辑分区,确保在备份、还原或操作分区时能访问到完整的存储结构。
BOARD_BOOTIMAGE_PARTITION_SIZE := 33554432
指定 boot 分区的大小为 33554432 字节(32MB),用于存放内核和启动镜像。
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 134217728
指定 recovery 分区的大小为 134217728 字节(128MB),用于存放 TWRP 等恢复模式镜像。
动态分区配置(适用于采用 A/B 分区和动态分区的设备):
BOARD_SUPER_PARTITION_SIZE := 8136949760
定义 super 超级分区的总大小为 8136949760 字节(约 7.58GB),这是一个包含多个逻辑分区的容器。BOARD_SUPER_PARTITION_GROUPS := main
定义超级分区的分组为 “main”(可以有多个分组,这里只定义了一个)。BOARD_MAIN_SIZE := 8136949760
指定 “main” 分组的总大小(与 super 分区大小一致,说明所有空间都分配给了这个分组)。BOARD_MAIN_PARTITION_LIST := system product vendor odm
列出 “main” 分组中包含的逻辑分区:system(系统)、product(产品)、vendor(厂商)、odm( odm 分区)。这些分区会共享 “main” 分组的总空间。
TARGET_USE_CUSTOM_LUN_FILE_PATH := "/config/usb_gadget/g1/functions/mass_storage.0/lun.%d/file" 是 Android 编译配置中用于指定 USB 大容量存储(Mass Storage)功能的 LUN(Logical Unit Number,逻辑单元号)文件路径的变量,主要作用是定义设备通过 USB 共享存储时的底层配置路径。
其他
TW_USE_TOOLBOX := true # 是否使用 ToolBox
TWRP_INCLUDE_LOGCAT := true # 是否启用 logcat【调试看日志】
TARGET_USES_LOGD := true # 是否启用 logcat【调试看日志】
TW_IGNORE_MISC_WIPE_DATA := true # 是否在清除 data 时忽略 misc(来自fastboot,系统等的命令)
TW_DEVICE_VERSION := By-Momo5418 #是 TWRP 恢复模式中的一个版本标识配置参数。
它用于定义当前 TWRP 编译版本的自定义名称或标识,通常会显示在 TWRP 界面的版本信息中(例如主界面的标题栏或关于页面)。
TW_EXCLUDE_TWRPAPP := true #是否不打包 TWRP 应用
TARGET_USES_UEFI := true #启用 UEFI 支持
recovery.fstab
将标志添加到fstab中列出的分区的末尾,用空格(或制表符)分隔。这些标志只影响该分区,而不影响其他分区。标志由分号分隔。如果你的路径显示名称(显示给用户的名称)有空格,则必须用引号将显示名称括起来。例子如下:
/external_sd vfat /dev/block/mmcblk1p1 flags=display="Micro SDcard";storage;wipeingui;removable
这个分区的标志给它一个显示名称为“Micro SDcard”以显示给用户。wipeingui使此分区可在高级清除菜单(Advanced Wipe Menu)中进行擦除。removable标志表示有时该分区可能不存在,以防止在启动期间显示挂载错误。下面是一个完整的标志列表:
removable——指示分区可能不存在,以防止在boot期间显示挂载错误。
storage——指示分区可以用作存储,这使得分区可以作为存储器用于备份、恢复、zip安装等。
userrmrf——覆盖擦除所用的常规磁盘格式,并且只允许使用 rm -rf命令擦除分区。
backup=——backup=1或 backup=0 backup=1表示分区可以列出在备份/恢复列表中,而 backup=0确保该分区不会出现在备份列表中。
wipeingui——使分区显示在GUI中,允许用户在高级擦除菜单中选择擦除。
wipeduringfactoryreset——分区将在恢复出厂设置期间被清除。
ignoreblkid——blkid用来确定TWRP正在使用什么文件系统,这个标志将导致TWRP跳过/忽略blkid的结果,只使用fstab中指定的文件系统。
retainlayoutversion——使TWRP在索尼Xperia S等设备的 /data中保留 .layoutversion文件,这些设备使用 /data/media,但仍然有一个单独的 /sdcard分区
display=——为在GUI中列出的分区设置其要显示的名称。
storagename=——为要在GUI的storage(存储)列表中列出的分区设置名称。
backupname=——为GUI备份/恢复列表中列出的分区设置一个备份名称。
length=——通常用于在 /data分区末端预留空白空间,用于存储解密密钥。当Android的完整设备加密启用时,不设置这个可能导致无法加密设备。
canencryptbackup=——设置为1或0以启用/禁用,使TWRP加密该分区的备份,如果用户选择加密(只适用于tar备份,不适用于img镜像)
userdataencryptbackup=——设置为1或0以启用/禁用,使TWRP只加密该分区的userdata部分,某些子文件夹如 /data/app将不会被加密,以节省时间。
subpartitionof=——等号后面加上子分区的分区路径。子分区被视为主分区的“一部分”,例如TWRP自动使 /datadata成为 /data的子分区。这意味着 /datadata将不会出现在GUI条目中,但在对 /data执行这些操作时,/datadata也同时会被清除、备份、恢复、装载和卸载。
recovery.fstab基本不用管,自动识别MTK设备这里只需要改成这样即可解决挂载/mnt/vendor问题

添加OTG和SD卡参数
/usb_otg atuo /dev/block/sdd1 /dev/block/sdd flags=display="USB-Storage";storage;wipeingui;removable;fsflags="utf8"/external_sd vfat /dev/block/mmcblk0p1 /dev/block/mmcblk0 flags=display="MicroSD";storage;wipeingui;removable;fsflags="utf8"
device.mk
Dynamic #设备使用super分区
PRODUCT_USE_DYNAMIC_PARTITIONS := true
fastbootd #设备拥有fastbood模式
PRODUCT_PACKAGES +=
android.hardware.fastboot@1.0-impl-mock
fastbootd
#高通加密支持添加下面
PRODUCT_PACKAGES_ENG +=
qcom_decrypt
qcom_decrypt_fbe
Shipping API level #设备出厂安卓SDK
PRODUCT_SHIPPING_API_LEVEL := 29
Keymaster #设备解密使用的Keymaster版本
PRODUCT_PACKAGES +=
android.hardware.keymaster@4.0
PRODUCT_PROPERTY_OVERRIDES +=
keymaster_ver=4.0
Bug修复
触摸修复
首先要有内核日志,可以到/sys/fs/pstore/查看

搜索关键词:touch
loading ‘tp/20271/FW_NF_ILI9882N_BOE_B8.bin 可以看到加载的文件,如果手机没有就上Github搜


直接把这些文件薅过来就可以。
有些无法触摸是因为内核原因,
对于引导文件lk限制的无法触摸是无法修复的。比如金立M6
屏幕反向,触摸却是正向的?
在 BoardConfig.mk 中加入 BOARD_HAS_FLIPPED_SCREEN:= true 这行代码即可解决
屏幕反的,触摸也是反的?
RECOVERY_TOUCHSCREEN_SWAP_XY:= true——在X轴和Y轴之间交换触摸映射
RECOVERY_TOUCHSCREEN_FLIP_Y:= true——翻转触摸y轴的值
RECOVERY_TOUCHSCREEN_FLIP_X:= true——翻转触摸x轴的值
修复 CPU 温度[From xiaoleGun]
使用 adb shell + grep命令在手机节点里搜索 type 关键词。
1 | xiaolegun@xiaoleGundeMac-Pro # adb shell 'grep "cp_master" /sys/class/thermal/*/type' |
我这里选用 cp_master节点来读取温度。我的节点路径为 /sys/class/thermal/thermal_zone54在后面添加 temp 来读取温度,你可以使用 cat来检测节点是否可以正常读取温度
1 | adb shell 'cat /sys/class/thermal/thermal_zone54/temp' |
如果返回如
1 | 28000 |
这种类似的数值,那多半是没有问题的。
我们在 BoardConfig.mk 中加入
1 | TW_CUSTOM_CPU_TEMP_PATH := "/sys/class/thermal/thermal_zone54/temp" |
至此 cpu 温度就修复好了。
刷入TWRP,进入却不能触摸?
有些手机限制了引导加载程序,进入rec模式不提供触摸支持,只有按键可以用,这种情况一般会发生在只使用按键进行选择的Recovery
比如:金立M6 Plus
没有打开触摸驱动
vivo的oled屏幕没有触摸,例如:vivo y7s 正在研究中
没有MTP
参考Fix USB · momo54181/android_device_oppo_PACM00@df35936
开机状态下打开ADB/MTP/ADB&MTP模式,然后查看 /config/usb_gadget/g1/里的idVendor和 idProduct 文件对照替换即可。
修复OTG【OPPO/Realme/Oplus】
write /sys/class/power_supply/usb/otg_switch 1
write /sys/class/oplus_chg/usb/otg_switch 1

设备树生成和TWRP编译报错
TWRP编译及设备树报错解决合集 | Momo5418’s Blog
Data解密
CaptainThrowback/android_device_qcom_twrp-common:高通 SoC 的 TWRP 标准设备文件
其他
编译时长参考
安卓6.0:25min
安卓7.0:30min
安卓8.0:35min
安卓9-10:40min
安卓11:50min
安卓12:1h
…
参考
BoardConfig.mk 的 TWRP 标志 |XDA 论坛 (xdaforums.com)
FAQ 常问问题 来自 ℳℓ矜ℳℓ持 - 酷安 (coolapk.com)
android - TWRP Recovery 编译教程 - 个人文章 - SegmentFault 思否
为新设备编写Recovery device tree)——链接挂了
Razer Phone TWRP 适配心得 - 哔哩哔哩 (bilibili.com)
翻译:【XDA论坛】教程:如何手动编译TWRP Recovery - 知乎 (zhihu.com)
【刷机】首发安卓TWRP和Magisk集成到Boot分区视频教学_哔哩哔哩_bilibili
出厂安卓11的机型之VAB架构的详细分析 来自 Rannki - 酷安 (coolapk.com)
(译) 如何编译 TWRP recovery - 一繁 (yiyitec.com)
- 感谢您的赞赏






