收藏本站
博为峰Android开发培训Banner
您所在的位置:博为峰教育首页 > 资料精选 > 学习资料 > 【学习资料】Android中如何计算App的启动时间?

【学习资料】Android中如何计算App的启动时间?

    发布时间:2016年03月21日  17:26分   来源:博为峰教育网采编     关键词:Android App开发     | 上一篇 | 下一篇 |


 

        之前有人在知乎提问:“怎么计算apk的启动时间Android App开发又从何开始开发呢?”

 

        利用python或者直接用adb命令怎么计算apk的启动时间呢?就是计算从点击图标到apk完全启动所花费的时间。比如,对游戏来说就是点击游戏图标到进入到登录界面的这段时间。已知的两种方法貌似可以获取,但是感觉结果不准确:

 

       第一:adb shell am start -w pack agename/activity,这个可以得到两个值,ThisTime和TotalTime,不知道两个有什么区别,而且与实际启动时间不匹配,两者相加都可能比实际启动时间小(测试游戏的时候差别更大);

 

       第二:另外一种是通过adb logcat的方式,感觉获取的结果也与实际有差别。以下就是是一个小的总结,一是看的比较方便,二来给需要的同学一个更加方便的途径。

 

 一:应用启动场景

 

       事实上一个App的启动时间可以准确计算的但是要分场景。也就是说要分开游戏和应用。大家都知道,在Android App开发中,游戏开发和应用开发是两码事,所以我们需要将Android App开发分开来说。

 

 1.1 应用启动

 

       我们平时在写Android App开发应用程序的时候,一般会指定一个main Activity,用户在桌面上点击这个 Activity 的时候,系统会直接起这个 Activity。 我们知道Activity在启动的时候会走 onCreate / OnStart / onResume 这几个回调函数。

 

       许多书里讲过,当执行完 on Resume 函数之后,应用就显示出来了…其实这是一种不准确的说法,因为从系统层面来看,一个 Activity 走完 on Create / onStart / onResume 这几个生命周期之后,只是完成了应用自身的一些配置,比如 window 的一些属性的设置 / View 树的建立(只是建立,并没有显示,也就是说只是调用了 inflate 而已 ) 。 后面 View Root Impl 还会调用两次perform Traversals ,初始 Egl 以及 measure / layout / draw 等。所以我们定义一个 Android 应用的启动时间, 肯定不能在 Activity 的回调函数上下手。而是以用户在手机屏幕上看到你在 on Create 的 set Content View 中设置的 layout 完全显示为准,也就是我们常说的应用第一帧。

 

       下面直接说方法。主说的是adb shell am start -wpackagename / activity,是可以完全应用的Android App开发启动时间的。不过也要分场景。

 

 1.2应用第一次启动

 

       也就是我们常说的冷启动,这时候你的Android App开发应用程序的进程是没有创建的。 这也是大部分应用的使用场景。用户在桌面上点击你应用的 icon 之后,首先要创建进程,然后才启动 Main Activity。这时候adb shell am start -wpackagename / Main Activity 返回的结果,就是标准应用程序的启动时间(注意 Android 5.0 之前的手机是没有 WaitTime 这个值的),总共返回了三个结果,我们以 WaitTime 为准。

 

        关于ThisTime / TotalTime / WaitTime的区别,下面是其解释:

 

      “adb shell am start -W ”的实现在 frameworks / base /cmds / am / src / com / android / commands / am / Am。java 文件中。其实就是跨Binder调用Activity Manager Service。Start Activity And Wait ()接口(后面将Activity Manager Service简称为AMS),这个接口返回的结果包含上面打印的ThisTime、TotalTime时间。

 

Android中如何计算App的启动时间

 

       ●startTime记录的刚准备调用start Activity AndWait()的时间点;

       ●endTime记录的是start Activity AndWait()函数调用返回的时间点;

       ●WaitTime = start Activity And Wait()调用耗时。

 

       ThisTime、TotalTime 的计算在 frameworks / base / services / core / java / com/ android / server / am / Activity Record。java 文件的 report Launch Time Locked ()函数中。

 

Android中如何计算App的启动时间

 

       我们来解释下代码里curTime、display StartTime、m Launch StartTime三个时间变量。

 

       ●curTime表示该函数调用的时间点;

       ●display StartTime表示一连串启动 Activity 中的最后一个 Activity 的启动时间点;

       ●mLaunch StartTime表示一连串启动 Activity 中第一个 Activity 的启动时间点。