移动性能测试 Android 包大小检查测试方案

xinxi · 2019年01月05日 · 最后由 CyberTrick 回复于 2021年07月13日 · 1664 次阅读

前言

每个版本专项测试都需要记录 apk 的总大小值,然后对比每个版本的包大小总值,这个总大小对于开发并没有什么实际价值,因为不够细化 apk 中各种资源的大小.

比如 dex、so、图片资源各自占比、是否有重复资源、是否有图片未压缩等.

如果能每个版本检查出上述问题并提出优化建议,那么在持续集成中价值就比较大.

编译打包过程

打包过程.png

  • 根据 res 目录下的资源文件、AndroidManifest.xml 生成 R.java 文件
  • 处理 aidl,生成对应的 java 文件,如果没有 aidl,则跳过
  • 将前两步生成的 java 文件和 src 目录下源码一起编译成 class 文件
  • 通过 class 文件生成成 dex 文件
  • 将资源文件和 dex 文件一起打包,生成初始 apk
  • 对初始 apk 签名

资源组成

dex

Android 开发编写的是.java 代码,Android 在运行时用的是 dalvik 虚拟机,而 dalvik 虚拟机只能运行.dex 文件.

dex 文件的加载是通过 DexClassLoader、PathClassLoader 等类来完成的.

通过 Android Studio 分析下 dex 文件,共有 6 个 dex 文件.

image

出现多个 dex 文件,是因为做了 dex 分包.每个 dex 要求方法数不能超过 65536 上限.

.so

.so 文件是 NDK 编译出来的,项目中使用 RenderScript 支持库,OpenCV,Unity,android-gif-drawable,SQLCipher 等,已经在生成的 APK 文件中包含.so 文件了.

这里提到了 NDK 工具,NDK 提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 apk.

.png

.png 是常见的资源文件,在 Android 项目中路径是 res 文件路径下.

.js

现在多数 app 的是混合模式开发,通常会内置一些常用 js 文件,使用的时候从本地使用 js 文件,减少网络请求 js 文件并且提高 web 页面的响应时间.

.xml

.xml 文件是配置 icon 展示的颜色和大小等参数.

.mp4

有些 app 在首页安装会播放一段介绍视频,会内置一份.mp4 文件到 app 中.

分析过程

使用微信最近开源的项目 Matrix-ApkChecker 工具,以下是 ApkChecker 工具的原理和分析过程

原理

image

执行过程

image

使用

请参考:https://github.com/Tencent/matrix/wiki/Matrix-ApkChecker#matrix-apkchecker-的使用

在 git 上下载 matrix-apk-canary-0.4.10.jar.

简单使用命令如下:

java -jar matrix-apk-canary-0.4.10.jar --apk apk路径

使用配置文件命令如下:

java -jar matrix-apk-canary-0.4.10.jar -apk apk路径 --config 配置文件路径

配置文件太长就不帖子了,基本上和官方教程是一样的.

执行完命令之后,会生成 html 和 json 两个文件.

image

自动化执行

自动化脚本

把上述执行 jar 包的操作封装成 python 脚本.

优化报告

优化下报告,因为原生的报告数据很多并且描述都是英文的.
开发同学看到这些并不能直观的看出问题.所以做了优化报告.

image

上传结果

报告生成到本地后,把报告上传给后端保存,在测试平台展示并且生成对比图.

image

执行策略

包检查是一种低频率测试,每天执行一次即可.

优化建议

重复代码

当然重复代码是可以从代码扫描的角度发现,减少重复代码也可以达到包瘦身的效果.

未使用的资源文件

资源文件没有被真正引用到

重复的资源文件

资源目录下有两个一样的文件,根据对比文件 md5

图片格式

webp 格式比 png、jpg 体积小

项目地址

已经把 Matrix-ApkChecker 加入到 monkey 测试脚本中

项目地址:https://github.com/xinxi1990/maxauto

cd checker
python run.py apk_path mail_list(多个人逗号分隔)

参考

原理介绍

https://mp.weixin.qq.com/s/tP3dtK330oHW8QBUwGUDtA

github 地址

https://github.com/Tencent/matrix/wiki/Matrix-ApkChecker

Android 中的 dex、apk、ClassLoader 详解

https://blog.csdn.net/u014606081/article/details/71555405

Android NDK 开发 (一) 入门

https://www.jianshu.com/p/0261e6cceb3e

共收到 15 条回复 时间 点赞

有点做到极致的感觉啊

稳定的产品会开始梳理和压缩这种资源大小,优化做到极致

楼主这个稳定性专项是如何在公司落地的

Mark 很强大

把 apk 的变化显示出来了,很直观,可以用数据说话了 很强大

请问楼主 matrix-apk-canary-0.4.10.jar 是在里呢?我下载下来后,找不到这个 jar 文件,谢谢。

可以将包大小检查场景扩展为包静态检查,加入 debug 开关是否关闭等常用的发布前需要检查的配置的校验,进而扩展测试场景

作为基线搞

许雯 回复

嗯 是的 开发经常在弄了很多 debug 开关,因为一些开关忘了关了,重新打包.这种情况应该是可以上线前作为检查项检查的,当然可以做成自动化检查.

xinxi #11 · 2019年01月07日 Author
heygrl 回复

目前是每个版本需求集成上来并且比较稳定的时候做专项测试,稳定测试是在 jenkins 定时任务每天晚上跑几次.

xinxi 回复

你们稳定行测试目前适配了多少台机器,安装弹框、登陆这些问题是怎么解决的呢,

heygrl 回复

大批量的稳定性测试还是交给云测平台,因为也没那么多机器.常规稳定性测试就使用一两台模拟器跑,
模拟没有安装弹框的困扰,登录的会还是需要写个登录脚本,目前写了一个稳定性测试脚本,https://github.com/xinxi1990/maxauto.git,需要的话可以试试.

xinxi 回复

我们内部其实有一个云测平台,没人用基本废弃了,因为机器没人维护,现在又要搞遍历,目前在本地机器上跑,不打算适配机房的几百台机器,登陆脚本都不准备写,自己手工登陆,跑线上环境登陆用自动化脚本没法解决,校验没法绕过,还要手机验证码

图裂了,可以重新补充下吗?谢谢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册