把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配置等。

同时,你需要有一点命令行操作的基本能力(你可能需要手动编译一些工具),这对新手不太友好。

移植步骤

  1. 下载一个与要移植的ROM同版本的A/B GSI镜像作为底包。(我本人可以基于8.1移植9.0,当然,这需要额外打补丁,建议新手先从同版本开始移植开始,有经验了再尝试跨版本移植)
  2. 利用simg2img工具把ROM镜像转换为标准ext4格式:
    simg2img system_arm64_ab.img base_ab_raw.img
  3. 同理,将待移植的A-only镜像也转换为ext4镜像:
    simg2img system_arm64_a.img system_a_raw.img
  4. 进入root用户模式(避免权限不足导致出错):
    sudo -s
  5. 创建目录,以便把刚才转换完的镜像挂载上去:
    mkdir /mnt/ab; mkdir /mnt/a
  6. 挂载A/B镜像
    mount -o rw,noatime base_ab_raw.img /mnt/ab
  7. 挂载A-only镜像
    mount -o rw,noatime system_a_raw.img /mnt/a
  8. 在A-only镜像中创建system文件夹
    mkdir /mnt/a/system
  9. 为system文件夹设置SELinux权限:
    setfattr -n security.selinux -v u:object_r:system_file:s0 /mnt/a/system
  10. 设置system文件夹的权限
     chmod 755 /mnt/a/system
  11. 删除A/B镜像中的system文件夹
    rm -fr /mnt/ab/system
  12. 把A/B根目录下的所有文件都拷贝到A-only中,这些东西很重要:
    cp -Raf /mnt/ab/* /mnt/a/
  13. 卸载A/B镜像
    umount /mnt/ab
  14. 卸载移植好的A/B镜像
    umount /mnt/a
  15. 用img2simg把移植好的A/B镜像转换为sparse格式
    img2simg system_a_raw.img system_arm64_ab_new.img
  16. 完成,刷机体验吧!

如果中间出现了错误(error),最终制作成的镜像可能无法启动。
如果你的手机系统分区本身比较小,不能装下要移植的A-only镜像,就必须自己手动创建一个大小合适的镜像,具体可参照以下步骤

  1. 创建一个新的镜像
    fallocate -l 2G system_ab_raw_small.img
  2. 把该镜像文件格式化为ext4格式
    mkfs.ext4 system_ab_raw_small.img
  3. 挂载新镜像
    mount -o rw,noatime system_ab_raw_small.img /mnt/ab
  4. 挂载前文移植好的A/B镜像
    mount -o ro system_a_raw.img /mnt/a
  5. 把文件拷贝到新建的镜像中
    cp -Raf /mnt/a/* /mnt/ab/
  6. 卸载新镜像
    umount /mnt/ab
  7. 卸载旧镜像
    umount /mnt/a
  8. 把新镜像转换为sparse格式
    img2simg system_ab_raw_small.img system_arm64_ab_new_small.img
  9. 完成

声明: 本文由(九面相柳)原创编译,转载请保留链接: 把A-only的ROM移植为A/B(system-as-root) ROM

把A-only的ROM移植为A/B(system-as-root) ROM:1 条评论

    1. # 网友评论
      Henry-ZHR:

      大佬,有没有 A/B ROM 转回 A-only 的教程

      2020-07-28 16:51 回复

发表评论