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
CompleteThisTime
:最后一个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 协议 ,转载请注明出处!