Android APP启动时间测试

最近被分配了一个APP启动优化的工作,但是优化的工作没有量化指标就很难给领导交代,第一时间我就想到了APP启动时间,优化前后一相减,效果立现。

测速命令

adb shell am start -W  packageName/activityName

执行后出现回显

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=packageName/activityName }
Status: ok
LaunchState: COLD // 启动方式,分为热启动和冷启动
Activity: packageName/activityName // 启动活动
TotalTime: 1375 // 自己的所有Activity的启动耗时
WaitTime: 1381 // ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动
Complete

解释一下,上面所有代码中的packageName/activityName都是代表应用包名/活动名,都是根据自己的应用进行替换的。

pacakgeName从AndroidManifest.xml中可以查到

activityName从AndroidManifest.xml中可以查到或直接查找该Activity类,包名+"."+类型

踩到的坑

当测试页面不是在AndroidManifest.xml里声明的Action.MAIN时,有可能会报出安全异常。

Exception occurred while executing 'start':
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=packageName/activityPath } from null (pid=29970, uid=2000) not exported from uid 10304
	at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1111)
	at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1078)
	at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:724)
	at com.android.server.wm.ActivityTaskManagerService.startActivityAndWait(ActivityTaskManagerService.java:1383)
	at com.android.server.am.ActivityManagerService.startActivityAndWait(ActivityManagerService.java:3760)
	at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:549)
	at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:186)
	at android.os.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:98)
	at android.os.ShellCommand.exec(ShellCommand.java:44)
	at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:10879)
	at android.os.Binder.shellCommand(Binder.java:929)
	at android.os.Binder.onTransact(Binder.java:813)
	at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:5258)
	at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2951)
	at android.os.Binder.execTransactInternal(Binder.java:1159)
	at android.os.Binder.execTransact(Binder.java:1123)

这是因为启动的Activity设置了外部启动权限,在AndroidManifest声明该Activity处增加配置android:exported="true"即可。

参考资料

https://blog.csdn.net/yan_startwith2015/article/details/77991571

上一篇:Android 面试总结,那些很可能会被问倒的问题,你都了解吗


下一篇:SpringCloudStream学习笔记(转)