Android-ServiceManager

来源:https://www.cnblogs.com/linhaostudy/archive/2020/02/03/12254948.html
-Advertisement-
Play Games

ServiceManager在init進程啟動之後啟動,用來管理系統中的service,那麼首先理解一下在init進程啟動之後啟動這句話類: 一般開機過程分為三個階段: 1. OS級別,由bootloader載入linux內核後,內核開始初始化,並載入built in的驅動程式,內核完成開機後,載入 ...


ServiceManager在init進程啟動之後啟動,用來管理系統中的service,那麼首先理解一下在init進程啟動之後啟動這句話類:

一般開機過程分為三個階段:

  1. OS級別,由bootloader載入linux內核後,內核開始初始化,並載入built-in的驅動程式,內核完成開機後,載入init process,切換至user-space後,結束內核的循序過程,進入排成模式。
  2. Android-level,由init process開始,讀取init.rc,Mative服務啟動,並啟動重要的外部程式,例如servicemanager、zygote以及system service。
  3. Zygote-Mode,Zygote啟動完System Service後,進入Zygote Mode,在Socket等候命令,隨後,使用者將看到一個桌面環境,桌面環境由一個名為Launcher的應用程式負責提供。

image

在ServiceManager中有兩個比較重要的方法:add_service和check_service,系統的service需要通過add_service把自己的信息註冊到servicemanager中,當需要使用時,通過check_service檢查該service是否存在。看它的main函數的源碼:

image

三件事:

  1. 打開Binder設備,併在記憶體中映射128k的空間

首先看一下struct binder_state這個結構體

struct binder_state{
    int fd;            //文件描述符,打開/dev/binder設備
    void* mapped;    //把設備文件/dev/binder映射到進程空間的起始地址
    unsigned mapsize;  //映射記憶體空間的大小
} 
  1. 告訴Binder驅動程式,自己是Binder上下文管理者

  2. 進入迴圈,不停去讀Binder設備,看是否有對service的請求,如果有的話就去調用svcmgr_handller函數回調處理請求。

下麵就來看一下servicemanager是怎麼迴圈等待客戶端的請求,併進行註冊服務、服務獲取這一系列活動的。

等待客戶端請求

ServiceManager進程通過binder_loop方法進入迴圈等待客戶端的請求中,當有客戶端請求時,進程ServiceManager被喚醒並調用svcmgr_handler來處理客戶端的請求。

image

  1. ServiceManager進程在進入迴圈前,調用binder_write()方法,通過ioctl系統調用設置Binder線程的運行狀態為BINDER_LOOPER_STATE_ENTERED,看下binder_write()方法的源碼:

image

首先設置binder_write_read結構體變數的值,然後通過ioctl傳遞到Binder驅動程式中,此時控制命令為BINDER_WRITE_READ,binder_ioctl函數中對BINDER_WRITE_READ命令的處理過程為:

image

在binder_thread_write方法中,對BC_ENTER_LOOPER Binder協議的處理如下:

image

此處僅僅設置了binder_thread結構體變數中的線程運行狀態looper為BINDER_LOOPER_STATE_ENTERED,表示當前的binder線程進入迴圈狀態。

2. 睡眠等待客戶端請求

在沒有客戶端請求時,當前進程就進入休眠狀態,等待請求到來再喚醒。

總結一哈?

ServiceManager進程的啟動首先打開binder驅動並開闢內核緩存區,同時將緩存區的物理頁面同時映射到內核虛擬地址空間及進程虛擬地址空間中,然後在內核中創建屬於servicemanager進程的binder_node實體節點,接著設置處理客戶端請求的binder線程運行狀態,由於此時沒有客戶端的請求,servicemanager進程進入睡眠等待中,直到客戶端請求的到來時,喚醒servicemanager進程,再繼續往下執行。

服務註冊

直接來看,當有service請求時,調用的回到函數svcmgr_handler函數。
image

如果請求註冊,就執行紅色框中的代碼,我們再來看一下具體實現do_add_service()方法是怎麼實現的:

image

image

看代碼中的三個紅框,首先會檢查是否有許可權註冊service,如果沒有許可權就直接返回不能註冊;然後去檢查該service是否已經註冊過了,如果已經註冊過,那就不能再註冊;再判斷記憶體是否夠用。如果都沒有問題,就會註冊該service,加入到svcList中來,(在servicemanager中維護service信息的地方就是svcList,裡面存了service的name和handler)。通過以上幾步,service就算註冊成功了。

服務獲取

如果是服務獲取,就會執行代碼中的黃色框,並將返回的數據寫入reply,返回給客戶端,do_find_service函數中主要執行service的查找,看源碼:

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此篇文章為博主在Linux學習過程中的一些記錄,記錄在此方便查閱。 常用命令總結 + ls 顯示目錄內容 (list directory contents) + 不顯示隱藏的文件和子目錄 + 顯示目錄中所有的文件和子目錄(包括隱藏文件) + 顯示目錄中文件和子目錄的詳細信息(包括許可權、大小、創建/修 ...
  • RocksDB介紹RocksDB簡介RocksDB是基於C++語言編寫的嵌入式KV存儲引擎,它不是一個分散式的DB,而是一個高效、高性能、單點的資料庫引擎。它是由Facebook基於Google開源的kv存儲LevelDB開發開發。RocksDB使用LSM存儲引擎。它針對不同的生產環境進行調優,可以 ...
  • 關於點陣圖,可能大家不太熟悉, 那麼點陣圖能幹啥呢?點陣圖的內容其實就是普通的字元串,也就是byte數組,我們都知道 byte 8 位無符號整數 0 到 255 說個場景。比如你處理一些業務時候,往往會存在 是或者不是 這樣的數據,那麼這種數據還是頻繁去查看和請求,從數據方面和請求次數方面都是非常的大的。 ...
  • Mysql5.6安裝 下載好安裝包後,在bin目錄下用cmd打開,輸入mysqld install 【服務名】新建個服務 在windows+r輸入services.msc即可查看服務 怎樣使用mysql 在本地電腦上安裝好mysql伺服器後,使用命令開啟mysql服務,命令為net start my ...
  • 近來學習scrap分散式,需要用到redis,但以前沒接觸過,所以記錄一下自己的安裝過程。 準備:Mac,redis-5.0.4.tar.gz 1.壓縮包到官網下(建議下載穩定版)網址:redis.io 2.我把壓縮包放在了/usr/local/下麵。 3.打開終端,找到壓縮包,在當前目錄下輸入:t ...
  • 【問題描述】 Queries_per_sec (QPS)是資料庫兩個比較重要的性能計數器指標。我們經常要求開發告知這個參數,以評估資料庫的一個負載情況。下麵的這段代碼連上伺服器,做一個簡單的查詢: using (MySqlConnection conn = new MySqlConnection() ...
  • 一、Druid是什麼 Druid 單詞來源於西方古羅馬的神話人物,中文常常翻譯成德魯伊。 玩過魔獸世界,暗黑破壞神,Dota,爐石傳說,Dota自走棋的朋友,對這個詞一定不陌生。 本文中所介紹的Druid是一個分散式的支持實時分析的數據存儲系統。通俗一點:高性能實時分析資料庫。它由美國廣告技術公司M ...
  • iOS 7給蘋果設備帶來了全新的用戶界面(UI)。iOS 7在UI上的變化是自其誕生以來最大的。iOS 7專註於三個重要的特點:清晰、依從和層次。理解這三個特點很重要,因為這有助於設計跟原生的系統內置應用一樣的應用。 本章將介紹iOS 7引入的一些重要變化以及如何讓應用使用這些新特性。前半章展示開發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...