启动命令耗时
// adb shell am start -S -W 包名/启动的Acitivity
adb shell am start -S -W com.dss.simple/com.dss.simple.MainActivity
Stopping: com.dss.simple
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.dss.simple/com.dss.simple.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.dss.simple/com.dss.simple.MainActivity
TotalTime: 2398
WaitTime: 2404
Complete
TotalTime:表示新应用启动的耗时,包括新进程的启动和 Activity 的启动(一般只需要关心这个就行)
WaitTime:总的耗时,包括前一个应用的 Activity pause 的时间和新应用启动的时间
优化方向
1. CPU Profile 观察耗时的操作
主要利用 Trace Java Methods 跟踪 Java 方法,在运行时检测应用,以在每个方法调用开始和结束时记录一个时间戳。系统会收集并比较这些时间戳,以生成方法跟踪数据,包括时间信息和 CPU 使用率。
Flame Chart
提供一个导致的调用图表,用来汇总调用堆栈。横轴显示的是百分比数值。由于忽略了时间线信息,Flame Chart 可以展示每次调用消耗时间占用整个记录时长的百分比。 同时纵轴也被对调了,在顶部展示的是被调用者,底部展示的是调用者。此时的图表看起来越往上越窄, 就好像火焰一样,因此得名: 火焰图。
 从下往上找到我们的自己的代码,横轴越长,说明消耗的时间越长。
w:放大 s:缩小 a:向左移动 d:向右移动
Top Down Tree
更精确的时间信息,显示一个调用列表,在该列表中展开方法或函数节点会显示它调用了的方法节点。  找到我们的代码,展开看我们每一个方法消耗的时间,进行优化。
- Self Time:运行自己的代码所消耗的时间
- Children Time:调用其他方法的时间
- Total Time:前面两者的时间之和
Debug API
除了直接使用 Profile 启动之外,还可以借助 Debug API 生成 trace 文件。
class MyApplication : Application() {
init {
Debug.startMethodTracing("debug_trace")
}
}
class MainActivity:AppCompatActivity(){
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
Debug.stopMethodTracing()
}
}
运行 App,则会在 sdcard 中生成一个 debug_trace.trace 文件(需要读写权限),在 Android Studio 中查看这个文件即可。
2. 合理使用异步初始化、延迟初始化、懒加载机制
将一些第三方 SDK,或者不必要那么早初始化的数据异步、延迟或懒加载。
3. 启动过程避免耗时操作
主要是 IO、网络 等操作,如果有较大的 SP,也应该注意
4. 类加载优化
5. 黑白屏问题(用户体验优化)
添加 windowBackground 提升用户体验
6. 简化布局
减少布局层级,去掉不必要的嵌套,merge
7. StrictMode 严苛模式
StrictMode是一个开发人员工具,它可以检测出我们可能无意中做的事情,并将它们提请我们注意,以便我们能够 修复它们。 StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问。帮助我们让磁盘和网络操作远离主线程,可以 使应用程序更加平滑、响应更快。
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build()
)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build()
)
}
}
}
|