TWRP的3.x版本所有开源了,能够本身来编译了。这个教程不是一步一步来教你的傻瓜式教程。若是你对基本的linux的命令不熟悉,那么你可能作不到编译AOSP,注:编译TWRP须要在编译AOSP的环境里进行。php
目前能够在如下版本的系统源码里编译TWRP:Omni 5.一、Omni 6.0、Omni 7.一、Omni 8.一、CM 12.一、CM 13.0、CM 14.一、CM 15.1 ,建议使用Omni 7.1。若是在CM系统源码里编译,可能会遇到一些小问题。若是不知道怎么解决这些问题,就替换成Omni吧。node
若是使用CM,须要将TWRP源码放到 bootable/recovery-twrp
文件夹下面,而且在你的 BoardConfig.mk
里面设置变量 RECOVERY_VARIANT := twrp
,TWRP源码地址。linux
选择最新的可用的分支。若是在Omni源码里编译,是不须要这一步的,由于Omni已经包含了TWRP源码。可是若是用旧版本的Omni源码,可能须要最新的分支(最新的分支在旧版本的编译树里面是能够编译成功的)。android
若是只须要编译TWRP,你能够尝试在最小的树里面编译,能够尝试使用这个manifest。这个应该能够在大多数的状况下正常编译,可是你须要在这个manifest提供更多的仓库。地址:https://github.com/minimal-manifest-twrpgit
注意:若是你添加或修改了flag,须要在编译前执行 make clean
或者 make clobber
,不然修改不会生效。github
如今有了源码,你须要根据你编译的设备设置或修改一些flag。找到你设备的 BoardConfig.mk
文件。这个文件通常在 devices/manufacturer/codename
目录下面,(如:devices/xiaomi/libra)。后端
你的 BoardConfig.mk
文件须要包含 architecture
和 platform
设置,通常状况下别人都会去建立这个文件的,可是若是你想编译本身的设备,你就须要本身添加这些了。若是没有这些配置,recovery可能在启动期间会出现 seg fault
错误,而且屏幕一直会循环出现TWRP的图标。app
咱们一般将本身的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:
/data/media
目录,用来存储(须要设备刚开始发货的时候,好比Galaxy Nexus)这个设置在这些设备上面不须要设置。若是没有设置这个,而且fstab没有下面几个的引用:/sdcard、/internal_sd、/internal_sdcard、/emmc,将会用虚拟存储来进行自动处理。还能够在recovery源码里的Android.mk查看其余的一些编译设置,其余大部分的设置并非经常使用的,在这里就不说明了。
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列表:
/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分区是分开的。