从零学习做网站,万州区建设局官方网站,应用公园app手机版下载,大专计算机网络技术就业方向#xff08;转载#xff09; 已知的两种方法貌似可以获取#xff0c;但是感觉结果不准确#xff1a;一种是#xff0c;adb shell am start -w packagename/activity,这个可以得到两个值#xff0c;ThisTime和TotalTime#xff0c;不知道两个有什么区别#xff0c;而且与…转载 已知的两种方法貌似可以获取但是感觉结果不准确一种是adb shell am start -w packagename/activity,这个可以得到两个值ThisTime和TotalTime不知道两个有什么区别而且与实际启动时间不匹配两者相加都可能比实际启动时间小测试游戏的时候差别更大另外一种是通过adb logcat的方式感觉获取的结果也与实际有差别 1 应用启动场景 事实上 Android 中一个 App 的启动时间可以准确计算的.但是要分场景.也就是说要分开游戏和应用. 大家都知道,在Android中,游戏开发和应用开发是两码事.所以我们需要分开来说. 1.1 应用启动 我们平时在写应用的时候,一般会指定一个 mainActivity ,用户在桌面上点击这个 Activity 的时候,系统会直接起这个 Activity. 我们知道 Activity 在启动的时候会走 onCreate/onStart/onResume .这几个回调函数. 许多书里讲过,当执行完 onResume 函数之后,应用就显示出来了…其实这是一种不准确的说法,因为从系统层面来看,一个 Activity 走完 onCreate/onStart/onResume 这几个生命周期之后,只是完成了应用自身的一些配置,比如 window 的一些属性的设置/ View 树的建立(只是建立,并没有显示,也就是说只是调用了 inflate 而已) . 后面 ViewRootImpl 还会调用两次performTraversals ,初始化 Egl 以及 measure/layout/draw. 等.所以我们定义一个 Android 应用的启动时间, 肯定不能在 Activity 的回调函数上下手.而是以用户在手机屏幕上看到你在 onCreate 的 setContentView 中设置的 layout 完全显示为准,也就是我们常说的应用第一帧. 上面扯得有点远,不感兴趣的话可以不看,下面直接说方法.题主说的 adb shell am start -w packagename/activity,是可以完全应用的启动时间的.不过也要分场景. 1.2 应用第一次启动 也就是我们常说的冷启动,这时候你的应用程序的进程是没有创建的. 这也是大部分应用的使用场景.用户在桌面上点击你应用的 icon 之后,首先要创建进程,然后才启动 MainActivity.这时候adb shell am start -w packagename/MainActivity 返回的结果,就是标准的应用程序的启动时间注意 Android 5.0 之前的手机是没有 WaitTime 这个值的: ➜ adb shell am start -W com.meizu.media.painter/com.meizu.media.painter.PainterMainActivity
Starting: Intent { actandroid.intent.action.MAIN cat[android.intent.category.LAUNCHER] cmpcom.meizu.media.painter/.PainterMainActivity }
Status: ok
Activity: com.meizu.media.painter/.PainterMainActivity
ThisTime: 355
TotalTime: 355
WaitTime: 365
Complete 总共返回了三个结果,我们以 WaitTime 为准. 关于ThisTime/TotalTime/WaitTime的区别,下面是其解释 “adb shell am start -W ”的实现在 frameworks\base\cmds\am\src\com\android\commands\am\Am.java 文件中。其实就是跨Binder调用ActivityManagerService.startActivityAndWait() 接口后面将ActivityManagerService简称为AMS这个接口返回的结果包含上面打印的ThisTime、TotalTime时间. startTime记录的刚准备调用startActivityAndWait()的时间点endTime记录的是startActivityAndWait()函数调用返回的时间点WaitTime startActivityAndWait()调用耗时。ThisTime、TotalTime 的计算在 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java 文件的 reportLaunchTimeLocked() 函数中。 我们来解释下代码里curTime、displayStartTime、mLaunchStartTime三个时间变量. curTime表示该函数调用的时间点.displayStartTime表示一连串启动Activity中的最后一个Activity的启动时间点.mLaunchStartTime表示一连串启动Activity中第一个Activity的启动时间点.正常情况下点击桌面图标只启动一个有界面的 Activity此时 displayStartTime 与mLaunchStartTime 便指向同一时间点此时 ThisTimeTotalTime。另一种情况是点击桌面图标应用会先启动一个无界面的 Activity 做逻辑处理接着又启动一个有界面的Activity在这种启动一连串 Activity 的情况下知乎的启动就是属于这种情况displayStartTime 便指向最后一个 Activity 的开始启动时间点mLaunchStartTime 指向第一个无界面Activity的开始启动时间点此时 ThisTimeTotalTime。这两种情况如下图 在上面的图中我用①②③分别标注了三个时间段在这三个时间段内分别干了什么事呢 在第①个时间段内AMS 创建 ActivityRecord 记录块和选择合理的 Task、将当前Resume 的 Activity 进行 pause在第②个时间段内启动进程、调用无界面 Activity 的 onCreate() 等、 pause/finish 无界面的 Activity在第③个时间段内调用有界面 Activity 的 onCreate、onResume看到这里应该清楚 ThisTime、TotalTime、WaitTime 三个时间的关系了吧。WaitTime 就是总的耗时包括前一个应用 Activity pause 的时间和新应用启动的时间ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时TotalTime 表示新应用启动的耗时包括新进程的启动和 Activity 的启动但不包括前一个应用 Activity pause 的耗时。也就是说开发者一般只要关心 TotalTime 即可这个时间才是自己应用真正启动的耗时。 Event log中 TAGam_activity_launch_time 中的两个值分表表示 ThisTime、TotalTime跟通过 “adb shell am start -W ” 得到的值是一致的。 最后再说下系统根据什么来判断应用启动结束。我们知道应用启动包括进程启动、走 Activity生命周期 onCreate/onResume 等。在第一次 onResume 时添加窗口到WMS中然后measure/layout/draw窗口绘制完成后通知 WMSWMS 在合适的时机控制界面开始显示(夹杂了界面切换动画逻辑)。记住是窗口界面显示出来后WMS 才调用reportLaunchTimeLocked() 通知 AMS Activity 启动完成。 最后总结一下如果只关心某个应用自身启动耗时参考TotalTime如果关心系统启动应用耗时参考WaitTime如果关心应用有界面Activity启动耗时参考ThisTime。 1.2 应用非第一次启动 如果是你按Back键并没有将应用进程杀掉的话那么执行上述命令就会快一些因为不用创建进程了只需要启动一个Activity即可。这也就是我们说的应用热启动。 2 游戏启动场景 游戏启动的话就不适用用命令行的方法来启动了因为从用户点击桌面图标到登录界面既有系统的部分也有游戏自己的部分。 2.1 系统部分 游戏也有一个Activity所以启动的时候还是会去启动这个Activity所以系统启动部分也就是用户点击桌面桌面响应到这个Activity启动。 2.2 游戏部分 一般游戏的主Activity启动后还会做一些比较耗时的事情这时候你看到的界面是不能操作的比如加载游戏数据、联网更新数据、读取和更新配置文件、游戏引擎初始化等操作。从游戏开发的角度来看到了真正用户能操作的界面才算是一个游戏真正加载完成的时间。那么这个时间就得使用Log来记录了因为加载游戏数据、联网更新数据、读取和更新配置文件、游戏引擎初始化这些操作都是游戏自己的逻辑与系统无关所以得由游戏自己定义加载完成的点。 对于游戏的启动时间我们更倾向于计算从 点击桌面图标 到 用户可以与游戏进行交互 这个时间段作为一个游戏的启动时间。 3 总结 计算机最让人着迷的一点就是其准确性11永远等于2启动耗时多久就是多久每一次可能不一样但每一次的时间都是这一次的准确时间。 不过每个公司由于对应用的定位不同所以对应用启动的要求也不一样。比如有的做 ROM 的公司其内置应用的启动时间一定是要非常快的这样给用户的第一感觉就是快、流畅互联网公司的 App 则不是很关心启动速度大部分互联网公司的应用都有一个启动页用来展示广告或者功能介绍之类的然后才会进入到主界面。需求不一样这么做也无可厚非不过从消费者的角度来看越早见到主界面当然越好。 所以在做一个 Android App 的时候一定要记得将应用的启动时间作为一个性能指标毕竟 天下武功唯快不破 转载于:https://www.cnblogs.com/mymelon/p/5412638.html