Android定位RK编译的system.img比MTK大350M的原因

文章目录

问题

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

如下图:

可以很清晰看出问题在哪里,

  1. priv-app rk是615M,mtk是497M,rk大了118M.
  2. framework rk是243M, mtk是176M, rk大了67M.
  3. 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相关专栏

Android Framework专栏
Android专栏

作者:帅得不敢出门

相关推荐
王码码20358 小时前
Flutter for OpenHarmony: Flutter 三方库 cryptography 在鸿蒙上实现金融级现代加解密(高性能安全库)
android·安全·flutter·华为·金融·harmonyos
亚历克斯神9 小时前
Flutter for OpenHarmony:Flutter 三方库 yaml_edit 精准修改 YAML 文件内容(保留注释与格式的编辑神器)
android·flutter·华为·harmonyos
左手厨刀右手茼蒿9 小时前
Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)
android·服务器·flutter·ui·华为·harmonyos
亚历克斯神9 小时前
Flutter for OpenHarmony:zxing2 纯 Dart 条码扫描与生成库(不仅是扫码,更是编解码引擎) 深度解析与鸿蒙适配指南
android·flutter·华为·harmonyos
钛态9 小时前
Flutter for OpenHarmony:dio_cookie_manager 让 Dio 发挥会话管理能力,像浏览器一样自动处理 Cookie 深度解析与鸿蒙适配指南
android·linux·运维·flutter·ui·华为·harmonyos
键盘鼓手苏苏9 小时前
Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)
android·分布式·算法·flutter·华为·中间件·harmonyos
louisgeek12 小时前
Android ViewBinding
android
城东米粉儿14 小时前
Kotlin 协程的异常处理 笔记
android
锥栗15 小时前
【其他】基于Trae的大模型智能应用开发
android·java·数据库
恋猫de小郭15 小时前
Flutter 2026 Roadmap 发布,未来计划是什么?
android·前端·flutter