【专项测试】App启动性能分析的笔记

专项测试checklist

  • 性能测试
    • 耗电量测试
      • batteryhistory
      • instruments
    • 卡顿测试
      • blockcanary
    • h5性能测试
      • devtool
      • headless
      • chrome
  • 场景测试
    • 兼容性测试
      • mqc mtc testln
      • appium grid stf
    • 健壮性测试
      • monkey
    • 弱网测试
      • facebok atc
      • proxy定制
    • 安全测试
      • wvs
      • burpsuite

专项测试(技术维度)

  • 崩溃
    • 自动遍历
    • monkey测试
    • 横竖屏切换、快速进退
  • 卡顿(掉帧、gc、cpu)
    • 卡顿测试
    • 内存泄漏测试
    • method profile
  • 响应慢(启动时间、交互响应、H5)
    • 冷热启动
    • 界面切换
    • h5性能测试
  • 发热(cpu、mem、io、network、gps等硬件使用)
    • method profile
    • gc统计
    • io统计
    • 流量统计
    • 硬件使用统计
    • 耗电量分析
  • 兼容性问题(机型覆盖、回归)
    • 兼容性测试
    • 自动化测试
    • 自动遍历
    • monkey测试

Activity启动流程

含义:在app中,每一个页面就是一个Activity

启动过程
  1. 启动app:创建一个空白的窗口,启动app的进程
  2. 启动application onCreate:创建一个对象
  3. 启动MainTread主线程
    • activity init:页面进程的创建,init都是进程创建
    • Activity onCreate:创建activity对象,渲染整个页面,创建好后,替换空白的页面,就是整个==displayed time==结束的时候
    • other stuff:动态加载页面的过程,比如加载js、php等动态资源
主要流程
  1. application onCreate
    • 加载第三方的sdk:加载第三方的服务
      • 登录使用第三方qq登录
      • 把内容分享到微信
      • 使用支付宝等支付手段
  2. Activity onCreate(占用时间最长)
    • 加载自身的逻辑
    • 发送远程数据请求 xxx.json
    • 渲染界面list
app启动性能指标
  1. 冷启动(最重要)

    • 时间:从application onCreate到displayed time之间
    • 通俗含义:app没有启动或app进程被杀
  2. 暖启动

    • app已经启动了,但是很久没有使用,手机内存把app进程杀掉,但对象还在保留
  3. 热启动

    • app进程在后台,没有被内存杀掉,进入app时只是把后台带到前台给用户展示
  4. 首屏启动(好像没有这个)

    • 百度了很久好像都没这个东西,估计是指打开之后有一个广告的展示?
  5. 建议时间(不是特别标准,了解即可)

    • 冷启动5秒
    • 暖启动2秒
    • 热启动1.5秒

app启动时间测试方法以及工具

  1. adb logcat(时间不太准确)
    • 原因:空白页、广告时间,动态加载其实adb logcat都无法记录,只有一个主“页面”或者进入其他页面之后的时间
  2. 录屏+视频拆帧(最准确)
  3. uiautomator等自动化工具200ms
  4. traceview
  5. 硬埋点(不同硬件之间,一个统一测试启动时间的方法)

adb logcat

操作步骤
  1. 清理缓存数据:adb shell pm clear package
  2. 停止进程:adb shell am force-stop package
  3. 启动app:adb shell am start -S -W package/activty
  4. 获取数据:adb logcat | grep -i displayed
结果
  • startTime:记录刚准备调用stratActivityAndWait()的时间点
  • endTime:记录stratActivityAndWait()函数调用返回的时间点
  • WaitTime:stratActivityAndWait()的调用耗时
  • WaitTime=endTime-startTime
实战

记录雪球的启动时间

C:\Users\user>adb shell pm clear com.xueqiu.android
Success

C:\Users\user>adb shell am force-stop com.xueqiu.android

#-W: wait for launch to complete
#-S: force stop the target app before starting the activity
C:\Users\user>adb shell am start -S -W com.xueqiu.android/.view.WelcomeActivityAlias
Stopping: com.xueqiu.android
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xueqiu.android/.view.WelcomeActivityAlias }
Status: ok
Activity: com.xueqiu.android/.view.WelcomeActivityAlias
ThisTime: 1063
TotalTime: 1063
WaitTime: 1111
Complete

C:\Users\user>adb logcat | grep -i displayed
05-03 05:06:19.698   951   986 I ActivityManager: Displayed com.xueqiu.trade.android/com.xueqiu.android.base.h5.H5Activity: +490ms
05-03 05:08:00.489   951   986 I ActivityManager: Displayed com.xueqiu.android/.common.search.USearchActivity: +214ms
05-03 05:10:00.307   951   986 I ActivityManager: Displayed com.xueqiu.android/.view.WelcomeActivityAlias: +1s63ms
05-03 05:10:02.058   951   986 I ActivityManager: Displayed com.xueqiu.android/.common.MainActivity: +590ms
05-03 05:10:06.771   951   986 I ActivityManager: Displayed com.xueqiu.android/.common.UpdateDialogActivity: +105ms
05-03 05:11:19.856   951   986 I ActivityManager: Displayed com.xueqiu.android/.view.WelcomeActivityAlias: +728ms
05-03 05:11:21.266   951   986 I ActivityManager: Displayed com.xueqiu.android/.common.MainActivity: +955ms

使用ffmpeg拆针

操作步骤

要先吧ffmpeg的程序下载了,然后配置环境变量,请在官网下载windows的版本吧,环境配置特别简单

  1. 清除app的缓存:adb shell pm clear package
  2. 强制停止app的进程,处于冷启动的状态adb shell am force-stop package
  3. 录制一个时间为30秒的视频,并保存在sdcard中:adb shell screenrecord --bugreport --time-limit 30 /sdcard/1.mp4 &
  4. 启动app:adb shell am start -S -W package/activity
  5. 把文件pull到当前文件夹:adb pull /sdcard/1.mp4 .
  6. 把录制的视频转化成gif,感觉没卵用:ffmpeg -i 1.mp4 xueqiu.gif
  7. ffmpeg -i 1.mp4 -r 10 frames_%03d.jpg
    • -i后面跟要处理的视频文件
    • -r表示一秒要拆多少帧,如果是30秒的视频,就会拆成300张图片
    • %03d表示文件从001开始,到最后的300
    • 把1.mp4的视频拆成300张图片,一张图片的时间为0.1秒

==注意:使用方法7时,尽量把视频放在一个文件夹里面==

实操
C:\Users\user>adb shell pm clear com.xueqiu.android
Success

C:\Users\user>adb shell am force-stop com.xueqiu.android


C:\Users\user>adb shell am start -S -W com.xueqiu.android/.view.WelcomeActivityAlias
Stopping: com.xueqiu.android
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xueqiu.android/.view.WelcomeActivityAlias }
Status: ok
Activity: com.xueqiu.android/.view.WelcomeActivityAlias
ThisTime: 1063
TotalTime: 1063
WaitTime: 1111
Complete

C:\Users\user>adb pull /sdcard/1.mp4 .

C:\Users\user>ffmpeg -i 1.mp4 -r 10 frames_%03d.jpg