把A-only的ROM移植为A/B(system-as-root) ROM
(原文地址:点此跳转;翻译:九面相柳;转载时必须附上原文链接与本文链接)
手持A/B分区设备的小伙伴可能有过苦苦等待开发者单独维护一个支持A/B的GSI镜像的经历,别着急,其实将A-only的ROM移植为A/B(SAR)并不复杂,参考本教程,你自己也可以完成。
A-only和A/B的ROM主要区别在于,A-only的 / 下的文件(例如ramdisk中的init.rc)是在boot分区中,而在A/B系统中,它们在system分区下。某种程度上讲,是将 /system 作为 / 使用,它同时承担着ramdisk和system的功能,好处在于这样可以加快系统启动的速度。
A/B分区的设备还引入了来自Chrome OS的更新机制,称为无缝更新,可以在不影响使用的同时,更新设备中的另一套系统,当然,作为用户我们不必过多在意它。
本教程的操作均需要在Linux下完成,因为Windows无法处理我们需要的额外数据,例如文件权限、SELinux配置等。
同时,你需要有一点命令行操作的基本能力(你可能需要手动编译一些工具),这对新手不太友好。
移植步骤
- 下载一个与要移植的ROM同版本的A/B GSI镜像作为底包。(我本人可以基于8.1移植9.0,当然,这需要额外打补丁,建议新手先从同版本开始移植开始,有经验了再尝试跨版本移植)
- 利用simg2img工具把ROM镜像转换为标准ext4格式:
simg2img system_arm64_ab.img base_ab_raw.img
- 同理,将待移植的A-only镜像也转换为ext4镜像:
simg2img system_arm64_a.img system_a_raw.img
- 进入root用户模式(避免权限不足导致出错):
sudo -s
- 创建目录,以便把刚才转换完的镜像挂载上去:
mkdir /mnt/ab; mkdir /mnt/a
- 挂载A/B镜像
mount -o rw,noatime base_ab_raw.img /mnt/ab
- 挂载A-only镜像
mount -o rw,noatime system_a_raw.img /mnt/a
- 在A-only镜像中创建system文件夹
mkdir /mnt/a/system
- 为system文件夹设置SELinux权限:
setfattr -n security.selinux -v u:object_r:system_file:s0 /mnt/a/system
- 设置system文件夹的权限
chmod 755 /mnt/a/system
- 删除A/B镜像中的system文件夹
rm -fr /mnt/ab/system
- 把A/B根目录下的所有文件都拷贝到A-only中,这些东西很重要:
cp -Raf /mnt/ab/* /mnt/a/
- 卸载A/B镜像
umount /mnt/ab
- 卸载移植好的A/B镜像
umount /mnt/a
- 用img2simg把移植好的A/B镜像转换为sparse格式
img2simg system_a_raw.img system_arm64_ab_new.img
- 完成,刷机体验吧!
如果中间出现了错误(error),最终制作成的镜像可能无法启动。
如果你的手机系统分区本身比较小,不能装下要移植的A-only镜像,就必须自己手动创建一个大小合适的镜像,具体可参照以下步骤
- 创建一个新的镜像
fallocate -l 2G system_ab_raw_small.img
- 把该镜像文件格式化为ext4格式
mkfs.ext4 system_ab_raw_small.img
- 挂载新镜像
mount -o rw,noatime system_ab_raw_small.img /mnt/ab
- 挂载前文移植好的A/B镜像
mount -o ro system_a_raw.img /mnt/a
- 把文件拷贝到新建的镜像中
cp -Raf /mnt/a/* /mnt/ab/
- 卸载新镜像
umount /mnt/ab
- 卸载旧镜像
umount /mnt/a
- 把新镜像转换为sparse格式
img2simg system_ab_raw_small.img system_arm64_ab_new_small.img
- 完成
声明: 本文由(九面相柳)原创编译,转载请保留链接: 把A-only的ROM移植为A/B(system-as-root) ROM
大佬,有没有 A/B ROM 转回 A-only 的教程
2020-07-28 16:51 回复