Android 启动时间测试

应用启动的流程

Application 的构造器方法——>attachBaseContext()——>onCreate()——>Activity 的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。

什么是应用启动的时间

原理

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

减少应用启动时的耗时

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

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

参考代码段

用 shell 脚本写的比较简单的算法,具体跑的时间可以自己设置,个人以为 5 次左右就够了。下面是首次安装启动的代码,冷启动,热启动就不赘述了。



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 "----测试结束----"


附言

有什么其他好的测试方法 我们也可以一起交流交流


↙↙↙阅读原文可查看相关链接,并与作者交流