PowerManagerService的启动流程

本文详细剖析了Android系统中PowerManagerService的启动流程,包括构造方法、onStart函数及SystemReady函数的分析。PowerManagerService负责电源管理,控制设备待机、显示屏、传感器状态,并与HAL层、kernel交互。启动流程涉及构造Handler、WakeLock、SuspendBlocker的初始化,以及系统状态的设置。在SystemReady阶段,注册广播接收器、设置监听、读取配置并更新电源状态。
摘要由CSDN通过智能技术生成

PowerManagerServcie是android系统电源管理的核心服务,它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态,控制显示屏,背光灯,距离传感器,光线传感器等硬件设备的状态。向上提供给应用程序相应的操作接口,比如听音乐时持续保持系统唤醒,应用通知来临唤醒手机屏幕等场景等,PMS也是系统的核心服务,启动流程的时序图如下:

启动流程时序图

AAA


根据PowerManagerService的启动流程时序图,可以简单的将启动过程分为图中的几个步骤。

根据代码来详细分析

  PowerManagerService是系统的核心服务,在SystemServer中启动。SystemServer在系统启动的时候会启动三种服务,引导关键服务,核心服务和其他服务。

startBootstrapServices(); //启动引导服务
startCoreServices();//启动核心服务
 startOtherServices();//其他服务

在启动引导关键服务的方法中,创建PowerManagerService对象,并将它启动了起来

mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

接着我们看下startService相关的代码实现。

public <T extends SystemService> T startService(Class<T> serviceClass) {
        ……
        final T service;
        try {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
            //构造PowerManangerService对象
        } catch (InstantiationException ex) {
            ……
        }
        // Register it.
        mServices.add(service); //将PowerManangerService添加到LocalService中
        // Start it.
        try {
            service.onStart(); //调用PowerManagerService的onStart方法
        } catch (RuntimeException ex) {
           ……
        }
        return service;
    }

在startService方法中,利用反射方法构造PowerManagerService的对象,将它添加到本地service变量中,然后调用了PowerManagerService的onStart方法。

那么我们首先来分析PowerManagerService的构造方法,然后在分析PowerManagerService的onStart方法。

PowerManagerService的构造方法分析

public PowerManagerService(Context context) {
        super(context);
        mContext = context;
        mHandlerThread = new ServiceThread(TAG,
                Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
        mHandlerThread.start();
        //创建一个HandlerThread,并启动
        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
        //基于这个HandlerThread创建一个相关的Handler对象,用于向handlerThread中发送消息
        synchronized (mLock) {
            mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
            //该WakeLock用于控制CPU
            mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
            //该wakeLock用于控制屏幕
            mDisplaySuspendBlocker.acquire();
            mHoldingDisplaySuspendBlocker = true;
            mHalAutoSuspendModeEnabled = false;
            mHalInteractiveModeEnabled = true;

            mWakefulness = WAKEFULNESS_AWAKE;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值