Android7.0 PowerManagerService(1) 启动过程
PowerManagerService負(fù)責(zé)Android系統(tǒng)中電源管理方面的工作,為了簡便我們?cè)谙挛闹袑⑵浜喎Q為PMS。
我們先大致了解一下PMS在Android中的整體結(jié)構(gòu):?
?
如上圖所示,可以看出PMS的對(duì)外接口是PowerManager,其通過Binder通信來調(diào)用PMS中定義的BinderService的接口。?
BinderService與PowerManger之間的通信接口由IPowerManager.aidl來進(jìn)行約束。
PMS由SystemServer來啟動(dòng),我們看看SystemServer.java中相關(guān)的代碼:
private void startBootstrapServices() {..........mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);.......... }private void startOtherServices() {........try {mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());.........} catch (Throwable e) {.........}........ }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
SystemServer.java中PMS涉及的地方主要有兩處:?
1、利用startService啟動(dòng)PMS。?
之前分析PKMS時(shí)我們已經(jīng)提過,startService主要通過反射調(diào)用服務(wù)的構(gòu)造函數(shù),然后再調(diào)用服務(wù)的onStart函數(shù)。?
2、調(diào)用PMS的systemReady方法。?
接下來我們就分三部分,分別看看PMS的構(gòu)造函數(shù)、onStart函數(shù)及systemReady函數(shù)涉及到的流程。
一、構(gòu)造函數(shù)?
PowerManagerService的構(gòu)造函數(shù)如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
容易看出PMS的構(gòu)造函數(shù)較為簡單,僅需要進(jìn)一步分析其native函數(shù)的作用。?
在com_android_server_power_PowerManagerService.cpp中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
從上面的代碼可以看出,PMS的構(gòu)造函數(shù)還是比較簡單的,就是創(chuàng)建一些基本的成員,然后利用native函數(shù)加載底層的動(dòng)態(tài)庫,并設(shè)置一些狀態(tài)和標(biāo)志位。
二、onStart?
接下來我們看看PMS的onStart函數(shù):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
從代碼來看,onStart內(nèi)容可以分成3類,即發(fā)布BinderService、發(fā)布LocalService和完成watchdog相關(guān)的工作。?
我們分別看看這3類工作具體的流程。
1、publishBinderService?
publishBinderService定義在PMS的父類SystemService中:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
通過上述代碼,PMS就將內(nèi)部定義的BinderService注冊(cè)到Service Manager進(jìn)程,對(duì)應(yīng)的名稱為”power”。
2、publishLocalService?
publishLocalService同樣定義在PMS的父類SystemService中:
- 1
- 2
- 3
- 4
我們來看看LocalServices類的addService函數(shù):
/** * Adds a service instance of the specified interface to the global registry of local services. */ public static <T> void addService(Class<T> type, T service) {synchronized (sLocalServiceObjects) {if (sLocalServiceObjects.containsKey(type)) {throw new IllegalStateException("Overriding service registration");}sLocalServiceObjects.put(type, service);} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
從代碼來看,LocalServices的作用與單例模式有些相似,不過更為嚴(yán)格。?
單例模式用于保證某個(gè)類只能創(chuàng)建出一個(gè)對(duì)象; LocalServices管理對(duì)象時(shí),確保繼承某個(gè)類或接口的對(duì)象只有一個(gè)。?
目前,還看不出PMS利用LocalServices管理其內(nèi)部的LocalService的理由,先在此留個(gè)懸念。
3、watchdog相關(guān)工作?
在之前的博客中,分析過Android 6.0中watchdog流程。?
對(duì)于watchdog而言,Android 7.0與Android 6.0基本類似,這里僅再簡單介紹一下涉及到的流程。
- 1
- 2
- 3
- 4
3.1 addThread?
當(dāng)PMS調(diào)用addThread時(shí),watchDog利用mHandler構(gòu)造一個(gè)HandlerChecker,然后周期性地調(diào)用HandlerChecker的scheduleCheckLocked方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
3.2 addMonitor?
當(dāng)PMS調(diào)用watchDog的addMonitor函數(shù)后,watchDog就會(huì)周期性地調(diào)用PMS的monitor接口:
- 1
- 2
- 3
- 4
- 5
PMS只要能在規(guī)定時(shí)間內(nèi)獲得mLock鎖,watchDog就能確認(rèn)PMS沒有死鎖,狀態(tài)正常。
以上只是簡略介紹了一下watchDog相關(guān)的內(nèi)容,詳情可以參考下面的博客。?
Android6.0 watchdog
三、systemReady?
接下來我們看一下PMS的systemReady函數(shù):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
從代碼來看,PMS在systemReady中主要是獲得一些成員變量,注冊(cè)一些廣播接收對(duì)象、讀取一些配置參數(shù)等。雖然PMS會(huì)與多個(gè)服務(wù)打交道,使得systemReady內(nèi)容較為龐雜,但整個(gè)過程比較簡單。
在systemReady函數(shù)的最后,調(diào)用了一個(gè)比較重要的函數(shù)updatePowerStateLocked。當(dāng)PMS監(jiān)控到終端發(fā)生重大變化時(shí),將利用該函數(shù)集中更新所有相關(guān)的狀態(tài)。updatePowerStateLocked涉及的內(nèi)容較多,等對(duì)PMS整體有了初步的了解后,再來分析這個(gè)函數(shù)。
總結(jié)?
本篇博客側(cè)重于介紹PMS的啟動(dòng)過程,同時(shí)對(duì)PMS需要打交道的服務(wù)建立一個(gè)基本的認(rèn)識(shí)。
原文地址: http://blog.csdn.net/gaugamela/article/details/52785041
總結(jié)
以上是生活随笔為你收集整理的Android7.0 PowerManagerService(1) 启动过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google Play Service中
- 下一篇: Android7.0 PowerMana