欢迎大家关注我的掘金帐号:https://juejin.cn/user/1459757308978104
我会在那里定期更新最新版本的Android Framework源码分析!
概述
PowerManagerService是负责管理、协调设备电源管理的系统服务之一,设备常见功能如亮灭屏、亮度调节、低电量模式、保持CPU唤醒等,都会通过PMS的协调和处理。其继承自SystemService,因此具有SystemService子类的共性:具有生命周期方法,由SystemServer启动、注册到系统服务中,通过Binder和其他组件进行交互等。
其生命周期方法如下:
构造方法:通过反射调用,获取实例;
onstart()方法:开启对应的SystemService;
onBootPhase()方法:在SystemService服务的启动过程中指定服务的启动阶段,每个阶段指定特定的工作;
由于是系统服务,不仅需要掌握其启动流程,还要了解和其他服务之间的交互,下面就PMS的流程和功能进行具体的分析。
PMS类图如下,其中红色部分表示在本篇文章中分析到的类:
1.1.PMS的启动
和SystemService的其他子类一样,PMS由SystemServer通过反射的方式启动,首先,在SystemServer的main()方法中,调用了自身的run()方法,并在run()方法中启动三类服务:引导服务、核心服务和其他服务,引导服务中启动的是一些依赖性比较强的服务,其中就包括了PMS,具体如下:
在SystemServer的main()中:
//The main entry point from zygote.
public static void main(String[] args) {
new SystemServer().run();
}
在SystemServer的run()中:
private void run() {
//......
try {
startBootstrapServices();//启动引导服务
startCoreServices();//启动核心服务
startOtherServices();//启动其他服务
} catch (Throwable ex) {
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
......
}
所谓引导服务是指一些具有高度相互依赖性的服务,在启动引导服务时,启动了PMS,以下代码是PMS的启动以及和其他服务的依赖关系:
private void startBootstrapServices() {
//通过SystemManagerService启动PMS服务
mPowerManagerService = mSystemServiceManager.
startService(PowerManagerService.class);
//AMS中初始化PowerManager
mActivityManagerService.initPowerManagement();
}
逐步分析,首先看PMS的启动,调用了SystemServiceManager的startService()方法进行了启动,在startService()中,首先通过了传入的类名获取了Class对象,然后使用反射机制,通过Class对象获取了PMS的构造函数,从而获得了一个PMS对象:
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
serviceClass = (Class<SystemService>)Class.forName(className);
return startService(serviceClass);
}
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final T service;
try {
//获取实例
Constructor<T> constructor =
serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
}
mServices.add(service);//添加到List中,进行生命周期管理
try {
service.onStart();//启动服务
} catch (RuntimeException ex) {
}
return service;
}
}
在获取了PMS的实例后,添加到了一个ArrayList中,只有在该ArrayList中的SystemService才能接收到生命周期方法回调;然后调用了onStart()方法.因此,对于PMS,先执行了PMS的构造方法,接着执行了onStart()方法。首先来看其构造方法:
public PowerManagerService(Context context) {
super(context);
mContext = context;
//获取一个系统级别的HandlerThread,继承于Thread
mHandlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_DISPLAY, false );
mHandlerThread.start();//开启线程
//根据Looper实例化一个Handler
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
synchronized (mLock) {
//获取当应用申请wakelock后让CUP保持激活状态的Suspendlocker实例
mWakeLockSuspendBlocker =
createSuspendBlockerLocked("PowerManagerService.WakeLocks");
//获取当显示屏开启、显示屏准备就绪或者有用户活动后让CPU保持激活状态的Suspendlocker
mDisplaySuspendBlocker =
createSuspendBlockerLocked("PowerManagerService.Display");
//申请PowerManagerService.Display类型的suspendBloker锁
mDisplaySuspendBlocker.acquire();
//持有Display锁的bool值
mHoldingDisplaySuspendBlocker = true;
//AutoSuspend模式是否开启
mHalAutoSuspendModeEnabled = false;
//是否处于交互模式
mHalInteractiveModeEnabled = true;
//设置wakefulness表示亮屏状态
mWakefulness = WAKEFULNESS_AWAKE;
//本地方法
nativeInit();//初始化
nativeSetAutoSuspend(false);//设置是否开启anto suspend模式
nativeSetInteractive(true);//设置是否处于交互模式
nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE,