Mac下定制Android ROM

out/target/product/$PRODUCT/data

结构:

  • /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. 查看系统挂载

cat /proc/mount

2. 将system的挂载导出

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
指令来确定其格式,如:

file system.img

Linux rev 1.0 ext4 filesystem data
VMS Alpha executable
Android sparse image

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

simg2img system.img system.raw

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

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

打包 system.img
transfer.list
new.dat
使用工具 img2sdat
,可以将 Android Sparse Image
转为标准的 data

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

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

2. 安装 fuse-ext2

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

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
项目目录,然后执行:

./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
指令进行可读写挂载了。

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

4. 重打包

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

can't set android permissions - built without android support

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

img2simg system.raw system_new.img

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

rimg2sdat system.img

5. 取消挂载

diskutil unmountDisk system/

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