基于TWRP修改的,界面挺帅
问题:
- /sbin/foxstart.sh找不到
- 系统开机卡第一界面
- App Manager用不了
- 中文显示为口口
解决
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保持一致。系统开机卡壁纸界面
Taichi的锅,多次测试,一开就卡开机壁纸界面。所以利用Magisk_Manager_Recovery在Recovery模式下禁用Taichi,可是奇怪的是,前几天我咋用的好好的。app manager用不了
同1,甚至还多出了一个Magisk管理功能,🐂🍺。中文乱码
见commit记录,我拉的是R10.1源码,这个bug在master修的。。看了下,大概是字体的问题,英文字体无法显示中文,因此显示为口口。解决方法,它使用fontoverride修改中文字体为DroidSansFallback.ttf。
魔改
- 魔改platform_manifest_twrp_omni(2020/2/17换成fox提供的mainifest)
- 魔改BoardCoinfig.mk(站在前人的肩膀上)
To-do
- 完全测试(并未刷机)
- 删除MIUI OTA相关的Stuff(我是一加!)
- 完善编译脚本,将device tree从local_manifest移除
- 加入ServerChan推送,编译好推送一波
- System as root有什么用
- magiskboot是干嘛的
- 一些变量没搞清楚,如下
1
2
3
4OF_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 | #!/bin/bash |