Android性能优化-启动优化
App启动分为三种:
冷启动、热启动、温启动启动优化主要在
冷启动时进行。
冷启动——Cold Start
开机后第一次启动应用 或者 应用被杀死后再次启动。
冷启动耗时检测
adb命令1
2
3
4adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN执行adb命令后,返回如下内容
1
2
3
4
5
6Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete
ThisTime:最后一个Activity的启动耗时TotalTime:表示新应用启动的耗时,包括新进的启动和Activity的启动。WaitTime:应用进程的创建过程 + TotalTime
主要关注
TotalTime就可以。logcat在Android 4.4之后,logcat可以输出启动时间,只要筛选
Displayed的值。1
I/ActivityManager: Displayed com.example.pigai/.MainActivity: +2s241ms其中
+2s241ms就是冷启动的时间代码插桩方式
冷启动启动过程
在冷启动开始时,系统有三个任务,他们是:
- 加载并启动应用——对应
Launcher startActivity()过程,即点击桌面图标 - 在启动后立即显示应用的空白启动窗口——对应
AMS startActivity过程 - 创建应用进程——对应
AMS startProcessLocked() -> Zygote fork进程
上述三步都是开发者无法进行干预的系统过程
在AMS.startProcessLocked()之后,调用到了Process.start()继续向下到ZygoteProcess.start(),然后通过ZygoteSocket(是为LocalSocket).connect()与ZygoteServer进行连接,接收到ZygoteSocket发送的消息后,执行ZygoteConnection.processOneCommand()执行到Zygote.forkAndSpecialize()孵化应用进程。
在创建应用进程之后,应用进程继续执行后续流程
ActivityThread.main()
创建应用对象
对应
ActivityThread.attach() -> AMS.attachApplication() -> ActivityThread.handleBindApplication() -> LoadApk.makeApplication() -> Application.onCreate()过程启动主线程
对应
ActivityThread.main() -> Looper.loop()过程,主线程开始循环创建主Activity
对应
ActivityThread.handleLaunchActivity()过程加载布局
对应
Activity.onCreate() -> setContentView()过程布局屏幕
对应
Activity.onStart()过程执行初始绘制
对应
Activity.handleResumeActivity() -> Activity.onResume()过程

热启动——Hot Start
应用退回到后台再次启动
温启动——Warm Start
应用已经启动,返回键退出
启动优化
参考链接
Activity启动过程本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!