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
中声明
- Unpack工具: Split_bootimg.pl
- Repack工具: Repack_bootimg.pl
解包后是一个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而言,需要进行压包签名,由于篇幅原因这里就不做拓展。