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
安卓 启动流程 可以分成两个角度看:

系统层面:点击桌面图标 → 应用进程启动

应用层面:Application → Activity 启动

我给你按顺序拆开讲 👇

1️⃣ 系统层面(从桌面图标开始)

用户点击应用图标

Launcher(桌面应用)根据 Manifest 里带有

<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>


的 Activity(一般是 LoginActivity / MainActivity)来启动。

Launcher 通过 AMS(ActivityManagerService)发起启动请求

发送一个 startActivity() 调用给系统的 ActivityManagerService。

Zygote 进程 fork 新进程

如果应用进程还没启动,AMS 会通过 Zygote fork 出一个新的应用进程。

新进程里第一个类是 ActivityThread,它是应用的主线程(UI 线程)。

加载应用代码

ActivityThread 通过 Binder IPC 通知 AMS:进程已启动,可以加载应用的入口组件。

系统会调用 Application.onCreate() → 然后再启动目标 Activity。

2️⃣ 应用层面(进程内)

Application 初始化

Application.attachBaseContext()

Application.onCreate()(初始化 SDK、日志、三方库等)

Activity 启动

Activity.attach() → 绑定窗口

Activity.onCreate()(初始化视图、数据)

Activity.onStart()

Activity.onResume()(进入前台,可交互)

👉 这时候用户看到的就是你的界面。

3️⃣ 简化流程图
点击图标

Launcher 发送 Intent 给 AMS

AMS 检查应用进程是否存在
├─ 否 → Zygote fork 进程 → 启动 ActivityThread
└─ 是 → 直接用已有进程

加载 Application

启动目标 Activity (onCreate → onStart → onResume)

用户看到界面

4️⃣ 举个例子

比如你点开 微信 图标:

Launcher 找到 MainActivity 的入口声明(MAIN + LAUNCHER)。

AMS 检查进程是否在 → 不在就 fork 新进程。

Application 初始化,SDK 注册(如微信的 MMKV、本地数据库、日志等)。

MainActivity 执行生命周期,显示界面。



再比如:Zygote是框架,每个点击app图标,只是给app一个空间,公用Zygote提供的框架。
Zygote (公共图书馆)
├─ 预加载 Android 框架类、资源(共享)
└─ fork → 每个 App 有自己的房间
├─ Application 实例
├─ Activity 实例
└─ 私有数据
好处

启动快 → 不用每个 App 都加载整个框架
内存省 → 共享只读类库和资源
进程隔离 → 每个应用有独立空间,互不干扰