如何编译自己的twrp(翻译自官方文档)

原创
01/08 15:36
阅读数 2.3K

自己编译TWRP

TWRP的3.x版本全部开源了,可以自己来编译了。这个教程不是一步一步来教你的傻瓜式教程。如果你对基本的linux的命令不熟悉,那么你可能做不到编译AOSP,注:编译TWRP需要在编译AOSP的环境里进行。

目前可以在以下版本的系统源码里编译TWRP:Omni 5.1、Omni 6.0、Omni 7.1、Omni 8.1、CM 12.1、CM 13.0、CM 14.1、CM 15.1 ,建议使用Omni 7.1。如果在CM系统源码里编译,可能会遇到一些小问题。如果不知道怎么解决这些问题,就替换成Omni吧。

如果使用CM,需要将TWRP源码放到 bootable/recovery-twrp 文件夹下面,并且在你的 BoardConfig.mk 里面设置变量 RECOVERY_VARIANT := twrp ,TWRP源码地址

选择最新的可用的分支。如果在Omni源码里编译,是不需要这一步的,因为Omni已经包含了TWRP源码。但是如果用旧版本的Omni源码,可能需要最新的分支(最新的分支在旧版本的编译树里面是可以编译成功的)。

如果只需要编译TWRP,你可以尝试在最小的树里面编译,可以尝试使用这个manifest。这个应该可以在大多数的情况下正常编译,但是你需要在这个manifest提供更多的仓库。地址:https://github.com/minimal-manifest-twrp

编译前的准备

注意:如果你添加或修改了flag,需要在编译前执行 make clean 或者 make clobber ,否则修改不会生效。

现在有了源码,你需要根据你编译的设备设置或修改一些flag。找到你设备的 BoardConfig.mk 文件。这个文件一般在 devices/manufacturer/codename 目录下面,(如:devices/xiaomi/libra)。

你的 BoardConfig.mk 文件需要包含 architectureplatform 设置,一般情况下别人都会去创建这个文件的,但是如果你想编译自己的设备,你就需要自己添加这些了。如果没有这些配置,recovery可能在启动期间会出现 seg fault 错误,并且屏幕一直会循环出现TWRP的图标。

我们通常将自己的flag放在 BoardConfig.mk 最下面,并以#twrp开头,可以使用 TW_THEME 来设置主题,TWRP现在使用缩放和拉伸来适应不同的屏幕。目前有5种设置方式:portrait_hdpi、portrait_mdpi、landscape_hdpi、landscape_mdpi、watch_mdpi。对于竖着的设备(如手机),选择720x1280或更高的方案。对于横着的设备(如平板),需要选择1280x720或更高的方案:TW_THEME := portrait_hdpi

主题是不会旋转的,现在也没有旋转选项,如果你发现屏幕旋转了,你需要设置一些flag使屏幕旋转正常(这个在最后说明)。

还需要设置以下flag:

  • RECOVERY_SDCARD_ON_DATA := true --开启优化处理 /data/media 目录,用来存储(需要设备刚开始发货的时候,比如Galaxy Nexus)这个设置在这些设备上面不需要设置。如果没有设置这个,并且fstab没有下面几个的引用:/sdcard、/internal_sd、/internal_sdcard、/emmc,将会用虚拟存储来进行自动处理。
  • BOARD_HAS_NO_REAL_SDCARD := true -- 如果TWRP不适合恢复分区,则会关闭SDCARD分区功能,来节省一些空间。
  • TW_NO_BATT_PERCENT := true -- 在不支持电量显示的设备上面关闭电量显示
  • TW_CUSTOM_POWER_BUTTON := 107 -- 给锁屏自定义电源按钮的快捷键
  • TW_NO_REBOOT_BOOTLOADER := true -- 从重启菜单里移除重启到Bootloader按钮
  • TW_NO_REBOOT_RECOVERY := true -- 从重启菜单里移除重启到Recovery按钮
  • RECOVERY_TOUCHSCREEN_SWAP_XY := true -- 互换触摸x和y轴的映射
  • RECOVERY_TOUCHSCREEN_FLIP_Y := true -- 反转触摸的y轴值
  • RECOVERY_TOUCHSCREEN_FLIP_X := true -- 反转触摸的x轴值
  • TWRP_EVENT_LOGGING := true -- 开启触摸事件日志,用来帮助调试触摸屏的问题(不要在发布的时候开启这个,会很快占满日志文件)。
  • BOARD_HAS_FLIPPED_SCREEN := true -- 颠倒屏幕

还可以在recovery源码里的Android.mk查看其他的一些编译设置,其他大部分的设置并不是常用的,在这里就不说明了。

RECOVERY.FSTAB

TWRP2.5及以上版本支持新的resovery.fstab的一些特性,可以用来扩展TWRP的备份/还原功能,不用添加fstab的设置,这些是会自动处理的。

注意TWRP的3.2.0版本只支持fstab的2.0及以上版本,你还需要在九版本的的TWRP上面使用旧的格式(比如下面的格式)。3.2.0版本还支持v1版本的fstab。要在编译里面最大化TWRP的功能,你可以创建twrp.fstab并且使用 PRODUCT_COPY_FILES 在TWRP启动的时候将文件放到 /etc/twrp.fstab,如果在ramdisk找到了twrp.fstab,会把 /etc/recovery.fstab 重命名为 /etc/recovery.fstab.bak,接着把 /etc/twrp.fstab 重命名为 /etc/recovery.fstab。这个会替换fstab的两个文件为设备上的两个文件,用来兼容设备上其他的recovery的功能。 代码: PRODUCT_COPY_FILES += device/lge/hammerhead/twrp.fstab:recovery/root/etc/twrp.fstab

TWRP里面的fstab可以给每个分区列表包含一些 “flags”。

下面是一个Galaxy S4的fstab的例子,我们可以引用:

/boot       emmc        /dev/block/platform/msm_sdcc.1/by-name/boot
/system     ext4        /dev/block/platform/msm_sdcc.1/by-name/system
/data       ext4        /dev/block/platform/msm_sdcc.1/by-name/userdata length=-16384
/cache      ext4        /dev/block/platform/msm_sdcc.1/by-name/cache
/recovery   emmc        /dev/block/platform/msm_sdcc.1/by-name/recovery
/efs        ext4        /dev/block/platform/msm_sdcc.1/by-name/efs                            flags=display="EFS";backup=1
/external_sd     vfat       /dev/block/mmcblk1p1    /dev/block/mmcblk1   flags=display="Micro SDcard";storage;wipeingui;removable
/usb-otg         vfat       /dev/block/sda1         /dev/block/sda       flags=display="USB-OTG";storage;wipeingui;removable
/preload    ext4        /dev/block/platform/msm_sdcc.1/by-name/hidden                            flags=display="Preload";wipeingui;backup=1
/modem      ext4        /dev/block/platform/msm_sdcc.1/by-name/apnhlos
/mdm		emmc		/dev/block/platform/msm_sdcc.1/by-name/mdm

Falgs可以添加到分区列表的尾部,使用空格(空格或Tab)隔开。Flag只会影响被添加的这个分区,不会影响其他的分区,Flag的值使用分号分割,如果值里面有空格,值需要用加引号。 代码: /external_sd vfat /dev/block/mmcblk1p1 flags=display="Micro SDcard";storage;wipeingui;removable 这个分区的flag设置了分区显示名称为"Micro SDcard", wipeingui使这个分区可以在advanced wipe菜单里使用,removable表示有时候这个分区不存在,防止在启动时显示挂载错误。下面是全部的flag列表:

  • removable -- 表示有时候这个分区不存在,防止在启动时显示挂载错误
  • storage -- 此分区可以用来存储,可以在备份、恢复、安装zip的时候使用
  • settingsstorage -- 只有一个分区应该设置为存放设置的分区,这个分区用来存放TWRP的设置文件
  • canbewiped -- 这个分区可以通过后端系统来清除,但是可能不会显示在界面上来手动清除
  • userrmrf -- 重写清除的普通格式类型,并且只允许使用rm -rf命令来清除这个分区
  • backup= -- 必须使用等号,可以为1或0,1代表这个分区显示在备份/恢复的列表里面,0代表不显示在备份/恢复的列表里面
  • wipeingui -- 使这个分区显示在advanced wipe菜单界面,允许清除的时候选择
  • wipeduringfactoryreset -- 在恢复出厂设置时清除这个分区
  • ignoreblkid -- blkid是用来确定TWRP用的是什么文件系统,这个会让TWRP跳过或忽略blkid,只使用fstab里面指定的文件系统
  • retainlayoutversion -- 使TWRP保留设备上面的/data里面的.layoutversion文件,就像Sony Xperia S会使用/data/media,但是还会有一个独立的分区/sdcard
  • symlink= -- TWRP挂载分区时运行额外的挂载命令,一般是使用/data/media创建/sdcard
  • display= -- 界面上显示的这个分区的名称
  • storagename= -- 在存储列表界面上显示的这个分区的存储名称
  • backupname= -- 在备份/恢复界面显示的分区名称
  • length= -- 一般是在/data分区尾部保留空的空间,用来存储Android设备加密时的解密的key,不设置这个可能会导致不能解密设备
  • canencryptbackup= -- 1或0,可以让用户备份这个分区时,选择是否加密
  • userdataencryptbackup= -- 1或0,可以让TWRP只加密这个分区上的userdata部分,一些目录,比如/data/app在备份的时候不会加密
  • subpartitionof= -- 必须使用等号设置子分区的路径,子分区可以被看作是主分区的一部分,TWRP自动使/datadata为/data的子分区,这意味着/datadata不会显示在界面上,但是/datadata在/data被清除、备份、恢复、挂载、卸载时候,执行同样的动作,一个很好的例子,是在LG Optimus G上的3x efs分区: 代码:
/efs1         emmc   /dev/block/mmcblk0p12 flags=backup=1;display=EFS
/efs2         emmc   /dev/block/mmcblk0p13 flags=backup=1;subpartitionof=/efs1
/efs3         emmc   /dev/block/mmcblk0p14 flags=backup=1;subpartitionof=/efs1

这3个分区可以在一个“EFS”点进入,允许这3个分区使用这一个点进行备份或恢复。

对于TWRP的3.2.0版本,TWRP现在支持fstab的2版本,可以在这里找到好几年的设备。我知道我们采取这个的速度很慢,但是我们也没看到fstab版本2有什么大的优势,而且fstab版本2经常被用在Android的recovery,我不想因为TWRP的flag出现在fstab导致rom编译时会崩溃或发生其他问题。fstab的版本2是自动支持的,不需要添加任何编译设置,一些经常使用的版本1的fstab的格式还是有效的,可能会在同一个fstab同时使用版本1和版本2。TWRP3.2.0版本还在v1版本里支持星号的通配符,这个对usb otg和多分区是非常有用的,还要注意v2版本的fstab还没有进行大量的测试,因此要将v2版本发给用户使用前,需要进行测试(你应该在任何操作之前,都进行测试)。

下面是一个v1版本的fstab,使用了usb otg驱动的通配符,当插上存储设备时全部分区都会显示在可用的存储设备列表上面: /usb-otg vfat /dev/block/sda* flags=removable;storage;display=USB-OTG

下面是一个v2版本的fstab,同样的设备上面应该是可以工作的。这个情况下,内核会通知我们有设备连接上或移除了: /devices/soc.0/f9200000.ssusb/f9200000.dwc3/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto

除了v2版本的fstab,还可以包含v1格式的/etc/twrp.flags,twrp.flags文件可以用来补充v2版本的fstab,额外的分区不能包含在v2版本的fstab,并且重写v2版本里的fstab。比如,我有一个华为设备,它有下面的v2版本的fstab,/etc/recovery.fstab:

# Android fstab file.
#<src>                                                  <mnt_point>         <type>    <mnt_flags and options>                       <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
/dev/block/bootdevice/by-name/system    /system    ext4    ro,barrier=1    wait,verify
/dev/block/bootdevice/by-name/cust    /cust    ext4    ro,barrier=1    wait,verify
/devices/hi_mci.1/mmc_host/mmc1/*                       auto                auto      defaults                                      voldmanaged=sdcard:auto,noemulatedsd
/devices/hisi-usb-otg/usb1/*                            auto                auto      defaults                                      voldmanaged=usbotg:auto
/dev/block/bootdevice/by-name/userdata         /data                f2fs     nosuid,nodev,noatime,discard,inline_data,inline_xattr wait,forceencrypt=footer,check
/dev/block/bootdevice/by-name/cache         /cache                ext4      rw,nosuid,nodev,noatime,data=ordered wait,check
/dev/block/bootdevice/by-name/splash2         /splash2                ext4      rw,nosuid,nodev,noatime,data=ordered,context=u:object_r:splash2_data_file:s0 wait,check
/dev/block/bootdevice/by-name/secure_storage         /sec_storage                ext4      rw,nosuid,nodev,noatime,discard,auto_da_alloc,mblk_io_submit,data=journal,context=u:object_r:teecd_data_file:s0 wait,check

此外我还包含了下面这个文件/etc/twrp.flags:

/boot         emmc       /dev/block/platform/hi_mci.0/by-name/boot
/recovery     emmc       /dev/block/platform/hi_mci.0/by-name/recovery   flags=backup=1
/cust         ext4       /dev/block/platform/hi_mci.0/by-name/cust       flags=display="Cust";backup=1
/misc         emmc       /dev/block/platform/hi_mci.0/by-name/misc
/oeminfo      emmc       /dev/block/platform/hi_mci.0/by-name/oeminfo    flags=display="OEMinfo";backup=1
/data         f2fs       /dev/block/dm-0
/system_image emmc       /dev/block/platform/hi_mci.0/by-name/system

twrp.flags的开头两行添加了boot和recovery分区,完全没有v2版本的fstab。/cust这一行意思是告诉TWRP允许用户备份cust分区,并且设置了一个显示的名称。/misc分区只出现在twrp.flag文件。类似/misc分区,/oeminfo分区允许备份,并且设置了一个名称。/data行是必需的,因为这是一个华为设备,很多华为设备都是加密的,并且加密使用的是华为特定的二进制文件,并且使用了多种用户不可修改的默认密码。我们在recovery里面使用华为的二进制文件自动解密设备。/data行告诉TWRP在挂载的时候使用 /dev/block/dm-0 来替代 /dev/block/bootdevice/by-name/userdata。最后,/system_image行添加了一个system镜像用来选择备份和恢复。

同步完Omni或CM源码后,执行脚本:./build/envsetup.sh,使用lunch选择好设备后,使用下面的命令编译: make clean && make -j# recoveryimage

上面命令里面的#可以替换为你电脑的cpu核心数量。如果你编译的是特殊的设备,如三星,需要执行下面的命令: make -j# bootimage

很多的三星设备有一个包含在外部的boot镜像的ramdisk里的recovery,跟recovery分区是分开的。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部