OrangeFox Recovery编译记录

基于TWRP修改的,界面挺帅

问题:

  1. /sbin/foxstart.sh找不到
  2. 系统开机卡第一界面
  3. App Manager用不了
  4. 中文显示为口口

解决

  1. Recovery log报错/sbin/foxstart.sh not found
    这个脚本在Vendor仓库里 https://gitlab.com/OrangeFox/Vendor,当make recoveryimage完成后,在/out/target/product/dumpling/会生成recovery.img,刷进去用也能用,但会少一些OrangeFox的Vendor Files。
    所以这个Vendor仓库的OrangeFox.sh脚本的作用很简单,对recovery.img解包,recovery.img包含恢复内核和recovery-ramdisk.img,将Vendor Files打
    包进ramdisk。例如foxstart.sh打包进/sbin等。然后重新打包生成OrangeFox-Unofficial-dumpling.img,最后生成刷机包,这时候可以直接利用fastboot刷入了img,或者rec刷入刷机包。
    一开始我的解决方法是编译完后,手动执行vendor/recovery/foxstart.sh,但这样也太憨了。再次排查,我用的是Omni的manifest:https://github.com/minimal-manifest-twrp/platform_manifest_twrp_omni/tree/twrp-9.0,build/make来自google:https://android.googlesource.com/platform/build/+/refs/tags/android-9.0.0_r47,因此修改下twrp-extras.xml,修改为OrangeFox提供的build/make,与OrangeFox的manifest保持一致。

  2. 系统开机卡壁纸界面
    Taichi的锅,多次测试,一开就卡开机壁纸界面。所以利用Magisk_Manager_Recovery在Recovery模式下禁用Taichi,可是奇怪的是,前几天我咋用的好好的。

  3. app manager用不了
    同1,甚至还多出了一个Magisk管理功能,🐂🍺。

  4. 中文乱码
    commit记录,我拉的是R10.1源码,这个bug在master修的。。看了下,大概是字体的问题,英文字体无法显示中文,因此显示为口口。解决方法,它使用fontoverride修改中文字体为DroidSansFallback.ttf。

魔改

  1. 魔改platform_manifest_twrp_omni(2020/2/17换成fox提供的mainifest)
  2. 魔改BoardCoinfig.mk(站在前人的肩膀上)

To-do

  1. 完全测试(并未刷机)
  2. 删除MIUI OTA相关的Stuff(我是一加!)
  3. 完善编译脚本,将device tree从local_manifest移除
  4. 加入ServerChan推送,编译好推送一波
  5. System as root有什么用
  6. magiskboot是干嘛的
  7. 一些变量没搞清楚,如下
    1
    2
    3
    4
    OF_NO_TREBLE_COMPATIBILITY_CHECK    # check compatibility.zip
    FOX_USE_TWRP_RECOVERY_IMAGE_BUILDER # use twrp image builder for repacking
    OF_SUPPORT_PRE_FLASH_SCRIPT #script before flash (except rom)
    OF_USE_TWFUNC_REBOOT_FUNCTION

2020/2/16更新:

console的中文依旧显示不了,试试R10.0的源码。

2020/2/17更新:

console的中文搞定了,Fox的REC有一个终端使用等宽字体设置,如果勾起,在资源console中就会使用gui/theme/portrait_hdpi/resources/images.xml中设置的字体:

1
<font name="fixed" filename="RobotoMono.ttf" size="34"/>

不知道为什么,最新的源码在gui/theme/extra-languages/languages/zh_CH.xml中去掉了对资源”fixed”的重载,所以加上:

1
<resource name="fixed" type="fontoverride" filename="DroidSansFallback.ttf" scale="100" />

就搞好了,并且我fork了一份顺便完善了一下繁体中文。
https://gitlab.com/lyq1996/Recovery/-/commit/7c8335b053597d061d25663a9261dddcf9ef0b6c

2020/2/18更新:

加密data分区情况下,输错锁屏密码,TWRP Crash。也许我无能为力了。

2020/2/19更新:

初步定位:问题
失败情况下auth_token_len过长,数组char token_hex[auth_token_len]出问题。

因为没搞清楚synthetic password是什么意思,当synthetic password时,会使用Decrypt_User_Synth_Pass(user_id, Password)这个函数去解密,如果不是synthetic password那么继续从Decrypt_User(const userid_t user_id, const std::string& Password)走下去。

但很奇怪的是,使用Gatekeeper验证密码的时候,却不处理这里的ret != 0的情况https://gitlab.com/lyq1996/Recovery/-/blob/master/crypto/ext4crypt/Decrypt.cpp#L1312,因此导致auth_token_len未初始化,进而导致数组char token_hex[auth_token_len]过长。

值得一提的是,Gatekeeper会在response中包含一个Timeout,超时未到之前不处理request。但TWRP源码中并未处理这个timeout,Decrypt_User这个函数返回值只有true or false。我临时的方法是ret != 0时return false。经验证,进TWRP输错密码不Crash了。

起初我以为synthetic password是复杂密码的意思,但从图案改成复杂密码后,依旧不管用。(Decrypt_User_Synth_Pass有处理ret != 0的情况)

至此,适用于一加5T的REC只剩下测试了。

编译脚本

一些环境变量每次都定义很麻烦,所以简单写了一个编译脚本,后续还需定义更多环境变量。一开始用/bin/sh,竟不支持source和lunch,遂换成bash。

2020/2/19更新:

加入server酱推送。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash
# ./build.sh 1 to make clean before make
serverchan_enable="1" # Enable ServerChan
serverchan_sckey="" # ServerChan api key
work_path=$(dirname $(readlink -f $0))
code_path=/home/ubuntu/rec
tree_path=/home/ubuntu/android_device_oneplus_dumpling

if [ -n "$1" ]; then
clean_flag=$1
else
clean_flag="0"
fi

# export OrangeFox flags
export OF_ALLOW_DISABLE_NAVBAR="0"
export OF_DISABLE_MIUI_SPECIFIC_FEATURES="1" # Remove MIUI staff
export TW_DEVICE_VERSION="R10.1"
export BUILD_TYPE="Beta"

# source directory
cd $code_path

# prepare tree
if [ -d "device/oneplus/dumpling" ]; then
rm -rf device/oneplus
fi
echo "copy $tree_path to device/oneplus"
mkdir -p device/oneplus
cp -r $tree_path device/oneplus/dumpling

# prepare modifed AromaFM.zip modify
# backup origin AromaFM.zip
if [ ! -f "vendor/recovery/FoxFiles/AromaFM/AromaFM-b.zip" ]; then # if build canceled.
echo "backup and replace AromaFM.zip to support Chinese"
cp vendor/recovery/FoxFiles/AromaFM/AromaFM.zip vendor/recovery/FoxFiles/AromaFM/AromaFM-b.zip
cp $work_path/AromaFM.zip vendor/recovery/FoxFiles/AromaFM/AromaFM.zip
fi

source build/envsetup.sh
lunch omni_dumpling-eng
if [ "$clean_flag" = "1" ]; then
echo "make clean before make"
make clean
fi
make recoveryimage

# restore origin AromaFM.zip
echo "restore origin AromaFM.zip"
mv vendor/recovery/FoxFiles/AromaFM/AromaFM-b.zip vendor/recovery/FoxFiles/AromaFM/AromaFM.zip

# remove tree
rm -rf device/oneplus

if [ -f "$work_path/nohup.out" ]; then # copy log
log_path=$work_path/$(date "+%Y-%m-%d-%H-%M-%S").log
cp $work_path/nohup.out $log_path
rm $work_path/nohup.out
fi

if [ "$serverchan_enable" = "1" ]; then
curl -s "http://sc.ftqq.com/$serverchan_sckey.send?text=编译TWRP完成啦" -d "&desp=log:${log_path}" &
fi

一些图片




OrangeFox Recovery编译记录

https://lyq.blogd.club/2020/02/15/fox-rec/

Author

lyq1996

Posted on

2020-02-15

Updated on

2022-08-15

Licensed under

Comments