Appetizer 基于字节码插桩的质量监控
长久以来,开发过程中需要对APP进行各个方面的测量,例如启动时间、崩溃、HTTP请求时间、控件点击时间、内存泄露、耗电等等。通常做法是插代码,打log,或者使用一些SDK(Bugly, acra之类的)。这些方法要么变成满地不可维护的Log.d,搜集的数据是有一个逮一个,全凭人看。测量方法千奇百怪,测量点千变万化,手工的方法低效,不专业,不可维护,不可重用。我们发布了新版Appetizer带来了我们的自动监控服务。
前言
长久以来,开发过程中需要对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流畅性无影响
- 效果实例:
- 标准native APP:bilibili客户端
- (占位后补)ReactNative APP
- (占位后补)Weex APP
怎么用
下载Appetizer Desktop
- 从 https://appetizer.io 主页下载Appetizer 确保使用的是最新版
- 到注册 Appetizer账号后登陆客户端,或者用Github直接登录客户端
- 确认 Android SDK正确安装, adb在PATH里
- 连接手机,启动 Appetizer,“设备管理”中应该能正常看到设备
- 更多 Appetizer Desktop基本介绍,请戳:https://testerhome.com/topics/6284
Appetizer 质量监控的流程图如下:
插桩
- 到“质量监控”界面选择 “插桩APK文件”,会提示要上传 APK,选择APK后等待,视APK文件大小可能需要1-5分钟,
- 插桩后的APK是使用我们服务器上的开发签名重新签名的,如果有需要用自己的签名重签,TesterHome上关于这个的很多,例如:https://testerhome.com/topics/3027 我们建议直接用原生的jarsigner进行重新签名
测试
- 插桩后的APK就可以开始测试了,注意安装到设备后要确认APP有读写SDCARD的权限,绝大多数机型可以通过
adb
进行命令行授权,MIUI不行,需要到设置去授权 - 如果是使用Appetizer的多设备测试的(基于屏幕重放的),请参考这里:https://testerhome.com/topics/7168
- Appetizer可以配合其他UI自动化框架使用,只要确保安装的是插桩包,并且有SD卡读写权限即可
分析与报告
-
测试完成后,关闭APP,来到Appetizer的质量监控界面的第三步
-
分析完成后可以在我的历史报告界面看到最新的报告,点击打开,左边是问题分类,没有的不会显示,主要有
- 未解决:未解决的所有问题
- 已解决和关注可以通过问题行前方的两个图标标记,暂时不保存到磁盘,只是用于看的时候分类
- 崩溃报告包含Java异常、ANR导致的程序崩溃
- 性能问题目前主要包括耗时操作,也就是会造成主线程卡顿的函数调用
- HTTP请求包括成功的(2xx),错误(4xx 5xx),缓存的(3xx),高延时以及可缓存的,有饼图展示比例
-
具体每一个问题都有细节信息,点击查看
- 崩溃问题中如果是Java异常,会包含标准的堆栈位置;如果是ANR则会包含所有的线程的堆栈;崩溃时内存和存储使用情况在最下方
- 耗时操作会指向某个在主线程上运行长时间的函数,会造成UI卡顿,详细信息中有堆栈信息
- HTTP请求会包括所有信息+使用的API方式,目前支持
java.net
,Apache和Okhttp3,有问题的部分(比如延时会标记红色),可以查看原始的信息。同样,有问题的请求会携带堆栈信息
怎么集成
我们提供了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,然后电脑端看
- 是否可以定制化插桩点,定制化数据收集
- 技术上可行,等待SDK,请来信提供需求
联系与合作
- Email: contact@appetizer.io
- 合作请注明公司/个人,标题请以“[Appetizer合作]”开头,请仔细说明需求,告知APP的基本情况(比如用了什么框架,混淆,加固等),非诚勿扰
- 总体来说我们希望大家多提供需求,我们可以将一些计划优先处理
- QQ群:467889502
,
* 注:本文来自网络投稿,不代表本站立场,如若侵犯版权,请及时知会删除