【学习资料】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时间。
●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 ()函数中。
我们来解释下代码里curTime、display StartTime、m Launch StartTime三个时间变量。
●curTime表示该函数调用的时间点;
●display StartTime表示一连串启动 Activity 中的最后一个 Activity 的启动时间点;
●mLaunch StartTime表示一连串启动 Activity 中第一个 Activity 的启动时间点。