Android APP 启动时间测试

本文介绍了如何测试Android应用的启动时间,包括冷启动、热启动和首次安装启动。详细阐述了从触摸屏幕到指定Activity显示的全过程,并提出了减少启动耗时的策略,如避免在Application的构造器、attachBaseContext()、onCreate()中进行耗时操作,使用异步线程处理数据预取和SP初始化,以及优化MainActivity的布局和延迟加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 启动时间测试

  • 把被测安装包放到脚本同一路径下,命名为被测安装包的包名
  • 首先需要输入的两个参数是:被测包名和被测包名的启动类
    • aapt 获取启动类:aapt dump badging +file_path.apk
  • 三种测试场景
    • 冷启动
    • 热启动
    • 首次安装启动
实际性能测试中是严格录像计时的,按下到首帧响应时间。而冷启和热启在这里的区别是首次无数据启动,和完成过初始化流程后的再次启动。
冷启动:无数据的首次启动。

热启动:非首测启动情况,无初始化欢迎界面和首次初始化过程。

启动方式并不是am,而是点击。这就涉及从按下屏幕响应,硬件上报,软件层响应到指定页面显示整个流程。touch到应用层响应intent事件确实需要安卓系统优化,并非是APP做优化。但如果app的启动涉及监听广播启动,就得另算了,得具体问题具体分析。
单就性能测试而言,准确的性能数据是从touch算起。可以细分为两部分:touch到app首帧画面;app首帧画面到指定activity显示完全。第一部分涉及系统性能优化,后一部分涉及更多的是app自身的优化。


从脚本来模拟最好还是实际流程模拟,发送touch事件响应后到指定activity显示。即:
1、在发送touch事件后记录起始时间,精度到ms
2、当SurfaceFlinger的数据中有指定activity,记录结束时间精度ms (dumpsys SurfaceFlinger|grep -c "指定activity";非零则存在)
3、两者做差就是所需时间。


下面主要介绍APP首帧画面到指定activity的启动耗时的测试。

adb shell am start -W [packageName]/[packageName.MainActivity]

  • 执行成功后将返回三个测量到的时间:
    • ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
    • TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
    • WaitTime:一般比TotalTime大点,包括系统影响的耗时。
  • 脚本取得是TotalTime
参考代码(shell脚本):

firstLaunch(){


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

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


installApp(){

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

}

uninsallApp(){
    echo "-----开始卸载被测App $PackageName-----"
    adb uninstall $PackageName
}



echo -n "请输入被测包名:"
read PackageName
echo -n "请输入启动Activity:"
read ActivityName

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

if [[ $testType -eq 1 ]]; then
    echo "-----冷启动测试-----"
    coldLaunch
elif [[ $testType -eq 2 ]]; then
    echo "-----热启动测试-----"
    warmLaunch
elif [[ $testType -eq 3 ]]; then
    echo "-----首次安装启动测试-----"
    firstLaunch
else
    ERROR "测试Tpye输入错误"
fi

echo "----测试结束----"


减少应用启动时的耗时

针对冷启动时候的一些耗时,如上测得这个应用算是中型的app,在冷启动的时候耗时已经快700ms了,如果项目再大点在Application中配置了更多的初始化操作,这样将可能达到1s,这样每次启动都明显感觉延迟,所以在进行应用初始化的时候采取以下策略:

  • 在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
  • 对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
  • 对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。

遵循上面三种策略可明显提高app启动速度。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值