0%

安卓启动优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
Android 启动优化:从冷启动到首帧渲染

原理 → 工具 → 优化策略 → 实战代码 全流程解析 Android 启动优化

⭐ 目录

什么是应用启动?

冷启动 / 温启动 / 热启动的区别

Android 启动流程原理(Zygote → AMS → ActivityThread)

启动性能分析工具(Systrace / Perfetto / Start-up Profiler)

启动优化策略(从布局到异步化)

启动优化实战代码

启动耗时监控:生产环境落地方案

1. 什么是应用启动?

Android 官方定义应用启动包含:

Process Start:系统为你的 APP 创建新进程

Application.attach / onCreate

ActivityThread 创建 Activity

setContentView

首帧渲染完成(First Draw)

👉 从点击图标到看到主界面的整个过程,就是启动过程。

2. 冷启动 / 温启动 / 热启动
冷启动(Cold Start)

APP 进程完全不存在,需要:

fork Zygote 生成进程

初始化 Application

创建 Activity

⏱耗时最长,也是我们最要优化的。

温启动(Warm Start)

进程还在,但 Activity 被销毁,需要:

重新创建 Activity

热启动(Hot Start)

Activity 被放到后台并未销毁,仅需恢复界面。

3. Android 启动流程原理

完整启动链路如下:

Launcher 点击图标

AMS(ActivityManagerService) → 启动进程

Zygote fork 出应用进程

ActivityThread.main()

Application.attach() / onCreate()

创建 Activity → onCreate()

setContentView() → LayoutInflate

首帧渲染 Choreographer#doFrame()


看起来很长,但真正拖慢启动速度的主要集中在:

✔ Application.onCreate
✔ Activity.onCreate
✔ 布局过度复杂(setContentView)
✔ 主线程阻塞耗时任务

4. 启动性能分析工具

Google 提供了非常强大的工具来监控启动过程。

① Logcat Start-up Profiler(最简单)

Android Studio → Logcat → 使用过滤器 ActivityTaskManager
可以直接看到:

Displayed com.xxx/.MainActivity +500ms

② Android Studio Profiler - Startup

从 Android Studio 4.2 后有独立的 Startup Profiler。

可以看到:

Application 初始化耗时

Activity 初始化耗时

布局耗时

CPU 占用

③ Perfetto / Systrace(最专业)

可以分析每一段调用链耗时。
复杂,但分析非常精准,用于深度优化。

5. 启动优化策略(最核心)

Android 启动优化的核心结论只有一句话:

把所有不影响首屏显示的任务,全部延后。

(1)Application.onCreate 要“瘦身”

不要做:

复杂 SDK 初始化

大量 I/O 操作

大量反射

应该做:

只做必要初始化

其余延迟到 IdleHandler 或后台线程

(2)避免主线程阻塞

典型坑点:

读写文件

查询数据库

网络请求

SharedPreferences.apply() 卡顿

(3)首屏布局优化

减少嵌套(LinearLayout + ConstraintLayout)

使用 ViewStub 延迟加载

避免在 XML 中使用过度复杂的 Constraint

(4)使用 SplashActivity 容灾

在 Android 12 后必须使用 SplashScreen API,但仍可以:

在 Splash 阶段做预加载

减少真正 Activity 的压力

6. 启动优化实战代码

下面给你能直接复制使用的 Application 延迟初始化模板:

class App : Application() {

override fun onCreate() {
super.onCreate()

// 必要初始化(主线程)
initLogger()
initCrashHandler()

// 非必要初始化延迟执行
delayInit()
}

private fun delayInit() {
// 方式1:IdleHandler(UI 空闲时)
Looper.myQueue().addIdleHandler {
initBigSdk()
false
}

// 方式2:后台线程
Executors.newSingleThreadExecutor().execute {
initDatabase()
initAds()
initAnalytics()
}
}
}

启动耗时监控(线上生产可用)
object AppStartTrace {

private var appStartTime = 0L

fun start() {
appStartTime = System.currentTimeMillis()
}

fun end(activity: Activity) {
val cost = System.currentTimeMillis() - appStartTime
Log.d("AppStartTrace", "冷启动耗时:${cost}ms")
// 可上报后台
}
}


使用方式:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppStartTrace.end(this)
}
}

7. 总结
从 原理、工具、优化策略、实战代码、线上监控 全面介绍了 Android 启动优化。


✔ 启动流程(Zygote → AMS → Activity)
✔ 如何判断启动慢在哪里
✔ 如何用工具分析
✔ 如何分阶段初始化
✔ 如何优化布局
✔ 如何写可落地的启动监控