文章目錄
- 什么是binder
- 1. 什么是Binder?
- 2. Binder架構組成
- 3. 工作原理與通信流程
- 1)服務注冊
- 2)服務查詢
- 3)通信過程
- 4)核心數據結構
- 4. 關鍵技術點
- 5. 常見面試考點
- 1)Binder與傳統IPC(Socket、管道、共享內存等)對比
- 2)AIDL與Binder關系
- 3)Binder線程池與ANR
- 4)Binder通信的生命周期與內存管理
- 5)Binder的安全機制
- 6. 面試表達建議(簡明版)
- 7. 簡易流程圖
- 什么是 AMS(Activity Manager Service)
- app的啟動,點擊launcher icon 開始
- 1. 總覽:從點擊應用Icon到Activity顯示的主流程
- 2. 詳細分步流程
- 1)Launcher進程接收點擊事件
- 2)Launcher通過Binder向SystemServer請求啟動Activity
- 3)AMS處理啟動請求
- 4)進程管理與Zygote孵化
- 5)Application進程啟動
- 6)ActivityThread請求啟動Activity
- 7)Activity界面顯示
- 3. 關鍵技術細節與源碼鏈路
- 1)Binder跨進程通信
- 2)進程孵化與Zygote
- 3)主線程消息機制
- 4)Activity生命周期管理
- 5)Window與View體系
- 4. 源碼調用鏈(簡化)
- 5. 流程時序圖
- 6. 面試答題建議(精煉版)
- ActivityA調用`startActivity(Intent)`啟動ActivityB
- 詳細流程分解
- 1)ActivityA進程(應用層)
- 2)AMS(ActivityManagerService,SystemServer進程)
- 3)目標應用進程(ActivityB所屬進程)
- 4)ActivityA與ActivityB的生命周期切換
- 3. 源碼關鍵鏈路(簡化)
- 4. 時序圖
- 6. 面試答題建議
什么是binder
1. 什么是Binder?
Binder 是 Android 系統中實現進程間通信(IPC, Inter-Process Communication)的核心機制。它是 Android 獨有的、基于C/S架構的高效IPC框架,底層由內核驅動支持,廣泛用于系統服務(如AMS、WMS、Service等)和應用間通信。
2. Binder架構組成
- Binder驅動(內核空間)
位于/dev/binder
,負責消息的傳遞和對象引用管理。 - ServiceManager(守護進程)
管理所有Binder服務的注冊與查詢。 - Server端(服務提供者)
繼承自Binder
,實現具體業務邏輯。 - Client端(服務調用者)
通過Proxy
代理對象與服務端通信。 - Binder庫(用戶空間)
提供Java和C++的Binder通信API。
3. 工作原理與通信流程
1)服務注冊
- 服務端(如SystemServer中的AMS)繼承Binder,實現業務接口,并通過ServiceManager注冊服務。
2)服務查詢
- 客戶端通過ServiceManager查詢目標服務,獲得一個Binder代理對象(Proxy)。
3)通信過程
- 客戶端通過Proxy發起遠程方法調用,數據通過Parcel序列化,傳遞給Binder驅動。
- Binder驅動負責跨進程傳遞數據,喚醒服務端線程池,服務端解包數據并執行方法。
- 返回值同樣通過Binder驅動回傳給客戶端。
4)核心數據結構
- IBinder:Java層的Binder接口,所有Binder對象的基類。
- Parcel:高效的序列化/反序列化容器。
- Binder線程池:服務端用于處理Binder請求的線程池。
4. 關鍵技術點
- 零拷貝/高效傳輸:Binder驅動采用內核空間的內存映射,減少用戶空間與內核空間的數據拷貝,提高效率。
- 引用計數/安全性:Binder機制自動管理對象引用,防止內存泄漏和非法訪問。
- 權限校驗:支持UID/PID校驗,保證通信安全。
- 支持一對多/多對多通信:如AIDL、Messenger、ContentProvider等都基于Binder。
Binder通信的安全與性能機制
安全機制
Binder驅動自動傳遞調用方的UID/PID,服務端可做身份校驗。
支持權限聲明(如AIDL接口可聲明enforcePermission),防止未授權訪問。
配合SELinux、App沙箱機制,進一步提升安全性。
性能機制
Binder采用內核空間的內存映射(mmap),實現零拷貝或最小拷貝,效率高于Socket等傳統IPC。
支持對象引用傳遞(Binder引用計數),避免重復序列化。
線程池機制避免主線程阻塞,提升并發處理能力。
5. 常見面試考點
1)Binder與傳統IPC(Socket、管道、共享內存等)對比
- 性能高、支持對象引用、支持跨語言、內核級安全、易用性強。
2)AIDL與Binder關系
- AIDL自動生成Stub和Proxy,底層通信依賴Binder機制。
3)Binder線程池與ANR
- 服務端通過線程池處理請求,若線程池耗盡或主線程阻塞,可能導致ANR。
4)Binder通信的生命周期與內存管理
- Binder驅動自動管理引用計數,防止內存泄漏。
5)Binder的安全機制
- 支持權限校驗、SELinux策略、UID/PID傳遞。
6. 面試表達建議(簡明版)
Binder是Android系統實現高效進程間通信的核心機制,底層由內核驅動支持,采用C/S架構。它通過ServiceManager實現服務注冊與查詢,客戶端通過Proxy對象與服務端通信,數據通過Parcel序列化后由Binder驅動在內核空間高效傳遞。Binder機制具備高性能、強安全性、自動內存管理等優點,是Android系統服務、AIDL、Messenger等IPC的基礎。
7. 簡易流程圖
什么是 AMS(Activity Manager Service)
? 基本信息:AMS是Framework層的系統服務,運行在system_server進程中,是一個Java層的單例類。系統啟動時由SystemServer.java初始化,通過Binder IPC機制與應用程序通信。
? 核心功能
? 生命周期管理:負責Activity、Service、BroadcastReceiver等組件的啟動、暫停、停止、銷毀等生命周期操作。
? 進程管理:根據應用優先級管理進程的創建、銷毀和優先級調整,通過ProcessRecord記錄進程信息,必要時回收低優先級進程以釋放資源。
? 任務棧管理:通過ActivityStack和TaskRecord管理Activity的任務棧,支持多任務、多窗口模式,決定Activity在任務棧中的創建和存放方式。
? 權限管理:檢查應用權限,確保應用在訪問敏感資源時具備相應權限。
? ANR監控:監控主線程的響應時間,若主線程阻塞超過默認5秒,會觸發ANR彈窗。
? 相關關鍵類與數據結構
? ActivityManagerService:AMS的核心類,管理所有與Activity相關操作。
? ActivityStack:管理Activity的任務棧。
? TaskRecord:表示一個任務,包含多個Activity。
? ProcessRecord:記錄進程信息。
? ActivityRecord:表示一個Activity實例。
? Activity啟動模式:AMS會根據Activity的啟動模式決定其在任務棧中的創建和管理方式。啟動模式包括standard(標準模式)、singleTop(棧頂復用模式)、singleTask(棧內復用模式)和singleInstance(單實例模式),開發者可在AndroidManifest.xml中設置或通過Intent標志動態改變。
? Intent解析與分發:當應用發送Intent時,AMS會根據其動作、數據等信息查找符合條件的組件,遍歷AndroidManifest.xml文件進行匹配,找到后將Intent分發給相應組件。
app的啟動,點擊launcher icon 開始
1. 總覽:從點擊應用Icon到Activity顯示的主流程
- Launcher進程接收點擊事件
- Launcher通過Binder向SystemServer請求啟動Activity
- SystemServer(AMS)處理啟動請求
- 進程存在性檢查,必要時Zygote孵化新進程
- Application進程啟動,ActivityThread啟動主線程
- ActivityThread通過Handler分發消息,反射創建Activity
- Activity生命周期回調,界面最終顯示
2. 詳細分步流程
1)Launcher進程接收點擊事件
- 用戶點擊桌面應用icon,Launcher的
onClick()
被觸發。 - Launcher構造一個
Intent
(包含包名、Activity信息),調用startActivity()
。
2)Launcher通過Binder向SystemServer請求啟動Activity
startActivity()
最終調用到Instrumentation.execStartActivity()
。- 通過AIDL接口,Binder跨進程調用
ActivityManagerService.startActivity()
(AMS,系統服務,運行在SystemServer進程)。
3)AMS處理啟動請求
- AMS進行權限校驗、Intent解析、任務棧管理等。
- 判斷目標應用進程是否存在:
- 已存在:直接調度啟動Activity。
- 不存在:需要先啟動應用進程。
4)進程管理與Zygote孵化
- 若目標進程不存在,AMS調用
startProcessLocked()
,通過Process.start()
請求Zygote孵化新進程。 - Zygote進程通過socket接收fork請求,fork出新的App進程,并在新進程中執行
ActivityThread.main()
。
5)Application進程啟動
- 新進程啟動后,執行
ActivityThread.main()
,進入主線程(UI線程)消息循環。 - 通過Binder回調
attachApplication()
,AMS與新進程建立通信。
6)ActivityThread請求啟動Activity
- AMS通過Binder回調
scheduleLaunchActivity()
,通知App進程啟動目標Activity。 ActivityThread
收到消息后,通過Handler
切換到主線程,調用performLaunchActivity()
。- 反射創建Activity實例,依次調用
attach()
、onCreate()
等生命周期方法。
7)Activity界面顯示
- Activity創建完成后,
setContentView()
加載布局,ViewRootImpl與WindowManager建立聯系。 - WindowManager通過SurfaceFlinger合成界面,最終Activity界面顯示在屏幕上。
3. 關鍵技術細節與源碼鏈路
1)Binder跨進程通信
- Launcher與AMS、AMS與App進程之間均通過Binder通信,保證了進程間的高效與安全。
2)進程孵化與Zygote
- Zygote采用fork機制,極大提升了新進程啟動速度(共享內存、Copy-On-Write)。
3)主線程消息機制
- ActivityThread基于Looper/Handler機制,保證所有UI操作在主線程串行執行,避免線程安全問題。
4)Activity生命周期管理
- AMS全局管理Activity棧,負責生命周期調度、任務切換、回收等。
5)Window與View體系
- Activity通過WindowManager與系統窗口管理服務交互,ViewRootImpl負責View的繪制、輸入分發等。
4. 源碼調用鏈(簡化)
- Launcher進程
onClick()
→startActivity()
→Instrumentation.execStartActivity()
→AMS.startActivity()
- AMS(SystemServer)
startActivity()
→startProcessLocked()
(如需新進程)→Process.start()
→ Zygote fork
- App進程
ActivityThread.main()
→attach()
→AMS.attachApplication()
→scheduleLaunchActivity()
→ActivityThread.H.handleMessage()
→performLaunchActivity()
→Activity.attach()
→Activity.onCreate()
5. 流程時序圖
6. 面試答題建議(精煉版)
Android應用從點擊icon到Activity顯示,涉及Launcher、AMS、Zygote、App進程、ActivityThread等多個系統組件。Launcher通過Binder向AMS發起啟動請求,AMS負責進程管理和任務棧調度,必要時通過Zygote fork新進程。新進程啟動后,ActivityThread通過Handler機制反射創建Activity并回調生命周期,最終通過WindowManager和SurfaceFlinger將界面顯示到屏幕。整個過程高度依賴Binder通信、進程管理、消息機制和窗口系統,是Android系統架構的核心體現。
ActivityA調用startActivity(Intent)
啟動ActivityB
當ActivityA調用startActivity(Intent)
啟動ActivityB時,涉及應用進程、系統服務(AMS)、Binder通信、任務棧管理、ActivityThread調度、生命周期回調等多個環節。
詳細流程分解
1)ActivityA進程(應用層)
-
調用鏈
ActivityA.startActivity(Intent)
→Activity.startActivityForResult()
→Instrumentation.execStartActivity()
→ 通過AIDL接口,Binder跨進程調用AMS(ActivityManagerService)的startActivity()
。
-
技術點
- Instrumentation用于監控和插樁,便于測試和生命周期管理。
- Binder機制實現進程間通信,傳遞Intent、包名、調用者信息等。
2)AMS(ActivityManagerService,SystemServer進程)
-
權限與Intent校驗
- 校驗調用者權限、Intent合法性、目標Activity是否可達。
- 解析Intent,查找匹配的Activity(PackageManagerService參與)。
-
任務棧與ActivityRecord管理
- 根據Intent flag、launchMode等,決定ActivityB是新建Task、復用Task還是在當前Task中入棧。
- 創建
ActivityRecord
對象,記錄ActivityB的所有元信息。 - 維護
ActivityStackSupervisor
和ActivityStack
,管理所有任務棧和Activity狀態。
-
進程調度
- 判斷ActivityB所屬進程是否存在:
- 已存在:直接調度。
- 不存在:調用
startProcessLocked()
,通過Zygote fork新進程。
- 判斷ActivityB所屬進程是否存在:
-
調度啟動
- 通過Binder回調目標進程的
ApplicationThread.scheduleLaunchActivity()
,通知其啟動ActivityB。
- 通過Binder回調目標進程的
3)目標應用進程(ActivityB所屬進程)
-
ActivityThread消息分發
ApplicationThread
(Binder服務端)收到scheduleLaunchActivity()
,通過Handler切換到主線程。- 調用
ActivityThread.handleLaunchActivity()
,最終執行performLaunchActivity()
。
-
Activity創建與生命周期
- 反射創建ActivityB實例,依次調用
attach()
、onCreate()
、onStart()
、onResume()
等生命周期方法。 - Instrumentation參與生命周期回調,便于測試和監控。
- 反射創建ActivityB實例,依次調用
-
界面顯示
setContentView()
加載布局,ViewRootImpl與WindowManager建立聯系,最終通過SurfaceFlinger合成界面。
4)ActivityA與ActivityB的生命周期切換
- AMS會根據啟動模式和棧頂情況,決定ActivityA是否進入
onPause()
、onStop()
等狀態。 - ActivityB啟動后成為前臺,ActivityA可能被暫停或停止。
3. 源碼關鍵鏈路(簡化)
- 應用進程
Activity.startActivity()
Instrumentation.execStartActivity()
ActivityManagerService.startActivity()
- AMS
startActivity()
startProcessLocked()
(如需新進程)ApplicationThread.scheduleLaunchActivity()
- 目標進程
ActivityThread.handleLaunchActivity()
Instrumentation.callActivityOnCreate()
Activity.onCreate()
4. 時序圖
6. 面試答題建議
ActivityA啟動ActivityB時,應用進程通過Binder調用AMS,AMS負責權限校驗、Intent解析、任務棧管理和進程調度。AMS通過Binder回調目標進程的ApplicationThread,ActivityThread在主線程反射創建ActivityB并回調生命周期。整個過程涉及Binder通信、任務棧與ActivityRecord管理、進程孵化、Instrumentation插樁等,是Android四大組件調度的核心流程。