日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android7.0 PowerManagerService(1) 启动过程

發(fā)布時(shí)間:2025/3/15 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android7.0 PowerManagerService(1) 启动过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)如下所示:

public PowerManagerService(Context context) {............//ServiceThread繼承自HandlerThread,專門針對(duì)系統(tǒng)服務(wù)定義的,應(yīng)該是優(yōu)先級(jí)更高吧mHandlerThread = new ServiceThread(TAG,Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);mHandlerThread.start();mHandler = new PowerManagerHandler(mHandlerThread.getLooper());synchronized (mLock) {//創(chuàng)建一些鎖對(duì)象,同構(gòu)acquire和release修改引用數(shù)mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");mDisplaySuspendBlocker.acquire();mHoldingDisplaySuspendBlocker = true;mHalAutoSuspendModeEnabled = false;mHalInteractiveModeEnabled = true;mWakefulness = WAKEFULNESS_AWAKE;nativeInit();nativeSetAutoSuspend(false);nativeSetInteractive(true);nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);} }
  • 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中:

static void nativeInit(JNIEnv* env, jobject obj) {//創(chuàng)建一個(gè)全局引用對(duì)象,引用PMSgPowerManagerServiceObj = env->NewGlobalRef(obj);//利用hw_get_module加載底層動(dòng)態(tài)庫,具體實(shí)現(xiàn)還是依賴與dlsym函數(shù)status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID,(hw_module_t const**)&gPowerModule);if (!err) {//調(diào)用底層動(dòng)態(tài)庫的init函數(shù)gPowerModule->init(gPowerModule);} else {ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err));} }static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {if (enable) {ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_enable() while turning screen off");autosuspend_enable();} else {ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_disable() while turning screen on");//初始時(shí)調(diào)用autosuspend_disable函數(shù),定義于system/core/libsuspend/autosuspend.c中//最終將調(diào)用到autosuspend_earlysuspend_disable函數(shù),就是將底層的置為pwr_state_on的狀態(tài)autosuspend_disable();} }static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {if (gPowerModule) {if (enable) {ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(true) while turning screen on");//初始時(shí),調(diào)用動(dòng)態(tài)庫的setInteractive函數(shù),目前還不確定這個(gè)函數(shù)調(diào)用后的效果gPowerModule->setInteractive(gPowerModule, true);} else {ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(false) while turning screen off");gPowerModule->setInteractive(gPowerModule, false);}} }static void nativeSetFeature(JNIEnv *env, jclass clazz, jint featureId, jint data) {int data_param = data;if (gPowerModule && gPowerModule->setFeature) {//初始時(shí),調(diào)用動(dòng)態(tài)庫的setFeature函數(shù),將POWER_FEATURE_DOUBLE_TAP_TO_WAKE置為0gPowerModule->setFeature(gPowerModule, (feature_t)featureId, data_param);} }
  • 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ù):

public void onStart() {publishBinderService(Context.POWER_SERVICE, new BinderService());publishLocalService(PowerManagerInternal.class, new LocalService());Watchdog.getInstance().addMonitor(this);Watchdog.getInstance().addThread(mHandler); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

從代碼來看,onStart內(nèi)容可以分成3類,即發(fā)布BinderService、發(fā)布LocalService和完成watchdog相關(guān)的工作。?
我們分別看看這3類工作具體的流程。

1、publishBinderService?
publishBinderService定義在PMS的父類SystemService中:

//PMS中的BinderService繼承自IPowerManager.Stub,實(shí)現(xiàn)了IBinder接口 //name為PMS的名稱,power protected final void publishBinderService(String name, IBinder service) {publishBinderService(name, service, false); }protected final void publishBinderService(String name, IBinder service,boolean allowIsolated) {//調(diào)用ServiceManger的接口,實(shí)際上利用Binder通信向Service Manger進(jìn)程注冊(cè)服務(wù)ServiceManager.addService(name, service, allowIsolated); }
  • 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中:

//參數(shù)中的LocalService繼承自PowerManagerInternal類 protected final <T> void publishLocalService(Class<T> type, T service) {LocalServices.addService(type, service); }
  • 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基本類似,這里僅再簡單介紹一下涉及到的流程。

//PMS實(shí)現(xiàn)了Watchdog.Monitor接口,下面的代碼將PMS加入到watchdog的mMonitorChecker中 Watchdog.getInstance().addMonitor(this); //將PMS的ServiceThread對(duì)對(duì)應(yīng)的handler傳入watchdog中,watchdog將利用該handler構(gòu)造一個(gè)HandlerChecker Watchdog.getInstance().addThread(mHandler);
  • 1
  • 2
  • 3
  • 4

3.1 addThread?
當(dāng)PMS調(diào)用addThread時(shí),watchDog利用mHandler構(gòu)造一個(gè)HandlerChecker,然后周期性地調(diào)用HandlerChecker的scheduleCheckLocked方法:

public void scheduleCheckLocked() {//PMS對(duì)應(yīng)的HandlerChecker沒有monitor,因此mMonitors.size()恒等于0//調(diào)用MessageQueue的isPolling函數(shù),判斷是否處于polling狀態(tài);//當(dāng)MessageQueue native層的looper處于等待狀態(tài),即沒有事件需要處理時(shí),isPolling返回trueif (mMonitors.size() == 0 && mHandler.getLooper().getQueue().isPolling()) {mCompleted = true;return;}if (!mCompleted) {// we already have a check in flight, so no needreturn;}mCompleted = false;mCurrentMonitor = null;mStartTime = SystemClock.uptimeMillis();//HandlerChecker繼承runnable,這里的意思是向PMS的handler發(fā)送一個(gè)HandlerChecker類型的runnable事件mHandler.postAtFrontOfQueue(this); }public void run() {final int size = mMonitors.size();//PMS對(duì)應(yīng)的HandlerChecker的mMonitors.size為0,跳過for (int i = 0 ; i < size ; i++) {synchronized (Watchdog.this) {mCurrentMonitor = mMonitors.get(i);}mCurrentMonitor.monitor();}//只要PMS的mHandler在規(guī)定事件內(nèi),執(zhí)行了上文傳入的runnable事件,就說明沒有阻塞,PMS是正常的synchronized (Watchdog.this) {mCompleted = true;mCurrentMonitor = null;} }
  • 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接口:

public void monitor() {// Grab and release lock for watchdog monitor to detect deadlocks.synchronized (mLock) {} }
  • 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ù):

public void systemReady(IAppOpsService appOps) {//這里持鎖,意味者內(nèi)部所有函數(shù)必須在規(guī)定事件內(nèi)執(zhí)行完畢//否則watchDog將會(huì)檢測到錯(cuò)誤synchronized (mLock) {mSystemReady = true;mAppOps = appOps;//注意下面的對(duì)象都是從LocalServices取出的,從之前PMS加入LocalServices的流程來看//下面取出的實(shí)際上應(yīng)該是繼承抽象類的實(shí)際子類//因此大概可以理解LocalServices的作用了,以抽象類名為key,保存實(shí)際的子類//以key取出子類對(duì)象時(shí),子類退化為抽象類,于是得到了實(shí)際對(duì)象,但僅能利用父類的接口//整個(gè)設(shè)計(jì)演變?yōu)槊嫦蚪涌诘木幊?/span>//從注釋來看,與doze有關(guān)mDreamManager = getLocalService(DreamManagerInternal.class);//顯示管理相關(guān)mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);//Window管理相關(guān)mPolicy = getLocalService(WindowManagerPolicy.class);//電源管理相關(guān)mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);//這里獲取PowerManager就是為了方便獲取下面三個(gè)系統(tǒng)屬性PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();//Sensor相關(guān)SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());//系統(tǒng)電量統(tǒng)計(jì)有關(guān)mBatteryStats = BatteryStatsService.getService();// The notifier runs on the system server's main looper so as not to interfere// with the animations and other critical functions of the power manager.mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),mPolicy);//無線充電檢測相關(guān)mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),mHandler);mSettingsObserver = new SettingsObserver(mHandler);//lightService相關(guān)mLightsManager = getLocalService(LightsManager.class);mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);// Initialize display power management.//調(diào)用DisplayManagerService內(nèi)部的LocalService的函數(shù)//創(chuàng)建出DisplayBlanker和DisplayPowerControllermDisplayManagerInternal.initPowerManagement(mDisplayPowerCallbacks, mHandler, sensorManager);//定義一堆BroadcastReceiver..................//利用mSettingsObserver監(jiān)聽一堆數(shù)據(jù)庫字段的變化..................//VR相關(guān)IVrManager vrManager =(IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE);try {vrManager.registerListener(mVrStateCallbacks);} catch (RemoteException e) {Slog.e(TAG, "Failed to register VR mode state listener: " + e);}//從資源文件中讀取大量配置信息readConfigurationLocked();//讀取數(shù)據(jù)庫字段,保存到本地變量中//必要時(shí)會(huì)進(jìn)行一些實(shí)際的操作,例如設(shè)置feature到native層的動(dòng)態(tài)庫updateSettingsLocked();mDirty |= DIRTY_BATTERY_STATE;//更新全局的電源狀態(tài)updatePowerStateLocked();} }
  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。