Android P PowerManagerService分析(一)

本文围绕Android的PowerManagerService(PMS)展开,它负责设备电源管理,如亮灭屏、亮度调节等。文章详细介绍了PMS的启动流程,包括构造方法、onStart()、onBootPhase()和systemReady()方法的执行过程,以及各阶段的功能和与其他服务的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

     PowerManagerService是负责管理、协调设备电源管理的系统服务之一,设备常见功能如亮灭屏、亮度调节、低电量模式、保持CPU唤醒等,都会通过PMS的协调和处理。其继承自SystemService,因此具有SystemService子类的共性:具有生命周期方法,由SystemServer启动、注册到系统服务中,通过Binder和其他组件进行交互等。
其生命周期方法如下:
     构造方法:通过反射调用,获取实例;
     onstart()方法:开启对应的SystemService;
     onBootPhase()方法:在SystemService服务的启动过程中指定服务的启动阶段,每个阶段指定特定的工作;
由于是系统服务,不仅需要掌握其启动流程,还要了解和其他服务之间的交互,下面就PMS的流程和功能进行具体的分析。
在这里插入图片描述

2、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 /*allowIo*/);
     mHandlerThread.start();//开启线程
     //根据Looper实例化一个Handler
     mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
     mConstants = new Constants(mHandler);
     mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
	//电池监测相关
     mBatterySavingStats = new BatterySavingStats(mLock);
     mBatterySaverPolicy = new BatterySaverPolicy(mLock, mContext, mBatterySavingStats);
     mBatterySaverController = new BatterySaverController(mLock, mContext,
             BackgroundThread.get().getLooper(), mBatterySaverPolicy, mBatterySavingStats);
     mBatterySaverStateMachine = new BatterySaverStateMachine(
             mLock, mContext, mBatterySaverController);

     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;
		//设置w
07-31 10:28:12.932 408 526 D EthernetNetworkFactory: Starting Ethernet IpClient(eth0) 07-31 10:28:12.937 408 430 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.android.server.power.PowerManagerService on foreground thread (android.fg) 07-31 10:28:12.938 408 430 W Watchdog: android.fg annotated stack trace: 07-31 10:28:12.938 408 430 W Watchdog: at com.android.server.power.PowerManagerService.monitor(PowerManagerService.java:3785) 07-31 10:28:12.938 408 430 W Watchdog: - waiting to lock <0x08eacc86> (a java.lang.Object) 07-31 10:28:12.938 408 430 W Watchdog: at com.android.server.Watchdog$HandlerChecker.run(Watchdog.java:247) 07-31 10:28:12.939 408 430 W Watchdog: at android.os.Handler.handleCallback(Handler.java:938) 07-31 10:28:12.939 408 430 W Watchdog: at android.os.Handler.dispatchMessage(Handler.java:99) 07-31 10:28:12.939 408 430 W Watchdog: at android.os.Looper.loop(Looper.java:223) 07-31 10:28:12.939 408 430 W Watchdog: at android.os.HandlerThread.run(HandlerThread.java:67) 07-31 10:28:12.939 685 7715 E IpClient.eth0: ERROR disabling IPv6 failed: android.os.ServiceSpecificException: Remote I/O error (code 121) 07-31 10:28:12.939 408 430 W Watchdog: at com.android.server.ServiceThread.run(ServiceThread.java:44) 07-31 10:28:12.939 408 430 W Watchdog: *** GOODBYE! 07-31 10:28:12.939 408 430 I Process : Sending signal. PID: 408 SIG: 9 07-31 10:28:12.952 685 7715 E IpClient.eth0: ERROR error enabling IPv6 privacy extensions: android.os.ServiceSpecificException: Remote I/O error (code 121) 07-31 10:28:12.952 685 7715 E IpClient.eth0: ERROR onProvisioningFailure(): 5 07-31 10:28:29.650 2686 2686 W adbd : timeout expired while flushing socket, closing
最新发布
08-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值