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分區是分開的。