1. 程式人生 > >[日更-2019.5.24、25、26] Android系統中的Binder通訊機制分析(一)--servicemanager

[日更-2019.5.24、25、26] Android系統中的Binder通訊機制分析(一)--servicemanager

宣告

  • 其實對於Android系統Binder通訊的機制早就有分析的想法,記得去年6、7月份Mr.Deng離職期間約定一起對其進行研究的,但因為我個人問題沒能實施這個計劃,留下些許遺憾...
  • 最近,剛好在做公司某專案中一個難題就是關於Binder的,於是想借此機會對其進行儘量深入的分析,以算是彌補過去的遺憾吧。而且,一年後我對於Android系統的理解,比去年確實加深了很多;
  • 文中參考了很多前輩們寫的書籍及部落格內容,可能涉及的比較多先不具體列出來了,等有時間再新增進來;
  • 本文使用的程式碼是LineageOS的cm-14.1,對應Android 7.1.2,可以參考我的另一篇部落格:[如何下載Nexus5的LineageOS14.1(cm-14.1)系統原始碼並編譯、刷機](
    https://my.oschina.net/XiaoMaPedro/blog/3028748
    "如何下載Nexus5的LineageOS14.1(cm-14.1)系統原始碼並編譯、刷機");

0 寫在前面的

    其實,Android系統的基礎是Linux,它本可以使用Linux體系下的IPC機制,為什麼還要再實現一個Binder機制呢?答案肯定是Linux現有的IPC機制沒有一個能夠滿足Android系統的需求的,相對於其他IPC機制Binder:

  • Binder更加靈活並節省記憶體;
  • Binder還解決和避免了傳統的程序間通訊可能會增加程序開銷的問題,也避免了程序過載和安全漏洞等方面的風險;

    這個表達有點蒼白,不過沒關係,後面會越來越體會到Binder機制的intelligence,Binder主要實現下面的功能:

  1. 用驅動程式來推動程序間通訊;
  2. 通過共享記憶體來提高效能;
  3. 為程序請求分配每個程序的執行緒池;
  4. 針對系統中的物件引入了引用計數和跨程序的物件引用對映;
  5. 程序間同步呼叫;

    這幾條聽起來有點太學術了。要明白的是Binder這個機制根本上還是為執行在ART基礎上的系統服務提供支撐的。因為APP不同程序間需要通訊、而且它們需要使用框架層的各種服務框架的Java介面(框架層的系統服務框架大多數執行在同一個程序system_server的上下文環境中,並且可以在servicemanager輔助下被查詢到)。

    system_server是以--start-system-server引數從Zygote中fork()出來的,而servicemanager則是Android系統的core類守護程序之一。它們兩個共同提供了對整個Android框架服務架構的支援和上下文環境。

servicemanager

    可以先看一下我的Nexus 5 cm-14.1系統中的servicemanager.rc檔案,它所在的原始碼目錄為:~/LineageOS/frameworks/native/cmds/servicemanager/servicemanager.rc

service servicemanager /system/bin/servicemanager
    class core
    user system
    group system readproc
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart audioserver
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart inputflinger
    onrestart restart drm
    onrestart restart cameraserver
    writepid /dev/cpuset/system-background/tasks

    從這個rc檔案中就可以看出來,首先它處於core類服務中,很多關鍵服務都依賴於它的存在,比如healthd、zygote、audioserver、media、surfaceflinger、inputflinger、drm、cameraserver這些service在servicemanager重啟時全部都要跟著進行重啟,就可以看出servicemanager有多重要。而且,servicemanager服務用關鍵字critical修飾,意思是如果這個服務反覆重啟5次系統就會自動進入recovery模式。

    servicemanager是作為其他作業系統服務的定位器(locator)或稱索引目錄(directory)而存在的。任何一個應用或系統元件想要使用其他服務時,都必須先到servicemanager查詢,獲得一個控制代碼(handle),然後才能繼續執行操作。服務也沒法直接告訴客戶端自己在什麼位置,它也必須先到servicemanager註冊,然後才能被需要使用它的客戶端找到。所以如果servicemanager重啟了的話,所有依賴於它的服務都必須重啟,所有的服務都必須要重新再註冊一遍。如果servicemanager掛了的話,程序間通訊也將被中斷。

    使用者模式的服務是通過一個字元裝置節點/dev/binder(這個裝置節點可以被所有的程序讀取和訪問)來訪問binder進行程序間通訊的。同一時刻,只有一個使用者態程序可以使用Binder中的context manager,context manager是系統中所有其他程序(無論它是客戶端程序還是服務端程序)的匯接點。服務必須把自己的服務名以及介面註冊在context manager中,客戶端必須通過在context manager中進行檢索,才能找到它們要使用的服務。

    servicemanager也只是一個很小的elf檔案,所完成的操作也很簡單:它首先呼叫binder_open獲取/dev/binder的檔案描述符,然後再呼叫binder_become_context_manager註冊ServiceManager服務,該服務的handle索引值為0。再接下來,servicemanager就會進入一個名為binder_loop的無限迴圈中。在這個無限迴圈裡,servicemanager會讓自己進入阻塞狀態,直到/dev/binder中產生一個transaction(即某個客戶端發來了請求),隨後程序就會被喚醒,並呼叫它的svcmgr_handler回撥函式處理這個transaction。

    servicemanager必須是全域性可訪問的。這樣,各種服務才能上它這兒來註冊,客戶端也才能來查詢服務。在使用C/C++程式碼時,服務和客戶端同樣可以呼叫defaultServiceManager()獲得一個訪問servicemanager的控制代碼(從技術上說,這只是它的介面,是個sp< IServiceManager >型別的物件),這個定義在IServiceManager.h中的介面,匯出了幾個transaction請求碼。下表列出了這些請求碼及實現這些請求碼的可供C/C++程式碼呼叫的API。值得注意的是,在這張表中並沒有用來刪除服務的API,這是因為在對應的程序死掉之後,服務會被自動刪除。因為Binder能夠檢測到這種情況,並在檢查到這種情況時,向servicemanager傳送一個BR_DEAD_BINDERC程序死亡通知)。

        

    addService被認為是個非常敏感的功能,只有UID為0或1000(AID_SYSTEM)的服務才能自由地註冊服務,其他的系統服務則會受到限制。受限制的服務在Android 5之後被寫在了SELinux的/service_contexts檔案中,這使得系統能以極為靈活的方式對服務進行控制,system_server.c這個原始碼檔案己經被簡化成對check_mac_perms()函式的一次呼叫,這個函式然後又會去呼叫selinux_check_access()函式。用這一方式,可以對所有服務的註冊和查詢強制進行安全檢查,同時,這也使得裝置的製造商可以在不需要重新編譯任何原始碼的前提下新增它們自己的服務。

    開啟原始碼目錄:~/LineageOS/system/sepolicy/service_contexts

accessibility                             u:object_r:accessibility_service:s0
account                                   u:object_r:account_service:s0
activity                                  u:object_r:activity_service:s0
alarm                                     u:object_r:alarm_service:s0
android.os.UpdateEngineService            u:object_r:update_engine_service:s0
android.security.keystore                 u:object_r:keystore_service:s0
android.service.gatekeeper.IGateKeeperService    u:object_r:gatekeeper_service:s0
appops                                    u:object_r:appops_service:s0
appwidget                                 u:object_r:appwidget_service:s0
assetatlas                                u:object_r:assetatlas_service:s0
audio                                     u:object_r:audio_service:s0
backup                                    u:object_r:backup_service:s0
batteryproperties                         u:object_r:batteryproperties_service:s0
batterystats                              u:object_r:batterystats_service:s0
battery                                   u:object_r:battery_service:s0
bluetooth_manager                         u:object_r:bluetooth_manager_service:s0
bluetooth                                 u:object_r:bluetooth_service:s0
carrier_config                            u:object_r:radio_service:s0
clipboard                                 u:object_r:clipboard_service:s0
com.android.net.IProxyService             u:object_r:IProxyService_service:s0
commontime_management                     u:object_r:commontime_management_service:s0
common_time.clock                         u:object_r:mediaserver_service:s0
common_time.config                        u:object_r:mediaserver_service:s0
connectivity                              u:object_r:connectivity_service:s0
connmetrics                               u:object_r:connmetrics_service:s0
consumer_ir                               u:object_r:consumer_ir_service:s0
content                                   u:object_r:content_service:s0
contexthub_service                        u:object_r:contexthub_service:s0
country_detector                          u:object_r:country_detector_service:s0
cpuinfo                                   u:object_r:cpuinfo_service:s0
dbinfo                                    u:object_r:dbinfo_service:s0
device_policy                             u:object_r:device_policy_service:s0
deviceidle                                u:object_r:deviceidle_service:s0
devicestoragemonitor                      u:object_r:devicestoragemonitor_service:s0
diskstats                                 u:object_r:diskstats_service:s0
display.qservice                          u:object_r:surfaceflinger_service:s0
display                                   u:object_r:display_service:s0
netd_listener                             u:object_r:netd_listener_service:s0
DockObserver                              u:object_r:DockObserver_service:s0
dreams                                    u:object_r:dreams_service:s0
drm.drmManager                            u:object_r:drmserver_service:s0
dropbox                                   u:object_r:dropbox_service:s0
ethernet                                  u:object_r:ethernet_service:s0
fingerprint                               u:object_r:fingerprint_service:s0
android.hardware.fingerprint.IFingerprintDaemon u:object_r:fingerprintd_service:s0
gfxinfo                                   u:object_r:gfxinfo_service:s0
graphicsstats                             u:object_r:graphicsstats_service:s0
gpu                                       u:object_r:gpu_service:s0
hardware                                  u:object_r:hardware_service:s0
hardware_properties                       u:object_r:hardware_properties_service:s0
hdmi_control                              u:object_r:hdmi_control_service:s0
inputflinger                              u:object_r:inputflinger_service:s0
input_method                              u:object_r:input_method_service:s0
input                                     u:object_r:input_service:s0
iphonesubinfo_msim                        u:object_r:radio_service:s0
iphonesubinfo2                            u:object_r:radio_service:s0
iphonesubinfo                             u:object_r:radio_service:s0
ims                                       u:object_r:radio_service:s0
imms                                      u:object_r:imms_service:s0
isms_msim                                 u:object_r:radio_service:s0
isms2                                     u:object_r:radio_service:s0
isms                                      u:object_r:radio_service:s0
isub                                      u:object_r:radio_service:s0
jobscheduler                              u:object_r:jobscheduler_service:s0
launcherapps                              u:object_r:launcherapps_service:s0
location                                  u:object_r:location_service:s0
lock_settings                             u:object_r:lock_settings_service:s0
media.audio_flinger                       u:object_r:audioserver_service:s0
media.audio_policy                        u:object_r:audioserver_service:s0
media.camera                              u:object_r:cameraserver_service:s0
media.camera.proxy                        u:object_r:cameraproxy_service:s0
media.log                                 u:object_r:audioserver_service:s0
media.player                              u:object_r:mediaserver_service:s0
media.extractor                           u:object_r:mediaextractor_service:s0
media.codec                               u:object_r:mediacodec_service:s0
media.resource_manager                    u:object_r:mediaserver_service:s0
media.radio                               u:object_r:audioserver_service:s0
media.sound_trigger_hw                    u:object_r:audioserver_service:s0
media.drm                                 u:object_r:mediadrmserver_service:s0
media_projection                          u:object_r:media_projection_service:s0
media_resource_monitor                    u:object_r:media_session_service:s0
media_router                              u:object_r:media_router_service:s0
media_session                             u:object_r:media_session_service:s0
meminfo                                   u:object_r:meminfo_service:s0
midi                                      u:object_r:midi_service:s0
mount                                     u:object_r:mount_service:s0
netd                                      u:object_r:netd_service:s0
netpolicy                                 u:object_r:netpolicy_service:s0
netstats                                  u:object_r:netstats_service:s0
network_management                        u:object_r:network_management_service:s0
network_score                             u:object_r:network_score_service:s0
network_time_update_service               u:object_r:network_time_update_service:s0
nfc                                       u:object_r:nfc_service:s0
notification                              u:object_r:notification_service:s0
otadexopt                                 u:object_r:otadexopt_service:s0
package                                   u:object_r:package_service:s0
permission                                u:object_r:permission_service:s0
persistent_data_block                     u:object_r:persistent_data_block_service:s0
phone_msim                                u:object_r:radio_service:s0
phone1                                    u:object_r:radio_service:s0
phone2                                    u:object_r:radio_service:s0
phone                                     u:object_r:radio_service:s0
pinner                                    u:object_r:pinner_service:s0
power                                     u:object_r:power_service:s0
print                                     u:object_r:print_service:s0
processinfo                               u:object_r:processinfo_service:s0
procstats                                 u:object_r:procstats_service:s0
radio.phonesubinfo                        u:object_r:radio_service:s0
radio.phone                               u:object_r:radio_service:s0
radio.sms                                 u:object_r:radio_service:s0
recovery                                  u:object_r:recovery_service:s0
restrictions                              u:object_r:restrictions_service:s0
rttmanager                                u:object_r:rttmanager_service:s0
samplingprofiler                          u:object_r:samplingprofiler_service:s0
scheduling_policy                         u:object_r:scheduling_policy_service:s0
search                                    u:object_r:search_service:s0
sensorservice                             u:object_r:sensorservice_service:s0
serial                                    u:object_r:serial_service:s0
servicediscovery                          u:object_r:servicediscovery_service:s0
shortcut                                  u:object_r:shortcut_service:s0
simphonebook_msim                         u:object_r:radio_service:s0
simphonebook2                             u:object_r:radio_service:s0
simphonebook                              u:object_r:radio_service:s0
sip                                       u:object_r:radio_service:s0
soundtrigger                              u:object_r:voiceinteraction_service:s0
statusbar                                 u:object_r:statusbar_service:s0
SurfaceFlinger                            u:object_r:surfaceflinger_service:s0
task                                      u:object_r:task_service:s0
telecom                                   u:object_r:telecom_service:s0
telephony.registry                        u:object_r:registry_service:s0
textservices                              u:object_r:textservices_service:s0
trust                                     u:object_r:trust_service:s0
tv_input                                  u:object_r:tv_input_service:s0
uimode                                    u:object_r:uimode_service:s0
updatelock                                u:object_r:updatelock_service:s0
usagestats                                u:object_r:usagestats_service:s0
usb                                       u:object_r:usb_service:s0
user                                      u:object_r:user_service:s0
vibrator                                  u:object_r:vibrator_service:s0
voiceinteraction                          u:object_r:voiceinteraction_service:s0
vrmanager                                 u:object_r:vr_manager_service:s0
wallpaper                                 u:object_r:wallpaper_service:s0
webviewupdate                             u:object_r:webviewupdate_service:s0
wifip2p                                   u:object_r:wifip2p_service:s0
wifiscanner                               u:object_r:wifiscanner_service:s0
wifi                                      u:object_r:wifi_service:s0
window                                    u:object_r:window_service:s0
*                                         u:object_r:default_android_service:s0

    程式設計時使用的API己經打包在框架類android.os.ServiceManagerNative 中了,這個類又由android.os.ServiceManager 做了進一步的封裝。Android也不鼓勵App直接使用這個類,而是希望開發者呼叫Context.getSystemService()方法來查詢系統服務,並通過intent 使用第三方服務。不過無論是使用哪種方式,與服務進行通訊(不論它是個系統服務還是第三方服務)都是通過binder訊息來完成的。

          

相關推薦

[-2019.5.242526] Android系統Binder通訊機制分析--servicemanager

宣告 其實對於Android系統Binder通訊的機制早就有分析的想法,記得去年6、7月份Mr.Deng離職期間約定一起對其進行

[-2019.5.89] Android 系統的安全性分析(二)--Dalvik/ART層面上的安全措施

宣告 最近工作上涉及到對Android系統安全性的改造,在改造之前先分析整理下目前Android系統自身的安全性; 參考了一些文

[-2019.5.101112] Android 系統的安全性分析(三)--Linux層面上的安全措施

宣告 最近工作上涉及到對Android系統安全性的改造,在改造之前先分析整理下目前Android系統自身的安全性; 參考了一些文

[-2019.5.1516] Android 系統的安全性分析(四)--儲存安全措施

宣告 最近工作上涉及到對Android系統安全性的改造,在改造之前先分析整理下目前Android系統自身的安全性; 參考了一些文

[-2019.5.2223] Android 系統的分割槽和檔案系統--Android 檔案系統的檔案

宣告 Android系統中有很多分割槽,每個分割槽內的檔案系統一般都不同的,使用ADB進入系統/目錄下可發現掛載這很多的目錄,不

[-2019.5.5] 搭建SS伺服器

1 前提 在vultr註冊站好,建立伺服器。 2 安裝shadowsocks Debian/Ubuntu apt-get in

[-2019.5.18] Android 系統內的守護程序--core類的服務 : adbd

宣告 其實很好奇Android系統中的一些關鍵守護程序服務的作用; 暫且大概分析下它們的作用,這樣有助於理解整個系統的工作過程;

[-2019.5.20] Android 系統內的守護程序--core類的服務 : lmkd

宣告 其實很好奇Android系統中的一些關鍵守護程序服務的作用; 暫且大概分析下它們的作用,這樣有助於理解整個系統的工作過程;

[-2019.5.21] Android 系統的分割槽和檔案系統--Android分割槽的大概框架

宣告 其實我在剛開始接觸Android時給手機刷機,很好奇Android的刷機包裡面怎麼這麼多img檔案?而且每個img要刷入對

【C語言實現串列埠通訊知識點整理】執行緒開啟串列埠設定波特率設定校驗位互斥鎖等實現基本的通訊

  部分程式碼借鑑地址:https://blog.csdn.net/wangqingchuan92/article/details/73497354/ 謝謝! 1.建立執行緒線上程內進行串列埠之間的收發 void CREAT_pthread(void) { pthr

[Xcode10 實際操作]博主領進門-(9)Xcode左側介面介紹

本文將演示Xcode的左側操作介面。 專案的目錄結構: 應用代理檔案【AppDelegate.swift】 應用代理檔案時系統執行本應用的委託,裡面定義瞭如程式的進入與退出、裝置方向旋轉等眾多全域性方法。 檢視控制器【ViewController.swift】 檢視控制器可以建立和管理檢視,也可以監

Vue框架專案實戰整理:3Vue專案執行流程分析

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!! 上兩篇講了Vue框架專案實戰整理:1、快速啟動Vue、開發工具介紹 和 Vue框架專案實戰整理:2、Vue環境搭建,今天應該到Vue專案執行流程分析的時候了,為什麼會有這方便的研究

十九HTML5單頁框架View.js介紹 - 檢視跳轉

檢視跳轉,是指使用者看到的介面切換為另一個介面的過程,亦即活動檢視轉移的過程。(同一時刻,只有一個檢視處於活動狀態。) 檢視跳轉時,View.js將自動調整位址列中的hash部分,使其始終反映出當前的活動檢視ID。如: http://wzhsoft.com/index.htm

【opencv機器學習】opencv的SVM影象分類

一、影象分類概述 本模組是用在影象內容識別的部分,影象分類是利用計算機對影象進行定量分析,把影象中的每個像元或區域劃歸為若干個類別中的一種,以代替人工視覺判讀的技術。從目視角度來說,對影象進行提高對比度、增加視覺維數、進行空間濾波或變換等處理的目的就是使人們能夠憑藉知識

Executor執行框架原始碼分析——executorthreadFactoryThreadPoolExecutor Future元件的關係及作用

       executor執行框架是JDK1.5新增的,用於專注於任務執行的框架。其最大的特點就是將任務的建立和任務的執行分離,鬆耦合,已達到最大限度的利用計算機資源(執行緒和記憶體等)。在併發程式設計中,executor是一個必備的工具。     在分析原始碼之前,首先

Spring原始碼分析——AOPDIIOC和IOC容器原理

面向切面程式設計(Aspect Oriented Programming):面向切面程式設計也可以稱為面向規則程式設計,其目的是為了將多個類中具有一定規律性的程式碼在開發時將其按一定規則拆分後各自獨立編

抓包工具Fiddler下載 安裝及對谷歌瀏覽器進行抓包使用

一、Fiddler的安裝和配置 開啟工具Fiddler,在Tools選項裡面點選options 配置完後,重啟Fiddler 二、谷歌瀏覽器外掛SwitchyOmega的安裝使用 三、使用Fiddler對谷歌瀏覽器進行抓包

android6.0 adbd深入分析adb驅動初始化讀取adb節點執行緒

adbd之前看過一次,覺得程式碼太複雜然後,又是adb client  adb server adbd交織在一起感覺看起來太累,最近專案需要把它大致看完了,梳理下,感覺從adbd能學到很多東西,在此總結下,adbd的程式碼。 我只分析我看懂了,不可能面面俱到。而且主要注重在

使用Newtonsoft.Json.dll(JSON.NET)動態解析JSON.net 的json的序列化與反序列化

在開發中,我非常喜歡動態語言和匿名物件帶來的方便,JSON.NET具有動態序列化和反序列化任意JSON內容的能力,不必將它對映到具體的強型別物件,它可以處理不確定的型別(集合、字典、動態物件和匿名物件),在這篇文章中我將通過JToken、JObject和JArray來動態解析

zigbee 之ZStack-2.5.1a原始碼分析

先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務