首页 Razer Phone TWRP 适配心得
文章
取消

Razer Phone TWRP 适配心得

Razer Phone TWRP 适配心得

暑假的时候搞到一台雷蛇手机,因为官方的 TWRP 功能基本上都是残废的,就想自己适配个

不过这也是第一次适配,故把第一次的适配步骤写在博客里

语文不是很好,所以可能说的不是很明白,见谅哈哈哈

配置编译环境

TWRP 的编译环境要求跟 Android 的一样

1
2
3
4
5
6
7
8
# 安装必要依赖
sudo apt update
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev repo git

# 同步 TWRP 源码
mkdir twrp && cd twrp
repo init -u https://github.com/minimal-manifest-twrp/platform_manifest_twrp_omni -b twrp-9.0 --depth=1
repo sync

初始化编译必要文件

不管是编译 Android 还是 TWRP,这些文件都是必要的 Android.mk, AndroidProduct.mk, BoardConfig.mk, omni_cheryl.mk 这几个文件可以直接从 Lineage 那边拿,然后进行修改

Android.mkAndroidProduct.mkomni_cheryl.mk 一般情况下无需进行修改

编译 TWRP 需要对 BoardConfig.mk 等文件进行修改

修改 BoardConfig.mk

首先需要添加几个 TWRP 必须要的 Flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ALLOW_MISSING_DEPENDENCIES = true # 由于同步的只有 TWRP 源码,编译时需要打开这个
VENDOR_SECURITY_PATCH := 2025-07-05 # 需要加入补丁更新日期来回避防回滚机制
TW_THEME := portrait_hdpi # TWRP 要使用的主题
TW_BRIGHTNESS_PATH := "/sys/devices/soc/c900000.qcom\x2cmdss_mdp/c900000.qcom\x2cmdss_mdp:qcom\x2cmdss_fb_primary/leds/lcd-backlight/brightness" # 亮度调节的内核节点
TW_MAX_BRIGHTNESS := 255 # 设置最高亮度
TW_DEFAULT_BRIGHTNESS := 155 # 设置最低亮度
TW_EXTRA_LANGUAGES := ture # 设置是否添加亚洲语言
TW_IGNORE_MISC_WIPE_DATA := true # 是否在 wipe data 时忽略 misc
TW_SCREEN_BLANK_ON_BOOT := true # 这个我也不知道什么作用
TW_NO_EXFAT_FUSE := true # 这个我也不知道什么作用
TW_INCLUDE_CRYPTO := true #是否添加加密支持
TARGET_CRYPTFS_HW_PATH := vendor/qcom/opensource/commonsys/cryptfs_hw # 解密所需依赖的源码路径
RECOVERY_SDCARD_ON_DATA := true # 设置内部存储的数据是否在 data 分区
BOARD_HAS_NO_REAL_SDCARD := true # 这个我也不知道什么作用
BOARD_PROVIDES_GPTUTILS := true # 这个我也不知道什么作用
TW_USE_TOOLBOX := true # 是否使用 ToolBox
TWRP_INCLUDE_LOGCAT := true # 是否启用 logcat
TARGET_USES_LOGD := true # 是否启用 logcat

# 如果是 A/B 分区的话还得加入这些
# A/B OTA
AB_OTA_UPDATER := true
BOARD_USES_RECOVERY_AS_BOOT := true
BOARD_BUILD_SYSTEM_ROOT_IMAGE := true

修改 device.mk

由于雷蛇是 A/B 分区,需要在设置里配置一些 A/B 分区的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PRODUCT_PLATFORM := msm8998 # 定义平台

# A/B
AB_OTA_UPDATER := true # 是否打开 A/B 支持

AB_OTA_PARTITIONS += \ # 定义使用 A/B 特性的分区
    boot \
    system \
    vendor

AB_OTA_POSTINSTALL_CONFIG += \ 
    RUN_POSTINSTALL_system=true \
    POSTINSTALL_PATH_system=system/bin/otapreopt_script \
    FILESYSTEM_TYPE_system=ext4 \
    POSTINSTALL_OPTIONAL_system=true

PRODUCT_PACKAGES += \
    otapreopt_script \
    cppreopts.sh \
    update_engine \
    update_verifier \
    update_engine_sideload

# Boot control
PRODUCT_PACKAGES += \
    android.hardware.boot@1.0-impl \
    android.hardware.boot@1.0-service \
    bootctrl.msm8998 \

PRODUCT_PACKAGES_DEBUG += \
    bootctl

PRODUCT_STATIC_BOOT_CONTROL_HAL := \
    bootctrl.msm8998 \
    libcutils \
    libgptutils \
    libz

并在 omni_cheryl.mk 里调用

1
$(call inherit-product, device/razer/cheryl/device.mk)

配置 TWRP 分区表

新建文件夹 recovery/root/etc

新建文件 twrp.fstab

该文件就是分区表,格式如下

1
2
3
4
5
6
7
8
9
10
11
# mount point   fstype     device                                   device2                       flags
# 定义挂载点  定义文件系统类型 定义挂载原块文件路径                                                       定义一些特性
/boot           emmc       /dev/block/bootdevice/by-name/boot                                     flags=display="Boot";slotselect
/misc           emmc       /dev/block/bootdevice/by-name/misc                                     flags=display="Misc"
/data           ext4       /dev/block/bootdevice/by-name/userdata                                 flags=encryptable=ice:aes-256-cts
/system         ext4       /dev/block/bootdevice/by-name/system                                   flags=slotselect;backup=0
/system_image	emmc	   /dev/block/bootdevice/by-name/system					  flags=slotselect
/vendor		ext4       /dev/block/bootdevice/by-name/vendor					  flags=slotselect;display="Vendor";backup=0;wipeingui
/vendor_image	emmc	   /dev/block/bootdevice/by-name/vendor					  flags=slotselect

/usbstorage     vfat       /dev/block/sdg1                          /dev/block/sdg                flags=fsflags=utf8;display="USB Storage";storage;wipeingui;removable

关于 flags

1
2
3
4
5
# 如果是 A/B 设备,请给使用 A/B 特性的分区定义 slotselect
# 用 backup 来定义可备份分区
# display 用来自定义分区名
# encryptable 来定义加密类型
# removable 用来定义可否热拔插

关于 recovery.wipe

这个我也不知道有什么用,不过我看 A/B 分区的机子都有,我就照着格式搞了

格式如下

1
2
3
4
5
6
7
8
9
10
# All the partitions to be wiped (in order) under recovery.
/dev/block/bootdevice/by-name/system_a
/dev/block/bootdevice/by-name/system_b
/dev/block/bootdevice/by-name/vendor_a
/dev/block/bootdevice/by-name/vendor_b
/dev/block/bootdevice/by-name/userdata
# Wipe the boot partitions last so that all partitions will be wiped
# correctly even if the wiping process gets interrupted by a force boot.
/dev/block/bootdevice/by-name/boot_a
/dev/block/bootdevice/by-name/boot_b

预编译内核

这一步可有可无,如果您有现成的内核源码,则可以拿内核源码编译

如果没有内核源码或官方未开源则可以从官方包的 boot.img 中提取内核

具体怎么操作可以前往 boot.mokeedev.com

这里不在阐述

有预编译内核后请在 BoardConfig.mk 中定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Prebuilt Kernel
BOARD_KERNEL_BASE := 0x00000000
BOARD_KERNEL_IMAGE_NAME := Image.gz-dtb
BOARD_KERNEL_OFFSET = 0x00008000
BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_TAGS_OFFSET := 0x00000100
BOARD_RAMDISK_OFFSET := 0x01000000

TARGET_PREBUILT_KERNEL := device/razer/cheryl/prebuilt/kernel

BOARD_KERNEL_CMDLINE := androidboot.console=ttyMSM0 androidboot.hardware=qcom
BOARD_KERNEL_CMDLINE += user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3
BOARD_KERNEL_CMDLINE += service_locator.enable=1
BOARD_KERNEL_CMDLINE += swiotlb=2048
BOARD_KERNEL_CMDLINE += firmware_class.path=/vendor/firmware_mnt/image
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive

init.rc

不同机型,init 部分也不一样

您可以参考 cheryl 的 init

https://github.com/Lynnrin/android_device_razer_cheryl/tree/twrp-9.0/recovery/root

bootctrl 和 gpt-utils

如果你的设备采用 A/B 分区,那必须编译这两个组件

确保 tree 里面有编译 bootctrlgpt-utils

这两个东西可以从其它机型的 tree 里面拿,通用的

可以参考这两条 commit bootctrl: https://github.com/Lynnrin/android_device_razer_cheryl/commit/7691eb8dea85dfcb8c92773ad54fb480f8a5e9f7

gpt-utils: https://github.com/Lynnrin/android_device_razer_cheryl/commit/fd3020e57d31ab30473f62d5340b1bc9d2b020a2

添加 Vendor Blobs

这一步需要添加厂商闭源的组件,以保证 TWRP 的正常运行

可以参考这条 commit 来添加

开始编译

上面的东西都配置好后就可以开始编译了

1
2
3
4
5
. build/envsetup.sh
lunch omni_cheryl-eng
mka bootimage
# 如果您不是 A/B 分区
mka recoveryimage

编译完成

编译完成了,接下来干什么呢

当然是发酷安装逼啊,哈哈哈哈

一些问题

我是 A/B 分区,但编译出来的只有 img 文件,没有 zip 的永久刷入包

你可以参考这个 commit

然后在 TWRP 源码中加入 https://gerrit.omnirom.org/#/c/android_build/+/33182/

来加入对 zip 包的编译

  1. 先抓 log 看看 blobs 有没有不齐

  2. 如果补齐后还是不行,请参考这条 commit 来修复

我源码怎么拉不下来啊

挂梯子

看完了,我还是不懂怎么办

那我也没办法

本文由作者按照 CC BY 4.0 进行授权

小新 Pro 13‘ 2020 macOS 安装教程

黑解(ICCID)证书备份

Comments powered by Disqus.