Android7.0 PowerManagerService(1) 启动过程

本文详细分析了Android 7.0中PowerManagerService(PMS)的启动过程,包括构造函数、onStart函数和systemReady函数。PMS由SystemServer启动,对外接口为PowerManager,通过Binder通信。PMS构造函数初始化成员并加载底层库,onStart函数发布BinderService和LocalService,并进行watchdog相关工作。systemReady函数则涉及获取成员变量、注册广播接收器和配置参数。后续文章将进一步探讨updatePowerStateLocked函数及其在电源状态变化时的角色。
摘要由CSDN通过智能技术生成

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值