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

xinxi · 2019年01月05日 · 最后由 heygrl 回复于 2019年01月09日 · 700 次阅读

前言

每个版本专项测试都需要记录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

共收到 14 条回复 时间 点赞

有点做到极致的感觉啊

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

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

Mark 很强大

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

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

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

作为基线搞

许雯 回复

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

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

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

xinxi 回复

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

xinxi #13 · 2019年01月07日 作者
heygrl 回复

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

xinxi 回复

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

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