青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks
Android核心分析
 
 

Android 核心分析 之七------Service深入分析

上一章我們分析了Android IPC架構,知道了Android服務構建的一些基本理念和原理,本章我們將深入分析Android的服務。Android體系架構中三種意義上服務:

Native服務

Android服務

Init空間的服務,主要是屬性設置,這個IPC是利用Socket來完成的,這個我將在另外一章來討論。

Navite服務,實際上就是指完全在C++空間完成的服務,主要是指系統一開始初始化,通過Init.rc腳本起來的服務,例如Service Manger service,Zygote service,Media service , ril_demon service等。

Android服務是指在JVM空間完成的服務,雖然也要使用Navite上的框架,但是服務主體存在于Android空間。Android是二階段初始(Init2)初始化時建立的服務。

1 Service本質結構

我們還是從Service的根本意義分析入手,服務的本質就是響應客戶端請求。要提供服務,就必須建立接收請求,處理請求,應答客服端的框架。我想在Android Service設計者也會無時不刻把這個服務本質框圖掛在腦海中。從程序的角度,服務一定要存在一個閉合循環框架和請求處理框架

分析清楚服務框就必須弄清楚以下的機制及其構成。

(1)閉合循環結構放置在哪里?

(2)處理請求是如何分發和管理?

(3)處理框架是如何建立的?

(4)概念框架是如何建立的?

2 Service基本框架分析

Android設計中,Native Service和Android Service采用了同一個閉合循環框架。這個閉合循環框架放置在Native的C++空間中,,ProcessState@ProcessState.cpp 和IPCThreadState@IPCThreadState.cpp兩個類完成了全部工作。

在服務框架中,ProcessState是公用的部分,這個公用部分最主要的框架就是閉合循環框架和接收到從Binder來的請求后的處理框架。我們將服務框架用ProcessSate來表示,簡言之:

(1) addservice

(2) 建立閉合循環處理框架。

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

addService(String16("xxx0"), new xxx0Service());

addService(String16("xxx1"), new xxx1Service());

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();//閉合循環框架

}

2.1 Native Service

Native Service是在系統Init階段通過Init.rc腳本建立的服務。

首先來看看一個例子mediaserver@main_mediaserver.cpp的建立過程。

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();

LOGI("ServiceManager: %p", sm.get());

AudioFlinger::instantiate();

MediaPlayerService::instantiate();

CameraService::instantiate();

AudioPolicyService::instantiate();

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

我們將代碼向下展開了一層,更能看到事物的本質。

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();

defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

(1)服務進程建立了ProcessState對象,并將給對象登記在進程的上下文中。

(2)建立一個新AudioFlinger對象,并將對象登記Service Manager Service中。

(3)開始就收請求,處理請求,應答這個循環閉合框架。

2.2 Android Service

Androids service是系統二階段(Init2)初始化時建立的服務。

Android的所有服務循環框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環結構,只是可以看到建立了init2的實現函數,建立了一大堆服務,并AddService到service Manager。

main() @ com/android/server/SystemServer

{

init1();

}

Init1()是在Native空間實現的(com_andoird_server_systemServer.cpp)。我們一看這個函數就知道了,原來這個閉合循環處理框架在這里:

init1->system_init() @System_init.cpp

在system_init()我們看到了這個久違的循環閉合管理框架。

{

Call "com/android/server/SystemServer", "init2"

…..

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

Init2()@SystemServer.java中建立了Android中所有要用到的服務:

Entropy Service

Power Manager

Activity Manager

Telephony Registry

Package Manager

Account Manager

Content Manager

System Content Providers

Battery Service

Hardware Service

Alarm Manager

Init Watchdog

Sensor Service

Window Manager

Bluetooth Service

statusbar

Clipboard Service

Input Method Service

NetStat Service

Connectivity Service

Accessibility Manager

Notification Manager

Mount Service

Device Storage Monitor

Location Manager

Search Service

Checkin Service

Wallpaper Service

Audio Service

Headset Observer

Backup Service

AppWidget Service

3 ProcessState和IPCThreadState

從宏觀來講,PocessState及其IPCThreadState處于IPC與內核打交道包裝層。前面的章節已經提到,下面我將更詳細的分析。有關IPC的c++空間的實現都是從ProcessState這個對象完成的。

我們可以得出如下的結論:不管JVM的Binder做了多么復雜的操作,最終還是需要利用ProcessState 這個c++空間的對象把數據傳遞給Binder Driver,接收數據也是通過ProcessState這個對象完成,ProcessState是所有Binder IPC必經的通道。

ProcessState放置在全局變量gProcess中,每個進程只有一個ProcessState對象,負責打開Binder設備驅動,建立線程池等。而IPCThreadState每個線程有一個,IPCThreadState實例登記在Linux線程程的上下文附屬數據中,主要負責Binder數據讀取,寫入和請求處理框架。IPCThreadSate在構造的時候,獲取進程的ProcessSate并記錄在自己的成員變量mProcess中,通過mProcess可以獲取到Binder的句柄。

3.1 ProcessState的生命周期

既然ProcessState是Binder通訊的基礎,那么Process必須在Binder通訊之前建立。客戶端,服務端都必須建立。由于現在重點討論服務端,所以重心放置在服務端。在Android體系中有c++空間的服務,JVM空間的服務,這兩類服務在本質上相同的,只是形式上不同,由于他們都是建立在ProcessState這個基礎上,所以在形式上不同就僅僅表現在對OnTransact的回調處理的不同。

Native Service

我們直接可以看到使用sp<ProcessState> proc(ProcessState::self()),建立建立ProcessState,一旦調用ProcessState就建立了,并且這個self將ProcessSate登記在全局變量中。

Android Service

建立Android Service服務system_init @System_init.cpp中我們可以看到相同的結構。有一點不同的是所有的Android Service都運行在一個進程中:systemsever進程。

3.2 Binder Driver包裝 @IPCThreadState

ProcessSate構造的時候,使用open_binder打開/driver/binder,并將句柄記錄在mDriverFD,在ProcessState中并不使用這個句柄,真正使用這個Binder設備句柄的是IPCThreadState,所有關于Binder的操作放置在IPCThreadState中:

(1)讀取/寫入:talkWithDriver()@IPCThreadState對ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)進行包裝。

(2)請求處理:executeCommand(...)@ IPCThreadState

(3)循環結構:joinThreadPool()

joinThreadPool()

{

While(1){

talkWithDriver(...)

...

executeCommand(...)

}

}


posted on 2011-12-08 11:38 life02 閱讀(396) 評論(0)  編輯 收藏 引用 所屬分類: android組件學習
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美黄色一区| 久久久亚洲人| 亚洲大黄网站| 韩国av一区二区三区| 久久久久国产精品午夜一区| 国产精品伊人日日| 国产精品免费福利| 国产精品美腿一区在线看| 国产精品久久久久aaaa九色| 国产精品久久久久久一区二区三区| 欧美午夜精品久久久久久久 | 国产精品va在线播放我和闺蜜| 欧美成人免费全部观看天天性色| 久久综合久久久久88| 麻豆久久精品| 欧美成年人视频网站欧美| 欧美精品v国产精品v日韩精品| 欧美精品久久天天躁| 欧美日韩免费看| 国产麻豆成人精品| 最新国产成人在线观看| 中文在线一区| 久久午夜羞羞影院免费观看| 亚洲国产精品精华液网站| 亚洲国产精品va在线观看黑人| 亚洲丰满少妇videoshd| 在线亚洲电影| 久久综合九色九九| 国产精品成人观看视频国产奇米| 国产深夜精品| 中文一区二区| 欧美国产日韩视频| 小辣椒精品导航| 欧美人在线视频| 黄色精品一区| 午夜视黄欧洲亚洲| 亚洲国产欧美一区| 伊人久久婷婷| 久久精品女人| 国产精品久久国产精品99gif| 一区二区亚洲精品| 午夜精品影院| 亚洲免费黄色| 欧美国产精品久久| 亚洲第一黄色| 久久综合色天天久久综合图片| 亚洲香蕉视频| 欧美日韩国产在线播放| 伊人成人开心激情综合网| 欧美一区二区三区视频免费| 妖精视频成人观看www| 欧美jizzhd精品欧美喷水| 好看的亚洲午夜视频在线| 欧美一二三区精品| 在线一区二区日韩| 欧美精品导航| 亚洲精品九九| 亚洲激情婷婷| 午夜精品免费| 亚洲国产成人91精品| 亚洲伊人观看| 欧美日韩在线播放三区四区| 亚洲国产精品久久久久秋霞不卡| 久久精品成人| 亚欧成人在线| 国产亚洲精品bt天堂精选| 欧美影院成年免费版| 亚洲一区二区在线免费观看| 欧美丝袜一区二区三区| 亚洲一区二区三区精品在线| 在线视频欧美日韩精品| 国产精品你懂的在线欣赏| 午夜亚洲伦理| 欧美在线视频一区二区三区| 欧美日本一区| 亚洲精品在线视频观看| 亚洲精品久久久久中文字幕欢迎你 | 欧美大片免费久久精品三p| 在线日韩欧美| 91久久精品国产91久久| 欧美日韩你懂的| 欧美一级一区| 久久亚洲综合色| 在线视频免费在线观看一区二区| 国产精品99久久99久久久二8| 国产欧美日韩一区二区三区| 老司机67194精品线观看| 欧美gay视频激情| 午夜精品久久一牛影视| 久久精品国产一区二区三| 亚洲国产天堂久久国产91| 99精品99| 国内成+人亚洲| 亚洲国产精品精华液网站| 欧美性久久久| 久久精品中文字幕免费mv| 欧美福利视频在线观看| 在线日本欧美| 亚洲人人精品| 国产欧美亚洲一区| 亚洲国产精品www| 国产农村妇女毛片精品久久麻豆| 久久亚洲国产成人| 欧美日韩一区免费| 可以免费看不卡的av网站| 欧美一区国产二区| 国产在线拍揄自揄视频不卡99| 最新成人av在线| 国产精品一区二区三区四区五区| 欧美顶级大胆免费视频| 国产欧美一区二区精品忘忧草| 亚洲黄色毛片| 精品999网站| 亚洲男人的天堂在线观看| 亚洲欧洲偷拍精品| 久久精品观看| 国产精品一区免费视频| 亚洲大片在线| 国模大胆一区二区三区| 亚洲自拍偷拍网址| 亚洲午夜免费福利视频| 欧美高清在线精品一区| 牛夜精品久久久久久久99黑人| 国产精品亚洲第一区在线暖暖韩国| 亚洲国产婷婷综合在线精品| 黄色成人片子| 欧美一区二区三区视频在线观看| 亚洲欧美日韩国产另类专区| 欧美激情精品久久久六区热门| 久久免费视频在线观看| 国产欧美另类| 欧美一区二区三区成人| 欧美一级片一区| 国产精品综合色区在线观看| 在线视频欧美一区| 午夜在线精品| 国产一区二区三区观看 | 亚洲福利视频免费观看| 激情小说另类小说亚洲欧美 | 欧美日韩ab片| 亚洲人体一区| 一区二区av在线| 欧美激情精品久久久久| 欧美精品激情在线观看| 欧美系列一区| 亚洲一区在线视频| 欧美在线观看你懂的| 国产伦精品一区二区三区视频孕妇 | 亚洲无毛电影| 国产精品久久| 亚洲欧美日韩另类| 久久人人97超碰人人澡爱香蕉| 国产亚洲欧美日韩一区二区| 久久精品国产免费看久久精品| 久久午夜精品一区二区| 在线日韩av片| 欧美日韩一区二区三区视频 | 性欧美超级视频| 国产亚洲欧洲一区高清在线观看| 性做久久久久久免费观看欧美| 久久久999精品免费| 亚洲国产精品久久精品怡红院| 欧美女同在线视频| 亚洲午夜精品一区二区| 久久免费视频观看| 亚洲精品欧洲| 国产欧美一区二区三区国产幕精品| 久久国产主播精品| 91久久精品网| 久久大逼视频| 亚洲精品精选| 国产一区二区三区久久精品| 欧美成人免费全部观看天天性色| 在线亚洲精品| 亚洲福利国产| 久久久久欧美精品| 一区二区三区四区五区视频| 在线视频欧美日韩| 久久婷婷国产麻豆91天堂| 日韩一级黄色av| 国产日产欧美a一级在线| 欧美成年人视频网站| 亚洲欧美在线x视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日韩一区二区三区在线观看免| 亚洲一区二区三| 亚洲风情亚aⅴ在线发布| 久久av一区二区| 亚洲麻豆国产自偷在线| 国外视频精品毛片| 国产精品久久国产精品99gif | 亚洲美女视频在线免费观看| 国产伦精品一区二区三区| 欧美区亚洲区| 久久综合久久久| 久久精品天堂| 欧美一区国产在线| 亚洲一级在线观看| 亚洲精品三级| 欧美激情久久久久久|