如何编译本身的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分区是分开的。

相关文章
相关标签/搜索