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

作者:帅得不敢出门

相关推荐
jwn9991 天前
Laravel5.x核心特性全解析
android·php·laravel
studyForMokey1 天前
【Android面试】RecylerView专题
android·spring·面试
android_cai_niao1 天前
Android中有什么技术过时了可以直接用新技术的
android·过时技术
lingggggaaaa1 天前
PHP原生开发篇&文件安全&上传监控&功能定位&关键搜索&1day挖掘
android·学习·安全·web安全·php
我是场1 天前
我的NPI项目 - OTA upgrade是什么?
android·人工智能
zh_xuan1 天前
Android 实现fragment导航
android·fragment导航
java资料站1 天前
MySQL 增量同步脚本
android·数据库·mysql
穷人小水滴1 天前
手机安装 Cross Profile Test App (Android)
android·手机·一加
zh_xuan1 天前
Android Paging 3实现分页加载
android·git·github·paging 3
天***88521 天前
安卓KMPlayer安卓版播放器,支持AC-3、WMA、MP3、AAC
android·aac