Mac下定制Android ROM

本文最后更新于:2019年4月17日 凌晨

我们经常可以在网络上看到各类的魔改ROM,甚至在Windows上有很多定制ROM的工具,只不过这些工具都会在最终打包的时候内置一些广告应用作为系统应用甚至病毒,实际上这些工具无非就是对常规的各类img文件进行挂载、重打包的过程,由于编译出来的ROM的目录结构大同小异,因此不用做太多的适配,无非都是删除一些系统内置应用、添加所谓杜比音效包、添加Xposed框架、Root之类的(有关Android Root可以参看这篇文章)。由于我常年使用Mac,今天我们就来看看在Mac下如何对ROM进行修改编辑以及重打包吧。

I. Android开机过程

1
加载boot.img(加载linux内核,建立文件系统) => 加载recovery.img或system.img

II. 常见img

1. system.img

  • 系统镜像,包含所有app;二进制文件;字体;配置文件;核心库等;(除kernel外所有android项目);
  • AOSP中out/target/product/$PRODUCT/system目录下所有文件打包而来
  • 通常为Android Sparse Image或者Ext4文件

结构:

  • system/app: android出厂内置应用在此,同时,在这里的app可以获得一些特别的权限。
  • system/framework: android框架在此,不宜乱动,开发者可以使用adb push + 拔电池开关机可以快速验证问题。(前提是eng版本)

2. userdata.img

  • 保存用户,应用信息
  • AOSP中out/target/product/$PRODUCT/data目录下所有文件打包而来
  • 通常为Android Sparse Image或者Ext4文件

结构:

  • /data/app: 所有安装后的app会移至此处,apk被拆成dex和apk,dex为目标文件,apk为资源包
  • /data/data: 应用程序内部存储信息,sharepreference、database,etc

3. ramdisk.img

  • Android的根文件系统
  • AOSP中out/target/product/$PRODUCT/root目录所有文件打包而来
  • 通常为gzip压缩文件(gzip -S .img -d ramdisk.img),解压缩后为cpio文档(cpio -i -F ramdisk)

结构:

  • ./default.prop: 保存一些调试参数,对于开发者相当重要
  • ./init.rc: 一些启动参数
  • ./system: system.img挂载点
  • ./data: userdata.img挂载点

4. recovery.img

按power键+音量上键(android默认)可以进去,可以执行T卡升级,format,backup userdata,restore userdata

5. boot.img

包含一个Linux kernel(maybe named as zImage)和一个ramdisk.img文件结构在源码system/core/mkbootimg/bootimg.h中声明

解包后是一个gzip,可以用tar直接解。

III. 从已有系统中导出img

这里我们以导出system.img为案例,我们通常通过修改system.img来进行编辑系统行为。

首先通过adb shell通过adb指令连接手机并进入其shell环境。

1. 查看系统挂载

1
cat /proc/mount

2. 将system的挂载导出

1
cat /dev/mtd/xxx > /sdcard/system.img

此时会发现导出的system.img是一个ext4格式的镜像文件。

IV. 挂载修改

这里我们在Mac下对system.img进行挂载以便于修改其中的内容。

Mac上的挂载问题还是一个挺大的问题的。首先我们要做到的是在macOS Mojava上可以挂载可读可写,因此ext4fuse就不work了,虽然可以正常挂载ext4格式,但是却不可读。

这边实测使用另外两个工具可以符合条件:

1. 格式了解

开始之前我们先要了解从一般的ROM刷机文件zip包解压缩出来的img格式,通常拥有以下几种格式:

我们可以通过file指令来确定其格式,如:

1
file system.img
  • Linux rev 1.0 ext4 filesystem data: raw文件
  • VMS Alpha executable: yaffs2文件(通常GB版本,使用mkyaffs与unyaffs进行生成与解包)
  • Android sparse image: Android稀疏镜像文件

我们先可以通过simg2imgAndroid sparse image格式转化为raw文件:

1
simg2img system.img system.raw

如果是system.new.dat以及system.patch.dat就需要用到sdata2img这个工具:

1
python sdat2img.py system.transfer.list system.new.dat system.img

打包system.imgtransfer.listnew.dat使用工具img2sdat,可以将Android Sparse Image转为标准的data

1
python img2sdat.py system.img -o tmp -v 4

然后我们安装fuse-ext2,因为我们可以通过该工具免费的读写ext4格式的raw文件。

2. 安装fuse-ext2

先通过以下方式安装相关依赖:

1
2
brew install homebrew/dupes/m4
brew install e2fsprogs automake autoconf libtool

下载macOS Mojava的git patch文件(该文件来自该issue),然后到fuse-ext2项目目录通过git apply 0001-Fix-new-Xcode-compilation.patch.txt生效diff,生效后进入fuse-ext2项目目录,然后执行:

1
2
3
4
./autogen.sh
CFLAGS="-idirafter/$(brew --prefix e2fsprogs)/include -idirafter/usr/local/include/osxfuse" LDFLAGS="-L$(brew --prefix e2fsprogs)/lib" ./configure
make
sudo make install

3. 挂载ext4

安装后,就可以通过fuse-ext2指令进行可读写挂载了。

1
fuse-ext2 system.raw system -o allow_other -o rw+

4. 重打包

最早是使用make_ext4fs进行重打包,因为网络上面到处都是使用这个对相关目录进行重打包,但是一直都是遇到一个问题:

1
can't set android permissions - built without android support

实际上,这里我们完全不用重新对目录进行重打包,只需要将挂载的ext4格式的img转成Android Sparse Image就可以了。这里直接使用前面下载的img2simg即可:

1
img2simg system.raw system_new.img

当然如果需要将ext4转为dat文件可以通过:

1
rimg2sdat system.img

5. 取消挂载

1
diskutil unmountDisk system/

对于一些img而言,需要进行压包签名,由于篇幅原因这里就不做拓展。



Mac下定制Android ROM
https://blog.dreamtobe.cn/mac_diy_android_rom/
作者
Jacksgong
发布于
2019年4月17日
更新于
2019年4月17日
许可协议