Android 应用进程、四大组件与系统架构全景(API 34)《Android深水区(一)》

14 阅读4分钟

Android 应用进程、四大组件与系统架构全景(API 34):从 Zygote 到 ActivityThread

本文属于 Android 系统化技术博客系列(A019)。建议先掌握协程通信基础,再结合官方文档与 AOSP 源码阅读。

你将搞懂:为什么 startActivity() 不会立刻 new Activity、多进程单例为何失效、冷启动为何被 Provider 拖慢,以及 AMS / ATMS / Binder 在其中的分工。

标签:Android, 四大组件, Process, Zygote, AMS, ATMS, Binder, system_server, 冷启动, Architecture

适合读者:Foundation(有 Kotlin 基础,想建立 Framework 全局地图)


前言

很多 Android 问题表面上是「某个 API 不好用」,根因往往在更底层:进程怎么被创建、组件由谁调度、应用与系统服务如何通信

典型困惑:

  • 为什么 startActivity() 不会立刻 new 出目标页面?
  • 为什么后台 Service 会被系统回收?
  • 为什么多进程里单例会失效?

要回答这些,需要先建立一张系统地图:应用层、Framework API、系统服务、Native 层各自负责什么。本文是系列 A019,为 Activity 生命周期、启动模式、Context 区别等后续文章打基础。行为描述以 API 34 / android-14 为参考,请以项目 targetSdkVersion 为准。

前置:建议已了解 Channel / SharedFlow / StateFlow(系列 A018)。


核心概念

四大应用组件

组件职责典型入口调度侧(概览)
Activity有界面交互startActivity()ATMS + ActivityThread
Service后台长任务startService() / bindService()AMS + ActivityThread
BroadcastReceiver广播响应sendBroadcast() / 注册AMS(注册与投递)
ContentProvider跨应用数据共享ContentResolverAMS + ActivityThread

另有 Application:进程级入口,非「四大组件」之一。

要点:组件不是普通对象,不能 new Activity() 指望它能用;调度决策多在 system_server业务回调在应用主线程。

应用进程

  • 默认独立 Linux 进程,独立 UID,沙箱隔离。
  • Zygote fork,Copy-on-Write 共享预加载类,加速启动。
  • android:process 可声明多进程(:push 等)。

系统分层架构

flowchart TB
  subgraph AppLayer["应用层"]
    UI["Activity / Compose"]
    Svc["Service"]
    BR["BroadcastReceiver"]
    CP["ContentProvider"]
  end
  subgraph Framework["Framework API"]
    Ctx["Context"]
    AM["ActivityManager 客户端"]
  end
  subgraph SystemServer["system_server"]
    AMS["AMS"]
    ATMS["ATMS"]
  end
  subgraph Native["Native"]
    Binder["Binder"]
    Zygote["Zygote"]
  end
  UI --> Ctx --> AM
  AM -->|Binder| AMS
  AM -->|Binder| ATMS
  Zygote -->|fork| AppLayer

读图口诀:决策在 system_server,执行在 ActivityThread 主线程。


工作流程

从开机到首个 Activity

sequenceDiagram
  participant Z as Zygote
  participant ATMS as ATMS
  participant AT as ActivityThread
  participant Act as Activity
  ATMS->>Z: fork 应用进程
  Z-->>AT: 主线程 + Looper
  AT->>AT: installContentProviders
  AT->>AT: Application.onCreate
  ATMS->>AT: scheduleTransaction
  AT->>Act: performLaunchActivity → onCreate

进程优先级(简化)

flowchart LR
  FG["前台"] --> VIS["可见"] --> SVC["服务"] --> CACHED["缓存"]
  CACHED -->|内存压力| KILL["被杀"]

前台最后死、缓存最先牺牲——这一模型长期有效,具体实现随版本演进(lmkd、PSI 等)。


API 使用

Manifest(Android 12+ 注意 exported)

<activity
    android:name=".ui.MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<service
    android:name=".push.PushService"
    android:process=":push"
    android:exported="false" />

intent-filter 的组件必须显式声明 android:exported(Android 12+)。

Kotlin 最小示例

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        startActivity(Intent(this, DetailActivity::class.java))
    }
}

class DownloadService : Service() {
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int) =
        START_NOT_STICKY
    override fun onBind(intent: Intent?): IBinder? = null
}

Activity 启动链(API 28+ ClientTransaction)

Activity.startActivity()
  → Instrumentation.execStartActivity()
  → ATMS.startActivity()              // Binder 跨进程
  → scheduleTransaction(ClientTransaction)
  → TransactionExecutor.execute()
  → LaunchActivityItem.execute()
  → performLaunchActivity() → onCreate()   // 主线程

Android 9 以前多以 handleLaunchActivity 为主;API 28+ 以 ClientTransaction 为准


源码分析要点

ActivityThread 启动顺序(主线程)

ActivityThread.main()
  → attach()
  → installContentProviders()   // 早于 Application!
  → callApplicationOnCreate()
  → Looper.loop()

冷启动坑:Provider onCreate()Application.onCreate() 之前同步执行。

AMS / ATMS 分工

模块职责
ATMSActivity 任务栈、启动模式、多窗口
AMS进程、Service、Broadcast、Provider 协调

应用里拿到的 ActivityManagerBinder 代理,真身在 system_server

广播版本差异

场景要点
动态注册随进程生死
静态注册Android 8.0+ 隐式广播大量不可用
targetSdk 31+须声明 exported

实战案例

① 推送 :push 多进程
单例不跨进程;用 AIDL / Messenger / Provider;勿用已废弃的 MODE_MULTI_PROCESS

② 冷启动慢
查 Provider 链;adb shell am start -W -n pkg/.Activity;用 App Startup 合并初始化。

③ 后台定位被杀
Android 8.0+ 需 Foreground Service + 合法 foregroundServiceType,或 WorkManager。


性能优化

维度方向
冷启动延迟初始化、Baseline Profile、监控 TTID/TTFD
多进程非必要不开
Binder主线程避免同步大事务
内存onTrimMemory() 主动释放
adb shell am start -W -n com.example.app/.MainActivity
adb shell dumpsys meminfo com.example.app

常见误区

  1. 可以 new Activity()不行
  2. Service 一定能保活 — 后台限制下随时可能停
  3. 多进程共享单例 — 须 IPC
  4. Manifest 静态广播一定能收 — 8.0+ 大量受限
  5. ActivityManager = AMS 实例 — 只是代理

面试考点(精选)

  1. 四大组件各解决什么?
  2. Zygote 作用?
  3. ActivityThread 是线程吗?
  4. startActivityonCreate 跨了哪些层?
  5. 为何引入 ClientTransaction?
  6. 多进程单例为何失效?
  7. AMS vs ATMS?
  8. Binder 角色(Proxy / Stub / 驱动)?
  9. 系统如何选进程杀?
  10. 冷启动 vs 热启动?

第 4 题要点Instrumentation → Binder 到 ATMS → 必要时 Zygote fork → ClientTransaction → 主线程 onCreate


总结

  1. 组件 = 系统调度单元,不是普通对象。
  2. 进程 = 资源与安全边界,Zygote fork,AMS 管生死。
  3. Binder 连接应用与 system_server — 决策在服务端,执行在主线程。

系列:A018 协程流 → A019 本文 → A020 生命周期 → A021 启动模式 → A027 Context


参考资料


标签:#Android #四大组件 #Process #Zygote #AMS #ATMS #Binder #system_server #冷启动 #Architecture