51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1334|回复: 1
打印 上一主题 下一主题

Android启动时间测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-8-15 13:43:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 把被测安装包放到脚本同一路径下,命名为被测安装包的包名
  • 首先需要输入的两个参数是:被测包名和被测包名的启动类
    • aapt 获取启动类:aapt dump badging +file_path.apk
  • 三种测试场景
    • 冷启动
    • 热启动
    • 首次安装启动
应用启动的流程Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
什么是应用启动的时间
  • 在上面这个启动流程中,任何一个地方有耗时操作都会拖慢我们应用的启动速度,而应用启动时间是用毫秒度量的,对于毫秒级别的快慢度量我们还是需要去精确的测量到到底应用启动花了多少时间,而根据这个时间来做衡量。
    什么才是应用的启动时间
  • 从点击应用的启动图标开始创建出一个新的进程直到我们看到了界面的第一帧,这段时间就是应用的启动时间。
    我们要测量的也就是这段时间,测量这段时间可以通过adb shell命令的方式进行测量,这种方法测量的最为精确,命令在下面的原理里面。

原理adb shell am start -W [packageName]/[packageName.MainActivity]
  • 执行成功后将返回三个测量到的时间:
    • ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
    • TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
    • WaitTime:一般比TotalTime大点,包括系统影响的耗时。
  • 脚本取得是TotalTime
减少应用启动时的耗时针对冷启动时候的一些耗时,如上测得这个应用算是中型的app,在冷启动的时候耗时已经快700ms了,如果项目再大点在Application中配置了更多的初始化操作,这样将可能达到1s,这样每次启动都明显感觉延迟,所以在进行应用初始化的时候采取以下策略:
  • 在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
  • 对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
  • 对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。
遵循上面三种策略可明显提高app启动速度。
参考代码段用shell脚本写的比较简单的算法,具体跑的时间可以自己设置,个人以为5次左右就够了。下面是首次安装启动的代码,冷启动,热启动就不赘述了。

  1. firstLaunch(){


  2.     echo "start first launch 3 times"
  3.     for i in {1..3}
  4.     do
  5.         echo "-----第 $i 次首次启动测试-----"
  6.         uninsallApp
  7.         installApp
  8.         TotalTime[i]=`adb shell am start -W $PackageName/$ActivityName |grep TotalTime|awk -F ' ' '{print $2}'|tr -d "\r"`
  9.         sleep 3s
  10.         echo ${TotalTime[i]}
  11.     done
  12.     max=0
  13.     for n in "${TotalTime[@]}"
  14.     do
  15.         ((n>max)) && max=$n
  16.     done
  17.     echo "热启动峰值:$max ms"

  18.     avg=0
  19.     sum=$((${TotalTime[1]} + ${TotalTime[2]} + ${TotalTime[3]}))
  20.     avg=$[$sum/3]
  21.     echo "热启动均值:$avg ms"
  22. }


  23. installApp(){

  24.     echo "----重新安装被测APP $PackageName ----"
  25.     apps_dir=$(pwd)
  26.     echo $apps_dir
  27.     adb install $apps_dir/$PackageName.apk

  28. }

  29. uninsallApp(){
  30.     echo "-----开始卸载被测App $PackageName-----"
  31.     adb uninstall $PackageName
  32. }



  33. echo -n "请输入被测包名:"
  34. read PackageName
  35. echo -n "请输入启动Activity:"
  36. read ActivityName

  37. echo -e "-----请输入测试类型:----- \n 冷启动测试输入1 \n 热启动测试输入2 \n 首次安装启动时间输入3"
  38. read testType

  39. if [[ $testType -eq 1 ]]; then
  40.     echo "-----冷启动测试-----"
  41.     coldLaunch
  42. elif [[ $testType -eq 2 ]]; then
  43.     echo "-----热启动测试-----"
  44.     warmLaunch
  45. elif [[ $testType -eq 3 ]]; then
  46.     echo "-----首次安装启动测试-----"
  47.     firstLaunch
  48. else
  49.     ERROR "测试Tpye输入错误"
  50. fi

  51. echo "----测试结束----"
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2
回复

使用道具 举报

  • TA的每日心情
    奋斗
    16 小时前
  • 签到天数: 2654 天

    连续签到: 6 天

    [LV.Master]测试大本营

    2#
    发表于 2017-8-16 08:22:25 | 只看该作者
    学习,之前没做过
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-19 23:57 , Processed in 0.065692 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表