Android User 挂载vendor
🤖

Android User 挂载vendor

Tags
Android
data
Jun 5, 2023

背景

需要在一个user版本的Android 11上,对vendor目录新增一些文件。
在userdebug版本下,Android是允许使用adb remount对system、vendor目录重新挂载的,但是user版本的不行。
然后为了vendor可写,踩了比较多坑。
 

自行编译生成vendor.img

利用Android 自带的build_image.py 进行编译
python build/tools/releasetools/build_image.py ./mytmp/ vendor_version.txt vendor.img ./result
my_tmp目录下存放了vendor.img中所需的文件,一些Google原生的文件,是从原版vendor.img下copy出来的。
vendor_version.txt
BOARD_FLASH_BLOCK_SIZE=131072 TARGET_OUT_VENDOR_SYSTEM_IMG_ARGS="--sparse" TARGET_USERIMAGES_SPARSE_EXT_DISABLED=true mount_point=vendor fs_type=ext4 ext_mkuserimg=/home/moon/april/pix5/out/host/linux-x86/bin/mkuserimg_mke2fs partition_size=838860800
一些文件需要复制到/usr/bin
sudo cp ./out/host/linux-x86/bin/e2fsdroid /usr/bin/e2fsdroid
 
将镜像格式转换为Android设备的模式
img2simg vendor.img vendor_new.img
 
将自己编译的vendor.img刷入手机后,系统无法正常启动,排查发现Google对各个分区及镜像存在校验,自己编译的img无法通过校验

创建一个厂商进行开发

在设置完相关的配置文件编译完成后,发现编写的配置为generic_x86_64的,也就是在模拟器运行的系统。这和****BoardConfig.mk****的配置有关。随后更换为pixel 5也就是redfin的配置,但是还是缺少配置,比如system-ui,还是没有编译成功。
随后意识到每一个厂商定义的产品都是基于自己的机型的,与手机设备的物理属性强相关,不同设备的驱动也都大不相同,基于pixel构建一个新的系统从理论上来讲是可行的,但是需要对Android配置以及pixel 5 设备都有很深刻的了解。

基于pixel自定义生成vendor.img

跟着文章操作,但是编译时发现缺少文件,由于机型和版本都不太对应,Android11新增了verity boot。没有继续尝试

修改vbmeta.img进行校验绕过,该img主要作用就是进行校验

获取设备校验状态
adb shell getprop ro.boot.veritymode adb shell getprop ro.vendor.veritymode
主要是ro.boot.veritymode和avb。****
但是修改完,手机设备还是陷入无限开机重启。随后细看文章发现这样一段话
在部分机型中,可能由于vbmeta.img的验证导致设备无法启动,验证启动(Verified Boot)是Android一个重要的安全功能,主要是为了访问启动镜像被篡改,提高系统的抗攻击能力, 简单描述做法就是在启动过程中增加一条校验链,即 ROM code 校验 BootLoader,确保 BootLoader 的合法性和完整性,BootLoader 则需要校验 boot image, 确保 Kernel 启动所需 image 的合法性和完整性,而 Kernel 则负责校验 System 分区和 vendor 分区。
也就是说 校验vendor分区的代码位于Kernel中。

编译Kernel

官方文档编译一把梭
文档上的分支写的是Android 13的,查阅资料讲,不影响,可直接使用。
查阅发现是要先预置一些文件,但是这些文件是要push到vendor目录下的,但是vendor是只读,绕回去了又。

adb disable-verity & adb remount

在android 原生的系统下,选择的编译选项是userdebug的话,是允许通过adb disable-verity 来关闭Verity 然后再 adb remount 将vendor和system分区重新挂载为可读可写的。
但是我在一开始就尝试过adb disable-verity 显示是失败的。这次的执行还是显示失败
aob root adbd is already running as root ~/oct/pix5 》 adb disable-verity verity cannot be disabled/enabled-user build
 
总结下来就是userdebug版本允许重新挂载,但是user不允许。然后在使用adb remount 时,系统判断当前系统时认为当前系统为user,然后不允许remount ,提示verity cannot be disabled/enabled-user build
根据提示信息去源码中找,找到/pix5/system/core/set-verity-state/set-verity-state.cpp 的这段代码
// Should never be possible to disable dm-verity on a USER build // regardless of using AVB or VB1.0. if (!__android_log_is_debuggable()) { printf("verity cannot be disabled/enabled - USER build\\n"); return 0; }
也就是这里没有通过校验,然后return了。
直接注释该代码然后重新编译。
或者直接找到编译的disable-verity 进行一个patch,得到一个返回True的程序
下载地址:disable-verity
运行完重启设备,然后重新挂载即可。
notion image
notion image