如何編譯本身的twrp(翻譯自官方文檔)

本身編譯TWRP

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 文件須要包含 architectureplatform 設置,通常狀況下別人都會去建立這個文件的,可是若是你想編譯本身的設備,你就須要本身添加這些了。若是沒有這些配置,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:

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

相關文章
相關標籤/搜索