Appetizer Appetizer 1.1.0 更新日志:插桩质量监控

appetizer.io · 发布于 2017年03月31日 · 最后由 appetizer.io 回复于 2017年07月06日 · 4521 次阅读

前言

长久以来,开发过程中需要对APP进行各个方面的测量,例如启动时间、崩溃、HTTP请求时间、控件点击时间、内存泄露、耗电等等。通常做法是插代码,打log,或者使用一些SDK(Bugly, acra之类的)。这些方法要么变成满地不可维护的Log.d,搜集的数据是有一个逮一个,全凭人看。测量方法千奇百怪,测量点千变万化,手工的方法低效,不专业,不可维护,不可重用。我们发布了新版Appetizer带来了我们的自动监控服务。

简介

自动监控服务分为三步骤:

  1. 对一个打包好的APK文件进行字节码级别的插桩,实现对APP内一些开发者关心的程序状态进行自动测量,输出是插桩后的APK,可以重新签名;通过基于规则的方式找插入点,比手工高效、全面(可以插桩到第三方库代码),而且在源代码里面无痕,测量逻辑和业务逻辑分离。
  2. 在测试设备上运行插桩后的APK,经过已有的测试流程(人工、自动、回归、压测等等),自动监控服务会持续记录各种数据(到设备SD卡);
  3. 收集数据的数据经过上传、分析,产生问题报告。报告目前涵盖崩溃、HTTP请求、UI线程卡顿等,未来会更多。报告简洁但不简单,展示的是一个个“问题”,而不是“CPU使用率”这种统计量,Appetizer报告每个问题可以定位到源代码中某个/些函数。

特色与效果

  • 测量逻辑和业务逻辑分离: Appetizer提供测量点和测量方法,测量与业务低耦合。Appetizer独立升级,服务升级带来更广的测量面。
  • 测量全面:APP代码与库代码
  • 部署方便:测量代码与APP同进程,同权限,不需要搞Root,HTTP代理等等
  • 结合自动化遍历,夜间长时间自动遍历,找到的稳定性问题自动由质量监控捕获,上报完整、专业
  • 结合UI自动化测试,评测APP性能、HTTP延时等性能问题
  • 低性能影响:log到本地,控制log频率,数据量,以及log方式,对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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 27 条回复
7956

我在mac OS上打开提示:“Appetizer”因为出现问题而无法打开。
操作系统版本:10.12.4

11797
7956gengdy 回复

刚才CDN抽风了,请再下载一次: http://dl.appetizer.io/Appetizer-1.1.0-darwin-x64.zip?v=1

7956
11797appetizer.io 回复

谢谢,已经好了

12235

点击用github登录的按钮,并且用github账号成功登录后,卡在Authorize application界面,Authorize application的按钮是灰色的,无法点击,页面也没有跳转

12235

进去了,但是插桩apk的时候提示 The access token provided is invalid

11797
122359688e 回复

Github登录后第一次插桩会有问题,重启一下客户端插桩就可以了,下个版本修复

2216
122359688e 回复

你怎么进去的?我也是卡在这里了

11797
2216lovoro 回复

github授权很慢,我们阿里云服务器连Github灰常慢,会卡一会,还有问题的话加群发个截图

2216
11797appetizer.io 回复

授权按钮一直灰色

11797
2216lovoro 回复

重启下客户端用普通账号试试?

2441

基于class文件字节码修改的AOP实现,赞

11797 appetizer.io Appetizer 移动开发 DevOps 平台发布 中提及了此贴 04月01日 13:38
11797 appetizer.io Appetizer 移动开发 DevOps 平台发布 中提及了此贴 04月01日 13:40
11797
2441fresh 回复

感谢专业的评价

96

镜像操作不支持物理按键,例如back

6513

你好,我插桩APK,提示服务器拒绝了插桩请求,是什么原因

11797

@object 重启下客户端,这个bug已经修复,1.1.1发布就好了

11797
32show88118 回复

这块兼容性适配需要花挺多时间,在慢慢加

6513

@appetizer.io 我插桩apk下载到本地后,打开app就崩溃了

F81d33

准备找个时间实践下,不过还是给楼主点赞

11797
6513object 回复

试试最新的1.1.1版?后端我们也在持续更新,还有问题的话可以加群详细讨论😃

9d6245

为什么我在质量监控里查看报告,无法生成的文件报告呢。

11797
9d6245bigbirdbird 回复

前面插桩等流程都成功了吗?加群讨论吧

16281

大赞,要是能够对其它工具生成的测试LOG进行分析就好了

11797

之后版本会接入其他sdk的数据,敬请期待

3030


为什么启动客户端先提示token失效 然后跳转这个 也没有登录相关的控件啊

96

释放双手,放飞自我

3253

插桩后的apk能被成功安装,但是打开app就crash。
不知是客户端问题还是插桩的缘故。

11797
3253micky_jw 回复

加QQ群,闪退问题直接按照这个格式上报:
https://github.com/appetizerio/insights.py/wiki/Issue-Reporting

7555 harsayer Appetizer 整合梳理 中提及了此贴 09月27日 17:06
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册