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专栏

作者:帅得不敢出门

相关推荐
FLJwu8 分钟前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
驰骋工作流11 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程12 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽16 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714716 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_868919 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui19 小时前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行19 小时前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技19 小时前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben20 小时前
Weex开发踩坑记录
android·前端·ios