首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Android ActivityThread 源碼深度解析:應用進程主線程的核心調度器

     編輯:Java 綜合教學

ActivityThread:Android 應用進程的「心臟」與大腦

ActivityThread 是 Android 應用進程的主線程入口類,運行在 main() 方法中啟動的 Looper 線程(即 UI 線程)。它負責管理四大組件生命週期、處理系統 IPC 消息、維護進程級上下文資源,是應用與系統服務交互的核心樞紐。

核心職責

  • 主線程消息循環:Looper.prepareMainLooper() + Looper.loop(),處理 H 內部 Handler 分發的消息
  • 組件生命週期代理:接收 AMS (ActivityManagerService) 通過 Binder 傳遞的調度請求(如 LAUNCH_ACTIVITY、PAUSE_ACTIVITY、CREATE_SERVICE),轉換為本地調用
  • 進程級資源管理:LoadedApk (包信息緩存)、Resources、ContentProvider、Application、Instrumentation、BackupAgent 等
  • 配置變更分發:語言、方向、密度等配置變更通知給所有組件
  • 異常捕獲與上報:UncaughtExceptionHandler、ANR 監控、DropBox 上報

關鍵內部類與數據結構

類/字段作用
H extends Handler主線程消息處理器,定義 30+ 消息類型常量 (LAUNCH_ACTIVITY=100, RESUME_ACTIVITY=107...)
ActivityClientRecordActivity 在客戶端的運行時記錄:token、intent、state、activity 實例、window、配置等
AppBindData進程綁定應用數據:ApplicationInfo、提供者列表、儀器信息、調試模式等
LoadedApkAPK 級緩存:ClassLoader、Resources、ApplicationInfo、兼容性信息
ApplicationThread (Binder)實現 IApplicationThread AIDL 接口,接收 AMS 跨進程調用
mActivities (HashMap<IBinder, ActivityClientRecord>)當前進程所有 Activity 記錄映射表
mServices / mProviderMapService/ContentProvider 客戶端記錄

主線程啟動流程 (main())

public static void main(String[] args) {
    SamplingProfilerIntegration.start(); // 性能分析
    Process.setArgV0("<pre class=\"code\">"); // 進程名
    Looper.prepareMainLooper();          // 初始化主 Looper
    if (sMainThreadHandler == null) sMainThreadHandler = new Handler();
    ActivityThread thread = new ActivityThread();
    thread.attach(false);                // 綁定 AMS、獲取配置
    Looper.loop();                       // 進入無限消息循環
    // loop 退出只有進程被殺
    thread.detach();
}

核心消息處理流程 (H.handleMessage)

AMS 通過 ApplicationThread.scheduleXxx 發送單向 Binder 調用,最終入隊 H 消息隊列,主線程依次處理:

Activity 啟動流程

  1. scheduleLaunchActivity → H.LAUNCH_ACTIVITY
  2. handleLaunchActivity → performLaunchActivity
    • 創建 LoadedApk、ClassLoader
    • Instrumentation.newActivity 反射實例化 Activity
    • 創建 ContextImpl、關聯 Application
    • activity.attach() 綁定上下文、窗口、儀器
    • Instrumentation.callActivityOnCreate() → onCreate()
    • activity.performStart() → onStart()
    • Instrumentation.callActivityOnPostCreate()
  3. handleResumeActivity → performResumeActivity
    • 分發 onNewIntent、onActivityResult
    • activity.performResume() → onResume()
    • 創建/顯示 Window (添加 DecorView 到 WindowManager)
    • 加入 IdleHandler 上報 activityIdle 給 AMS

Activity 暫停/停止/銷毀

  • PAUSE_ACTIVITY → performPauseActivity → onPause() → activityPaused 通知 AMS
  • STOP_ACTIVITY → performStopActivityInner → onStop() → 生成縮略圖/描述 → activityStopped
  • DESTROY_ACTIVITY → handleDestroyActivity → onDestroy() → 移除 Window、清理上下文

Configuration 變更處理

  1. scheduleConfigurationChanged → H.CONFIGURATION_CHANGED
  2. handleConfigurationChanged → applyConfigurationToResourcesLocked 更新所有 Resources
  3. 收集所有 ComponentCallbacks (Activity、Service、Application、Provider) → 依次回調 onConfigurationChanged()

Service/ContentProvider/BroadcastReceiver 生命週期

  • Service:CREATE_SERVICE → onCreate();BIND_SERVICE → onBind();SERVICE_ARGS → onStartCommand();STOP_SERVICE → onDestroy()
  • Provider:installProvider 本地實例化或跨進程代理,引用計數管理 (ProviderRefCount)
  • Receiver:RECEIVER → 反射實例化 BroadcastReceiver → onReceive() → 有序廣播等待結果

關鍵設計模式與機制

  1. Handler + Looper 消息驅動:主線程單線程串行處理所有 UI 與組件回調,避免併發問題
  2. Binder IPC 異步單向調用:AMS → ApplicationThread 為 oneway,不阻塞系統服務,靠 H 排序保證順序
  3. Token (IBinder) 作為組件標識:不傳遞實體對象,通過 token 映射客戶端記錄,安全高效
  4. LoadedApk 緩存機制:按包名緩存 ClassLoader、Resources、Application,支援多進程、插件化、熱修復基礎
  5. GC Idler 優化:GcIdler 在消息隊列空閒時觸發 GC,間隔 ≥ 5s,減少卡頓
  6. JIT 編譯啟用:ensureJitEnabled() 延遲啟動 JIT,優化啟動速度

常見問題排查視角

  • ANR (Application Not Responding):主線程 Looper.loop() 被長耗時操作阻塞 (如 onCreate 做 IO、鎖競爭、死鎖)。檢查 /data/anr/traces.txt 中 main 線程堆疊
  • 內存洩漏:mActivities 持有已銷毀 Activity 引用 (未正確 remove)、非靜態內部類/匿名類持有外部引用、靜態集合累積
  • 資源未釋放:Cursor、Receiver、Sensor、Window 未在對應生命週期釋放
  • 啟動慢:attach()、performLaunchActivity 耗時過長,可用 TraceView/Perfetto 分析

總結

ActivityThread 是 Android 應用運行時的核心協調者,將系統服務的異步 IPC 請求轉化為主線程有序的生命週期回調,管理進程級資源緩存與配置分發。深入掌握其消息循環、組件代理、資源管理機制,對於性能優化、ANR 排查、插件化/熱修復框架開發、系統原理面試具有決定性價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved