【Android基礎回顧】四:ServiceManager

Android 中的 ServerManager 是 Android 框架中一個用于管理系統服務的核心機制。它是 Binder IPC 的一部分,用于在客戶端和服務端之間建立聯系,廣泛應用于系統服務(如 ActivityManager、WindowManager 等)的注冊與獲取。

1 ServiceManager職責是什么?有什么用?

ServiceManager 是 Android 系統中一個特殊的 Binder 服務,其職責主要是:
服務注冊(addService)
服務查找(getService、checkService)
服務列舉(listServices)

它是所有系統服務的“目錄服務”,作用類似一個全局的“服務注冊表”。
在這里插入圖片描述

2 ServiceManager的關鍵模塊有哪些?

2.1 ServiceManager 本身(Native C++)

位于 frameworks/native/cmds/servicemanager/,其本質是一個 Binder 服務,負責接收請求(添加、查找服務)并處理。

int main() {sp<ServiceManager> sm = new ServiceManager();  // 實例化sm->addService(...); // 注冊服務...IPCThreadState::self()->joinThreadPool(); // 進入 Binder 循環
}

2.2 IServiceManager 接口

是客戶端與服務端交互的 Binder 接口定義,定義了如下方法:

addService(name, service)
getService(name)
checkService(name)
listServices()

2.3 defaultServiceManager()(C++)

客戶端通過該方法獲取 ServiceManager 的代理對象。

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("activity"));

2.4 Java 層封裝

Java 層通過 android.os.ServiceManager 訪問 native 的 ServiceManager:

IBinder binder = ServiceManager.getService("activity");

內部通過 JNI 調用 native 層 BinderInternal.getContextObject() 獲得 binder 代理。

3 注冊與獲取服務流程

3.1 注冊服務(addService)

系統服務啟動時調用 ServiceManager.addService(name, binder)

binder 驅動將請求轉發給 native 的 ServiceManager

ServiceManager 保存服務到本地表中(map)

3.2 獲取服務(getService)

客戶端調用 ServiceManager.getService(name)

binder 驅動將請求傳給 native ServiceManager

查找到對應 binder 實例返回。

Q&A

怎么理解“ServiceManager 是 Android 系統中一個特殊的 Binder 服務”?

這里面有兩個關鍵詞。
一是binder服務,Binder 是 Android 的核心 IPC(進程間通信)機制。在 Binder 架構中,“服務” 是一個實現了 Binder 接口的對象(IBinder),可以被其他進程遠程調用。每個服務都通過 Binder 驅動注冊到內核,并能被其他進程通過 Binder 通信訪問。
二是“特殊”,特殊性在哪?ServiceManager 就是一個這樣的 Binder 服務對象,但它比一般服務更特殊。原因如下:

  1. 它是 Binder 世界的“入口”
    所有系統服務(如 ActivityManager、WindowManager 等)在啟動后都先注冊到 ServiceManager 中。
    客戶端想用這些服務時,必須通過 ServiceManager 查詢到對應的 Binder 接口。👉 它充當了一個“Binder 服務注冊與發現中心”(相當于服務注冊表)。
  2. 由系統早期啟動并駐留內存。它在 init 進程階段由 native 層以獨立可執行程序的形式(servicemanager)啟動。啟動時會進入一個 Binder 循環線程池,不斷處理其他進程通過 Binder 發來的服務注冊/查詢請求。
  3. 權限控制 & 本地注冊表,僅系統進程才能注冊服務,防止惡意進程篡改系統服務。ServiceManager 會維護一個本地服務表(map),鍵是服務名,值是對應的 IBinder 實現。

普通的client進程和service進程想要通過AIDL通訊,需要注冊到ServiceManager嗎?

這里有兩種場景,先說第一種,系統服務場景(系統進程 + 普通 app)。

比如我們想通過 AIDL 訪問 ActivityManager、WindowManager,這些系統服務會在系統啟動時通過 ServiceManager.addService() 注冊自己。
普通 App 調用 ServiceManager.getService(“activity”),獲得其 Binder 接口。
系統服務在系統啟動的時候會注冊到 ServiceManager,這是它們能被系統和 app 找到的前提。

第二種場景,自定義服務場景(普通 App 進程 + 普通 App 進程)。

我們自己寫一個 AIDL 服務并運行在一個 Service 中,想讓其他 App 調用它:這種情況不需要也無法使用ServiceManager注冊我們自己的服務,因為ServiceManager 是系統服務,不對第三方應用開放 addService() 權限。通常用 綁定服務(bindService) 的方式建立連接。

流程是這樣的,服務端在 AndroidManifest.xml 中聲明一個 Service,并實現 AIDL 接口。
客戶端通過 Intent(帶包名和 Service 類名)調用 bindService()。系統通過 AMS(ActivityManagerService)管理服務綁定,并將 Binder 對象通過回調傳給客戶端(onServiceConnected())。

所以這種場景下,不是通過 ServiceManager 查找,而是通過 AMS 的服務綁定機制傳遞 Binder 對象。

持續更新。。。

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

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

相關文章

【Android基礎回顧】一:Binder機制是什么?有什么用?

Android中的Binder機制是Android系統中最核心和最基礎的進程間通訊機制。 1 什么是進程間通訊機制(IPC)&#xff1f; 眾所周知&#xff0c;Android系統基于Linux開發&#xff0c;Linux系統里面本來就有進程間通訊機制。 1.1 Linux的IPC(Inter-Process Communication)概覽 它…

Go語言爬蟲系列教程5:HTML解析技術以及第三方庫選擇

Go語言爬蟲系列教程5&#xff1a;HTML解析技術以及第三方庫選擇 在上一章中&#xff0c;我們使用正則表達式提取網頁內容&#xff0c;但這種方法有局限性。對于復雜的HTML結構&#xff0c;我們需要使用專門的HTML解析庫。在這一章中&#xff0c;我們將介紹HTML解析技術以及如何…

AtCoder 第408?場初級競賽 A~E題解

A Timeout 【題目鏈接】 原題鏈接:A - Timeout 【考點】 模擬 【題目大意】 長老會在 s 秒后睡去,進過 n 次叫醒,長老最后能否是保持清醒。 【解析】 模擬每一次拍擊叫醒的過程,查看本次時間距上次時間是否大于 s。注意:第一次拍擊叫醒應和 0 秒相減。 【難度】 …

Unity VR/MR開發-VR設備與適用場景分析

視頻講解鏈接&#xff1a;【XR馬斯維】VR/MR設備與適用場景分析&#xff1f;【UnityVR/MR開發教程--入門】_游戲熱門視頻

MyBatis 查詢功能實現全流程

一、創建maven項目 配置好相應的jdk 二、在數據庫建立相應的表格 1.因為Mybatis實際是對sql表的一系列操作&#xff0c;所以我們新建一個數據庫 2.在查詢界面運行下面指令創建一個user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp協議概述 傳輸層協議基本概念 傳輸層協議建立在網絡層和會話層之間&#xff0c;為應用層實體提供端到端的通信功能&#xff0c;確保數據包的順序傳送及數據的完整性。它利用網絡層提供的服務&#xff0c;并通過傳輸層地址&#xff08;端口號&#xff09;提供給高層用戶…

k8s集群安裝坑點匯總

前言 由于使用最新的Rocky9.5,導致kubekey一鍵安裝用不了&#xff0c;退回Rocky8麻煩機器都建好了&#xff0c;決定手動安裝k8s&#xff0c;結果手動安裝過程中遇到各種坑&#xff0c;這里記錄下&#xff1b; k8s安裝 k8s具體安裝過程可自行搜索&#xff0c;或者deepseek; 也…

深入解析 Dotnet-Boxed.Framework:提升 .NET 開發效率的利器

在現代 .NET 開發中&#xff0c;框架和工具的選擇對項目的開發效率和長期維護至關重要。Dotnet-Boxed.Framework 是一個開源框架&#xff0c;旨在簡化開發流程&#xff0c;提高生產力。它通過一組實用的工具和自動化功能&#xff0c;幫助開發者快速構建高質量的應用程序。本文將…

如何輕松地將文件從 PC 傳輸到 iPhone?

傳統上&#xff0c;您可以使用 iTunes 將文件從 PC 傳輸到 iPhone&#xff0c;但現在&#xff0c;使用 iTunes 已不再是唯一的選擇。現在有多種不同且有效的方法可以幫助您傳輸文件。在今天的指南中&#xff0c;您可以找到 8 種使用或不使用 iTunes 傳輸文件的方法&#xff0c;…

Kafka深度解析與原理剖析

文章目錄 一、Kafka核心架構原理1. **分布式協調與選舉**2. **ISR、OSR與HW機制**3. **高性能存儲設計**4. **刷盤機制 (Flush)**5. **消息壓縮算法**二、高可用與消息可靠性保障1. **數據高可用策略**2. **消息丟失場景與規避**3. **順序消費保證**三、Kafka高頻面試題精析1. …

【教學類】20250605立體紙盤(3邊形-22邊形,角度5、10……40,45)

背景需求 在《自助餐》活動中&#xff0c; 【教學類-53-01】20240918自助餐餐盤-CSDN博客文章瀏覽閱讀984次&#xff0c;點贊29次&#xff0c;收藏11次。【教學類-53-01】20240918自助餐餐盤https://blog.csdn.net/reasonsummer/article/details/142340542?spm1011.2415.300…

GC1809:高性能24bit/192kHz音頻接收芯片解析

1. 芯片概述 GC1809 是數字音頻接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等協議&#xff0c;集成8選1輸入切換、低抖動時鐘恢復和24bit DAC&#xff0c;適用于家庭影院、汽車音響等高保真場景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;動態范圍105dB&…

Next.js 中間件鑒權繞過漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一個影響 Next.js 的嚴重漏洞&#xff0c;源于開發者信任了客戶端請求中攜帶的 X-Middleware-Rewrite 頭部字段。攻擊者可以手動構造該頭部&#xff0c;實現繞過中間件邏輯&#xff0c;訪問本應受保護的資源或 API。 影響版本&#xff1a;Next.js < …

第1章 數據分析簡介

第1章 數據分析簡介 1.1 數據分析 當今世界對信息技術依賴日深,每天產生和存儲海量數據,來源于自動檢測系統、傳感器、科學儀器,以及銀行取錢、買東西、寫博客、發微博等日常行為。 數據與信息在形式上不同:數據是無形式可言的字節流,難理解其本質;信息是對數據集處理后…

邊緣計算網關賦能沸石轉輪運行故障智能診斷的配置實例

一、項目背景 在環保行業&#xff0c;隨著國家對大氣污染治理要求的不斷提高&#xff0c;VOCs廢氣處理成為了眾多企業的重要任務。沸石轉輪作為一種高效的VOCs治理設備&#xff0c;被廣泛應用于石油化工、汽車制造、印刷包裝等主流行業。這些行業生產規模大、廢氣排放量多&…

20250602在Ubuntu20.04.6下修改壓縮包的日期和時間

rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…

windows無法安裝到這個磁盤,選中的磁盤采用gpt分區儀式

解決辦法&#xff1a; 我才用的是一個網友分享的微軟官方解決辦法&#xff0c;成功了&#xff0c;但是不知道會不會i有什么影響。將所有分區刪掉&#xff0c;這時磁盤變成為分配的空間。我個人是兩塊固態&#xff0c;一塊m.2&#xff0c;一塊sata&#xff1b;所以我直接將500g…

使用Composer創建公共類庫

概述 如果多個項目中存在使用相同類庫、模塊的情況&#xff0c;此時可以考慮將類庫或者模塊單獨抽取出來&#xff0c;形成獨立類庫&#xff0c;通過composer 來進行依賴管理&#xff0c;這樣可以更方便維護&#xff0c;大大提升開發效率。 優勢 可以對特定模塊進行統一維護和…

Ubuntu中TFTP服務器安裝使用

TFTP服務器 在 Ubuntu 下使用 TFTP&#xff08;Trivial File Transfer Protocol&#xff09; 服務&#xff0c;通常用于簡單的文件傳輸&#xff08;如網絡設備固件更新、嵌入式開發等&#xff09;。 1 TFTP服務器安裝 sudo apt-get install tftp-hpa sudo apt-get install…

前端面試總結

1.請做下自我介紹 技術棧 工作經歷 2.挑一個項目詳細講一下 介紹了一個項目的業務&#xff0c;重點講了一個動態表單的實現&#xff0c;從業務、擴展性、可維護性、性能提升 3.場景題&#xff1a;問答怎么做&#xff0c;表單之間關聯&#xff0c;回答不同問題跳轉到不同的下一個…