Android 組件內核

文章目錄

    • 什么是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. 簡易流程圖

ClientServiceManagerBinder驅動Server查詢服務返回Binder代理發送請求(Parcel序列化)喚醒線程池,傳遞數據處理請求,返回結果返回結果ClientServiceManagerBinder驅動Server

什么是 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顯示的主流程

  1. Launcher進程接收點擊事件
  2. Launcher通過Binder向SystemServer請求啟動Activity
  3. SystemServer(AMS)處理啟動請求
  4. 進程存在性檢查,必要時Zygote孵化新進程
  5. Application進程啟動,ActivityThread啟動主線程
  6. ActivityThread通過Handler分發消息,反射創建Activity
  7. 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. 源碼調用鏈(簡化)

  1. Launcher進程
    • onClick()startActivity()Instrumentation.execStartActivity()AMS.startActivity()
  2. AMS(SystemServer)
    • startActivity()startProcessLocked()(如需新進程)→ Process.start() → Zygote fork
  3. App進程
    • ActivityThread.main()attach()AMS.attachApplication()scheduleLaunchActivity()ActivityThread.H.handleMessage()performLaunchActivity()Activity.attach()Activity.onCreate()

5. 流程時序圖

UserLauncherAMSZygoteAppProcessActivityThreadActivity點擊應用iconstartActivity(Intent) (Binder)檢查進程/任務棧fork新進程(如需)fork成功,執行ActivityThread.main()attachApplication (Binder)scheduleLaunchActivity (Binder)Handler消息反射創建,生命周期回調界面顯示UserLauncherAMSZygoteAppProcessActivityThreadActivity

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的所有元信息。
    • 維護ActivityStackSupervisorActivityStack,管理所有任務棧和Activity狀態。
  • 進程調度

    • 判斷ActivityB所屬進程是否存在:
      • 已存在:直接調度。
      • 不存在:調用startProcessLocked(),通過Zygote fork新進程。
  • 調度啟動

    • 通過Binder回調目標進程的ApplicationThread.scheduleLaunchActivity(),通知其啟動ActivityB。

3)目標應用進程(ActivityB所屬進程)

  • ActivityThread消息分發

    • ApplicationThread(Binder服務端)收到scheduleLaunchActivity(),通過Handler切換到主線程。
    • 調用ActivityThread.handleLaunchActivity(),最終執行performLaunchActivity()
  • Activity創建與生命周期

    • 反射創建ActivityB實例,依次調用attach()onCreate()onStart()onResume()等生命周期方法。
    • Instrumentation參與生命周期回調,便于測試和監控。
  • 界面顯示

    • setContentView()加載布局,ViewRootImpl與WindowManager建立聯系,最終通過SurfaceFlinger合成界面。

4)ActivityA與ActivityB的生命周期切換

  • AMS會根據啟動模式和棧頂情況,決定ActivityA是否進入onPause()onStop()等狀態。
  • ActivityB啟動后成為前臺,ActivityA可能被暫停或停止。

3. 源碼關鍵鏈路(簡化)

  1. 應用進程
    • Activity.startActivity()
    • Instrumentation.execStartActivity()
    • ActivityManagerService.startActivity()
  2. AMS
    • startActivity()
    • startProcessLocked()(如需新進程)
    • ApplicationThread.scheduleLaunchActivity()
  3. 目標進程
    • ActivityThread.handleLaunchActivity()
    • Instrumentation.callActivityOnCreate()
    • Activity.onCreate()

4. 時序圖

ActivityAAMSAppProcessBActivityThreadBActivityBstartActivity(Intent) (Binder)權限/Intent校驗、任務棧管理scheduleLaunchActivity (Binder)Handler消息反射創建、生命周期回調生命周期切換(onPause/onStop)ActivityAAMSAppProcessBActivityThreadBActivityB

6. 面試答題建議

ActivityA啟動ActivityB時,應用進程通過Binder調用AMS,AMS負責權限校驗、Intent解析、任務棧管理和進程調度。AMS通過Binder回調目標進程的ApplicationThread,ActivityThread在主線程反射創建ActivityB并回調生命周期。整個過程涉及Binder通信、任務棧與ActivityRecord管理、進程孵化、Instrumentation插樁等,是Android四大組件調度的核心流程。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88173.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java類加載機制:Tomcat的類加載機制

Tomcat類加載機制深度解析:打破雙親委派的Web容器實現 Tomcat作為Java Web容器,其類加載機制為滿足Web應用的隔離性、熱部署和兼容性需求,對標準Java類加載機制進行了定制化擴展,核心是打破雙親委派模型并引入多層級類加載器。以下…

【PTA數據結構 | C語言版】從順序表 list 中刪除第 i 個元素

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 請編寫程序,將 n 個整數存入順序表,對任一指定的第 i 個位置,將這個位置上的元素從順序表中刪除。注意:i 代表位序,從 1 開始,…

VS2022 C++ EasyX庫 掃雷游戲項目開發:打造經典游戲的詳細之旅

老樣子,先上效果 視頻演示 C經典掃雷-介紹一、引言 在這篇博客中,我將詳細介紹掃雷游戲項目的開發過程。掃雷作為一款經典的游戲,其規則簡單但富有挑戰性。通過開發這個項目,我不僅加深了對 C 編程的理解,還提升了自己…

Go語言網絡游戲服務器模塊化編程

本文以使用origin框架(一款使用Go語言寫的開源游戲服務器框架)為例進行說明,當然也可以使用其它的框架或者自己寫。 在框架中PBProcessor用來處理Protobuf消息,在使用之前,需要使用Register函數注冊網絡消息&#xff…

【機器人】Aether 多任務世界模型 | 4D動態重建 | 視頻預測 | 視覺規劃

Aether 是一個的世界模型,整合幾何重建與生成建模的統一框架,實現類人空間推理能力。 來自ICCV 2025,該框架具有三大核心功能: (1) 4D動態重建,(2) 動作條件視頻預測, (3) 目標條件視覺規劃。 代碼地址&…

MiniMind:3小時訓練26MB微型語言模型,開源項目助力AI初學者快速入門

開發|界面|引擎|交付|副駕——重寫全棧法則:AI原生的倍速造應用流來自全棧程序員 nine 的探索與實踐,持續迭代中。 歡迎關注評論私信交流~ 在大型語言模型(LLaMA、GPT等)日益流行的今天,一個名為…

相機Camera日志實例分析之五:相機Camx【萌拍閃光燈后置拍照】單幀流程日志詳解

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 目錄 一、場景操作步驟 二、日志基礎關鍵字分級如下 三、場景日志如下: 一、場景操作步驟 操作步…

[2-02-02].第03節:環境搭建 - Win10搭建ES集群環境

ElasticSearch學習大綱 基于ElasticSearch7.8版本 一、ElasticStack下載: 1.Elasticsearch 的官方地址 2.Elasticsearch 下載地址: 二、集群搭建: 第1步:創建es目錄: 1.創建 elasticsearch-cluster 文件夾,在內部…

操作系統核心技術剖析:從Android驅動模型到鴻蒙微內核的國產化實踐

目錄 一、移動端操作系統技術細節 1. Android 內核版本 核心模塊 驅動架構 國內定制案例 2. iOS XNU內核關鍵模塊 安全機制 3. HarmonyOS 多內核架構 驅動隔離 二、PC端操作系統技術細節 1. Windows NT內核 模塊分層 驅動模型 國內適配 2. macOS(X…

整合Spring、Spring MVC與MyBatis:構建高效Java Web應用

本文將詳細講解如何整合Spring、Spring MVC和MyBatis(SSM框架),通過一個人員信息查詢案例展示完整開發流程。所有代碼基于提供的文件實現。一、項目結構src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── qcb…

視頻插幀技術:從流暢觀影到AI創作的革命

一、起源:為什么需要視頻插幀? 視頻的本質是連續播放的靜態幀序列,幀率(FPS) 決定了流暢度。早期電影受限于拍攝技術和存儲成本,普遍采用24FPS,而現代顯示設備(如120Hz屏幕&#xf…

【一起來學AI大模型】PyTorch 實戰示例:使用 BatchNorm 處理張量(Tensor)

PyTorch 實戰示例 演示如何在神經網絡中使用 BatchNorm 處理張量(Tensor),涵蓋關鍵實現細節和常見陷阱。示例包含數據準備、模型構建、訓練/推理模式切換及結果分析。示例場景:在 CIFAR-10 數據集上實現帶 BatchNorm 的 CNNimport…

第8章:應用層協議HTTP、SDN軟件定義網絡、組播技術、QoS

應用層協議HTTP 應用層協議概述 應用層協議非常多,我們重點熟悉以下常見協議功能即可。 Telnet:遠程登錄協議,基于TCP 23端口,用于遠程管理設備,采用明文傳輸。安全外殼協議 (SecureShell,SSH) ,基于TCP 22端口,用于…

uniapp頁面間通信

uniapp中通過eventChannel實現頁面間通信的方法,這是一種官方推薦的高效傳參方式。我來解釋下這種方式的完整實現和注意事項:?發送頁面(父頁面)?:uni.navigateTo({url: /pages/detail/detail,success: (res) > {/…

Android ViewModel機制與底層原理詳解

Android 的 ViewModel 是 Jetpack 架構組件庫的核心部分,旨在以生命周期感知的方式存儲和管理與 UI 相關的數據。它的核心目標是解決兩大痛點: 數據持久化: 在配置變更(如屏幕旋轉、語言切換、多窗口模式切換)時保留數…

雙倍硬件=雙倍性能?TDengine線性擴展能力深度實測驗證!

軟件擴展能力是軟件架構設計中的一個關鍵要素,具有良好擴展能力的軟件能夠充分利用新增的硬件資源。當軟件性能與硬件增加保持同步比例增長時,我們稱這種現象為軟件具有線性擴展能力。要實現這種線性擴展并不簡單,它要求軟件架構精心設計&…

頻繁迭代下完成iOS App應用上架App Store:一次快速交付項目的完整回顧

在一次面向商戶的會員系統App開發中,客戶要求每周至少更新一次版本,涉及功能迭代、UI微調和部分支付方案的更新。團隊使用Flutter進行跨平臺開發,但大部分成員日常都在Windows或Linux環境,只有一臺云Mac用于打包。如何在高頻率發布…

springsecurity03--異常攔截處理(認證異常、權限異常)

目錄 Spingsecurity異常攔截處理 認證異常攔截 權限異常攔截 注冊異常攔截器 設置跨域訪問 Spingsecurity異常攔截處理 認證異常攔截 /*自定義認證異常處理器類*/ Component public class MyAuthenticationExceptionHandler implements AuthenticationEntryPoint {Overr…

企業如何制作網站?網站制作的步驟與流程?

以下是2025年網站制作的綜合指南,涵蓋核心概念、主流技術及實施流程: 一、定義與范疇 網站制作是通過頁面結構設計、程序設計、數據庫開發等技術,將視覺設計轉化為可交互網頁的過程,包含前端展示與后臺功能實現。其核心目標是為企…

Rust+Blender:打造高性能游戲引擎

基于Rust和Blender的游戲引擎 以下是基于Rust和Blender的游戲引擎開發實例,涵蓋不同應用場景和技術方向的實際案例。案例分為工具鏈整合、渲染技術、物理模擬等類別,每個案例附核心代碼片段或實現邏輯。 工具鏈整合案例 案例1:Blender模型導出到Bevy引擎 使用blender-bev…