文章目录
- 问题
- 分析
-
- 安装simg2img
- [提取并挂载双方的 system.img](#提取并挂载双方的 system.img)
- 分析空间占用
- 定位具体差异文件
- 裁剪
- Android相关专栏
问题
RK android8.1编译出来的system分区同样是1.5G大小,会比mtk8.1的多占用300M左右空间。
双方都是Android8.1的系统,如下mtk是1.1G,而rk的是1.4G,而且rk还是裁剪过应用的:

核心思路是对比双方 system 分区的文件结构和大小,先量化差异,再定位具体文件 / 模块。
分析
安装simg2img
如果是ubuntu请使用
bash
sudo apt install simg2img

提取并挂载双方的 system.img
首先需要把编译出的system.img挂载到本地,方便查看文件详情:
bash
# 1. 创建挂载目录
mkdir -p rk_system mtk_system
# 2. 挂载RK的system.img(Android 8.1多为ext4格式)
# 先确认img格式,若为sparse img,先转换为raw img
simg2img rk_system.img rk_system_raw.img
mount -o loop rk_system_raw.img rk_system
# 3. 挂载MTK的system.img
simg2img mtk_system.img mtk_system_raw.img
mount -o loop mtk_system_raw.img mtk_system
上面mout指令可能要加sudo。
建议在ubuntu环境下操作,在macOS下,使用mount指令挂载时,会遇到一系列问题:
不指定-t会报以下错误:
mount -o noloop rk_system_raw.img rk_system
mount: You must specify a filesystem type with -t.
加了-t ext4会报以下错误:
mount -t ext4 rk_system_raw.img rk_system
mount: exec /Library/Filesystems/ext4.fs/Contents/Resources/mount_ext4 for /Users/temp/Downloads/1/rk_system: No such file or directory
mount: /Users/temp/Downloads/1/rk_system failed with 72
提示找不到mount_ext4工具 ------ 这是因为 macOS 默认不支持 ext4 文件系统(ext4 是 Linux 专属文件系统),所以直接用 mount 命令挂载会报错。
尝试安装ext4fuse又报错:
brew install ext4fuse
ext4fuse: Linux is required for this software.
libfuse@2: Linux is required for this software.
Error: ext4fuse: Unsatisfied requirements failed this build.
macOS遇到些问题,建议还是安装docker ubuntu来进行分析。
分析空间占用
通过工具对比双方文件大小、目录占比,定位差异点:
bash
# 按目录统计大小(找出占比最大的目录)
# RK侧
du -h --max-depth=1 rk_system/ | sort -hr > rk_system_size.txt
# MTK侧
du -h --max-depth=1 mtk_system/ | sort -hr > mtk_system_size.txt
# 对比关键目录(重点关注以下目录)
# - app/:预装应用
# - lib/、lib64/:库文件
# - framework/:框架层文件
# - bin/、xbin/:可执行文件
# - etc/:配置文件
# - priv-app/:系统核心应用
更便利的方式是直接使用对比工具对比rk_system_size.txt与mtk_system_size.txt
如下图:

可以很清晰看出问题在哪里,
- priv-app rk是615M,mtk是497M,rk大了118M.
- framework rk是243M, mtk是176M, rk大了67M.
- lib64. rk是166M,mtk没有,rk大了166M.
就这三大项,rk大了351M,其它小项忽略不计。
定位具体差异文件
针对占比差异大的目录,进一步细化:
bash
# 列出RK大目录下每个文件的大小(按大小排序)
du -h rk_system/priv-app/* > rk_priv-app_size.txt
# 同理对比MTK
du -h mtk_system/priv-app/* > mtk_priv-app_size.txt
du -h rk_system/framework/* | sort -hr > rk_framework_size.txt
du -h mtk_system/framework/* | sort -hr > mtk_framework_size.txt
通过对比,发现priv-app大的原因是因为rk多内置了一些应用,这些应用又是必须的,这块裁剪不了。
重点分析framework大的原因,如下图:


把重点大的点拷贝出来, 可以发现都是多出的64位文件夹:
87M rk_system/framework/arm64
39M rk_system/framework/oat/arm64
所以可以得出结论,rk固件分区占用大的原因是因为它不仅把32的支持加了进来,还把64位的支持也加进去。
裁剪
要把分区大小减下来,有2个方向,一是把64位的支持去掉,只保留32位的。
另外一种是把system应用裁剪一些(这种方法裁剪的空间不多),可参照这篇文章RK Android8系统应用裁剪
Android相关专栏
作者:帅得不敢出门