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 都加载整个框架 内存省 → 共享只读类库和资源 进程隔离 → 每个应用有独立空间,互不干扰
|