Mac下定制Android ROM
source link: https://blog.dreamtobe.cn/mac_diy_android_rom/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
I will have a life no remorse, in the future, we must accomplish something.
Mac下定制Android ROM
我们经常可以在网络上看到各类的魔改ROM,甚至在Windows上有很多定制ROM的工具,只不过这些工具都会在最终打包的时候内置一些广告应用作为系统应用甚至病毒,实际上这些工具无非就是对常规的各类img
文件进行挂载、重打包的过程,由于编译出来的ROM的目录结构大同小异,因此不用做太多的适配,无非都是删除一些系统内置应用、添加所谓杜比音效包、添加Xposed框架、Root之类的(有关Android Root可以参看这篇文章)。由于我常年使用Mac,今天我们就来看看在Mac下如何对ROM进行修改编辑以及重打包吧。
I. Android开机过程
加载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. 查看系统挂载
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
: raw文件VMS Alpha executable
: yaffs2文件(通常GB版本,使用mkyaffs与unyaffs进行生成与解包)Android sparse image
: Android稀疏镜像文件
我们先可以通过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而言,需要进行压包签名,由于篇幅原因这里就不做拓展。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK