PowerManagerService负责Android系统中电源管理方面的工作,为了简便我们在下文中将其简称为PMS。
我们先大致了解一下PMS在Android中的整体结构:
如上图所示,可以看出PMS的对外接口是PowerManager,其通过Binder通信来调用PMS中定义的BinderService的接口。
BinderService与PowerManger之间的通信接口由IPowerManager.aidl来进行约束。
PMS由SystemServer来启动,我们看看SystemServer.java中相关的代码:
private void startBootstrapServices() {
..........
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
..........
}
private void startOtherServices() {
........
try {
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
.........
} catch (Throwable e) {
.........
}
........
}
SystemServer.java中PMS涉及的地方主要有两处:
1、利用startService启动PMS。
之前分析PKMS时我们已经提过,startService主要通过反射调用服务的构造函数,然后再调用服务的onStart函数。
2、调用PMS的systemReady方法。
接下来我们就分三部分,分别看看PMS的构造函数、onStart函数及systemReady函数涉及到的流程。
一、构造函数
PowerManagerService的构造函数如下所示:
public PowerManagerService(Context context) {
............
//ServiceThread继承自HandlerThread,专门针对系统服务定义的,应该是优先级更高吧
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
synchronized (mLock) {
//创建一些锁对象,同构acquire和release修改引用数
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);
}
}
容易看出PMS的构造函数较为简单,仅需要进一步分析其native函数的作用。
在com_android_server_power_PowerManagerService.cpp中:
static