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

作者:帅得不敢出门

相关推荐
darkb1rd2 小时前
三、PHP字符串处理与编码安全
android·安全·php
琹箐3 小时前
设计模式——策略模式
设计模式·策略模式
STCNXPARM11 小时前
Android camera之硬件架构
android·硬件架构·camera
2501_9445255413 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
松☆14 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
_李小白16 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机
她说..17 小时前
策略模式+工厂模式实现审批流(面试问答版)
java·后端·spring·面试·springboot·策略模式·javaee
小天源18 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_9159214318 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone