前言
长久以来,开发过程中需要对 APP 进行各个方面的测量,例如启动时间、崩溃、HTTP 请求时间、控件点击时间、内存泄露、耗电等等。通常做法是插代码,打 log,或者使用一些 SDK(Bugly, acra 之类的)。这些方法要么变成满地不可维护的Log.d
,搜集的数据是有一个逮一个,全凭人看。测量方法千奇百怪,测量点千变万化,手工的方法低效,不专业,不可维护,不可重用。我们发布了新版 Appetizer 带来了我们的自动监控服务。
简介
自动监控服务分为三步骤:
- 对一个打包好的 APK 文件进行字节码级别的插桩,实现对 APP 内一些开发者关心的程序状态进行自动测量,输出是插桩后的 APK,可以重新签名;通过基于规则的方式找插入点,比手工高效、全面(可以插桩到第三方库代码),而且在源代码里面无痕,测量逻辑和业务逻辑分离。
- 在测试设备上运行插桩后的 APK,经过已有的测试流程(人工、自动、回归、压测等等),自动监控服务会持续记录各种数据(到设备 SD 卡);
- 收集数据的数据经过上传、分析,产生问题报告。报告目前涵盖崩溃、HTTP 请求、UI 线程卡顿等,未来会更多。报告简洁但不简单,展示的是一个个 “问题”,而不是 “CPU 使用率” 这种统计量,Appetizer 报告每个问题可以定位到源代码中某个/些函数。
特色与效果
- 测量逻辑和业务逻辑分离: Appetizer 提供测量点和测量方法,测量与业务低耦合。Appetizer 独立升级,服务升级带来更广的测量面。
- 测量全面:APP 代码与库代码
- 部署方便:测量代码与 APP 同进程,同权限,不需要搞 Root,HTTP 代理等等
- 结合自动化遍历,夜间长时间自动遍历,找到的稳定性问题自动由质量监控捕获,上报完整、专业
- 结合 UI 自动化测试,评测 APP 性能、HTTP 延时等性能问题
- 低性能影响:log 到本地,控制 log 频率,数据量,以及 log 方式,对 APP 流畅性无影响
- 效果实例:
怎么用
下载 Appetizer Desktop
Appetizer 质量监控的流程图如下:
插桩
- 到 “质量监控” 界面选择 “插桩 APK 文件”,会提示要上传 APK,选择 APK 后等待,视 APK 文件大小可能需要 1-5 分钟,
测试
- 插桩后的 APK 就可以开始测试了,注意安装到设备后要确认 APP 有读写 SDCARD 的权限,绝大多数机型可以通过
adb
进行命令行授权,MIUI 不行,需要到设置去授权
- 如果是使用 Appetizer 的多设备测试的(基于屏幕重放的),请参考这里:https://testerhome.com/topics/7168
- Appetizer 可以配合其他 UI 自动化框架使用,只要确保安装的是插桩包,并且有 SD 卡读写权限即可
分析与报告
怎么集成
我们提供了Python 命令行工具用于集成,功能与图形界面一样,使用流程:
- 将待测试的 apk 上传到服务端进行插桩
- 下载插桩后的 apk
- 安装插桩后的应用,授权,进行测试流程(自动化测试,人工测试都可以),log 会存在手机本地
- 将设备通过 USB 连接到开发机,并使用本客户端将 log 上传至服务端进行分析
- 通过Appetizer Desktop >= 1.2.0 进行可视化查看报告
插桩和分析包括
- 应用崩溃(Crash)的原因和崩溃时的状态
- 所有线程抛出的异常(即使不会造成崩溃)
- 应用未响应(ANR)的状态
- HTTP 请求以及回复的详细信息,包含以下库的 API(更多库支持正在添加)
- okhttp3
- retrofit(基于 okhttp3 的)
- apache http
- urlconnection
- volley
- 主线程卡顿(图片问题,回调问题等)
- 界面切换耗时
- CPU 占用率和 heap 占用大小
环境要求
- Python 2.7.x 3.3+
- node >= 0.10.4
- adb 已经安装并已经添加到环境变量 PATH 中
- 支持 Windows, MacOS, Linux
- APK 文件名尽量用英文,APP 本身状态、字符串等可以有中文
用法
安装依赖
python -m pip install -r requirements.txt
帮助
python insights.py -h
确认不会有错误即依赖安装正确
login: 登录账号
python insights.py login username password
所有客户端操作均需要登录认证,执行登录后登录用 token 保存在当前 .access_token
文件。token 默认 60 天有效,使用任意操作会自动续期。60 天后 token 过期需要重新登录。
账号可在 Appetizer.io 注册。
插桩 apk
python insights.py process apk processed_apk
例如
python insights.py process my.apk my_processed.apk
插桩需要上传、处理、下载,需要一定时间,依据网络情况与 APK 大小不同大致在 1 分钟-3 分钟内,期间会有输出表示进展情况。
安装插桩后的 APK 并授权
python insights.py install my_processed.apk -s serialno1 -s serialno2
-
my_processed.apk
是插桩后的 apk
-
-s
是可选参数, serialno1
serialno2
之类的是设备的串号,通过 adb devices
获得,需要安装到多个设备可以用多个-s
命令指定设备; 不提供任何-s
命令时,默认认为只有一个设备并对该设备进行安装
- 安装后会自动授权 log(小米无法自动化授权,建议在安装完成后授权读写 SDCARD)
测试
Appetizer 质量监控客户端对测试没有特别限制,可以是简单的人工测试,也可以是复杂的回归测试,测试长度不限。插桩后的 APK 会自动 log
上传 log 获取分析报告
python insights.py analyze my_processed.apk -s serialno1 -s serialno2 --clear
-
-s
是可选参数, serialno1
serialno2
之类的是设备的串号,通过 adb devices
获得,需要分析多个设备上的 log 可以用多个-s
命令指定设备; 不提供任何-s
命令时,默认认为只有一个设备并对该设备进行分析
-
--clear
是可选参数,用于从设备下载 log 后将设备上 log 清空
- 分析成功后可以通过Appetizer Desktop >= 1.2.0 查看
其他功能
python insights.py clearlog my_processed.apk -s serialno1 -s serialno2 --clear
将设备上有指定插桩后的 APK 的 log 清除
常见问答
- 加固后的 APK 可以吗?混淆呢?
- 不支持加固,考虑上传加固前的版本,如果有安全性考虑请联系商务合作;混淆的 APK 可以,但是会影响效果,例如用了 okhttp 库,混淆后 okhttp 库被改了,那么通过 okhttp 的 HTTP 请求就捕捉不到了;同样有安全性考虑请联系合作。
- 质量监控是开发包还是发行包
- 目前为开发包,在开发设备上;发行包插桩技术上可行,但需要裁剪,有具体需求请邮件联系
- 手游支持吗?
- 部分支持,注入只处理 native Java 层的问题,框架托管的代码,比如 Unity 的 C# 没有插桩
- 支持混合 APP 吗?
- 支持 ReactNative, Weex 开发的 APP,虽然 H5 代码不会插桩,但是转换成 native 后,或者从 native 层触发的操作(例如网络)都能正常捕获
- Cordova 支持有限,WebView 内的功能正在研发中
- 采集的数据是否公开?
- Appetizer 图形化界面可视化的部分只是收集到的数据的一部分,总体的数据类似时间轴图,JSON 格式,可来邮件详询数据格式以及需求对接
- 设备 log 能否通过 WiFi 传到服务器分析
- 开发中,之后版本将开放 SDK,可以在 APP 里面布置一个按钮/Broadcast Receiver 一键上传 log,然后电脑端看
- 是否可以定制化插桩点,定制化数据收集
联系与合作
- Email: contact@appetizer.io
- 合作请注明公司/个人,标题请以 “[Appetizer 合作]” 开头,请仔细说明需求,告知 APP 的基本情况(比如用了什么框架,混淆,加固等),非诚勿扰
- 总体来说我们希望大家多提供需求,我们可以将一些计划优先处理
- QQ 群:467889502
↙↙↙阅读原文可查看相关链接,并与作者交流