Appetizer 基于字节码插桩的质量监控

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

前言

长久以来,开发过程中需要对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流畅性无影响
  • 效果实例:
    • 标准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 质量监控的流程图如下:
Appetizer 基于字节码插桩的质量监控

插桩

  • 到“质量监控”界面选择 “插桩APK文件”,会提示要上传 APK,选择APK后等待,视APK文件大小可能需要1-5分钟,
    • 插桩后的APK是使用我们服务器上的开发签名重新签名的,如果有需要用自己的签名重签,TesterHome上关于这个的很多,例如:https://testerhome.com/topics/3027 我们建议直接用原生的jarsigner进行重新签名 Appetizer 基于字节码插桩的质量监控

测试

  • 插桩后的APK就可以开始测试了,注意安装到设备后要确认APP有读写SDCARD的权限,绝大多数机型可以通过 adb 进行命令行授权,MIUI不行,需要到设置去授权
  • 如果是使用Appetizer的多设备测试的(基于屏幕重放的),请参考这里:https://testerhome.com/topics/7168
  • Appetizer可以配合其他UI自动化框架使用,只要确保安装的是插桩包,并且有SD卡读写权限即可 Appetizer 基于字节码插桩的质量监控

分析与报告

  • 测试完成后,关闭APP,来到Appetizer的质量监控界面的第三步
    Appetizer 基于字节码插桩的质量监控

  • 分析完成后可以在我的历史报告界面看到最新的报告,点击打开,左边是问题分类,没有的不会显示,主要有

    • 未解决:未解决的所有问题
    • 已解决和关注可以通过问题行前方的两个图标标记,暂时不保存到磁盘,只是用于看的时候分类
    • 崩溃报告包含Java异常、ANR导致的程序崩溃
    • 性能问题目前主要包括耗时操作,也就是会造成主线程卡顿的函数调用
    • HTTP请求包括成功的(2xx),错误(4xx 5xx),缓存的(3xx),高延时以及可缓存的,有饼图展示比例 Appetizer 基于字节码插桩的质量监控
  • 具体每一个问题都有细节信息,点击查看

    • 崩溃问题中如果是Java异常,会包含标准的堆栈位置;如果是ANR则会包含所有的线程的堆栈;崩溃时内存和存储使用情况在最下方 Appetizer 基于字节码插桩的质量监控 Appetizer 基于字节码插桩的质量监控
    • 耗时操作会指向某个在主线程上运行长时间的函数,会造成UI卡顿,详细信息中有堆栈信息 Appetizer 基于字节码插桩的质量监控
    • HTTP请求会包括所有信息+使用的API方式,目前支持 java.net,Apache和Okhttp3,有问题的部分(比如延时会标记红色),可以查看原始的信息。同样,有问题的请求会携带堆栈信息 Appetizer 基于字节码插桩的质量监控 Appetizer 基于字节码插桩的质量监控

怎么集成

我们提供了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

,

* 注:本文来自网络投稿,不代表本站立场,如若侵犯版权,请及时知会删除