PowerManagerService第一讲之初始化

一.简介

PowerManagerService是负责Android系统中的电源管理方面的一个系统服务。与其他服务以及Hal层都有交互关系。

二.PowerManager初始化

如果对Android系统启动有一些了解的话,应该知道SystemServer启动之后会启动系统服务,其中就有PowerManagerService。

1.启动PowerManagerService

A.PowerManagerService的初始化

在startBootstrapServices方法:

            // Power manager needs to be started early because other services need it.
            // Native daemons may be watching for it to be registered so it must be ready
            // to handle incoming binder calls immediately (including being able to verify
            // the permissions for those calls).
            traceBeginAndSlog("StartPowerManager");
            mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
            traceEnd();

接着看SystemServiceManager的startService方法:

        @SuppressWarnings("unchecked")
        // 1
        public SystemService startService(String className) {
            final Class<SystemService> serviceClass;
            try {
                serviceClass = (Class<SystemService>)Class.forName(className);
            } catch (ClassNotFoundException ex) {
                Slog.i(TAG, "Starting " + className);
                throw new RuntimeException("Failed to create service " + className
                        + ": service class not found, usually indicates that the caller should "
                        + "have called PackageManager.hasSystemFeature() to check whether the "
                        + "feature is available on this device before trying to start the "
                        + "services that implement it", ex);
            }
            return startService(serviceClass);
        }
    
        @SuppressWarnings("unchecked")
        // 2
        public <T extends SystemService> T startService(Class<T> serviceClass) {
            try {
                final String name = serviceClass.getName();
                Slog.i(TAG, "Starting " + name);
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
    
                // Create the service.
                if (!SystemService.class.isAssignableFrom(serviceClass)) {
                    throw new RuntimeException("Failed to create " + name
                            + ": service must extend " + SystemService.class.getName());
                }
                final T service;
                try {
                    // 3
                    Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                    service = constructor.newInstance(mContext);
                } catch (InstantiationException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service could not be instantiated", ex);
                } catch (IllegalAccessException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service must have a public constructor with a Context argument", ex);
                } catch (NoSuchMethodException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service must have a public constructor with a Context argument", ex);
                } catch (InvocationTargetException ex) {
                    throw new RuntimeException("Failed to create service " + name
                            + ": service constructor threw an exception", ex);
                }
    
                // 4
                startService(service);
                return service;
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
            }
        }
    
        // 5
        public void startService(@NonNull final SystemService service) {
            // Register it.
            mServices.add(service);
            // Start it.
            long time = SystemClock.elapsedRealtime();
            try {
                service.onStart();
            } catch (RuntimeException ex) {
                throw new RuntimeException("Failed to start service " + service.getClass().getName()
                        + ": onStart threw an exception", ex);
            }
            warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
        }
  1. 先通过反射className获取serviceClass;
  2. 传入serviceClass,此时即PowerManagerService;
  3. 反射调用serviceClass的构造函数创建新对象
  4. 调用startService;
  5. 调用service的onStart方法,这里就是PowerManagerService;

先来看上面第三步就会调用PowerManagerService的构造函数:

        public PowerManagerService(Context context) {
            this(context, new Injector());
        }
    
        @VisibleForTesting
        PowerManagerService(Context context, Injector injector) {
            super(context);
    
            mContext = context;
            // 初始化
            mBinderService = new BinderService();
            mLocalService = new LocalService();
            mNativeWrapper = injector.createNativeWrapper();
            mInjector = injector;
    
            // 启动一个工作线程
            mHandlerThread = new ServiceThread(TAG,
                    Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
            mHandlerThread.start();
            mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
            mConstants = new Constants(mHandler);
            mAmbientDisplayConfiguration = mInjector.createAmbientDisplayConfiguration(context);
            mAttentionDetector = new AttentionDetector(this::onUserAttention, mLock);
    
            // 电源相关信息
            mBatterySavingStats = new BatterySavingStats(mLock);
            mBatterySaverPolicy =
                    mInjector.createBatterySaverPolicy(mLock, mContext, mBatterySavingStats);
            mBatterySaverController = new BatterySaverController(mLock, mContext,
                    BackgroundThread.get().getLooper(), mBatterySaverPolicy,
                    mBatterySavingStats);
            mBatterySaverStateMachine = new BatterySaverStateMachine(
                    mLock, mContext, mBatterySaverController);
    
            synchronized (mLock) {
                // wakelocks 挂起阻止程序
                mWakeLockSuspendBlocker =
                        mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks");
                // Display 挂起阻止程序
                mDisplaySuspendBlocker =
                        mInjector.createSuspendBlocker(this, "PowerManagerService.Display");
                if (mDisplaySuspendBlocker != null) {
                    mDisplaySuspendBlocker.acquire();
                    mHoldingDisplaySuspendBlocker = true;
                }
                // 自动暂停模式,启用为true
                mHalAutoSuspendModeEnabled = false;
                // 交互模式,启用为true
                mHalInteractiveModeEnabled = true;
    
                // mWakefulness 为唤醒状态
                mWakefulness = WAKEFULNESS_AWAKE;
                // 在明确的用户操作前灯应熄灭,则为true
                sQuiescent = SystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1");
    
                // 调用native层方法
                mNativeWrapper.nativeInit(this);
                mNativeWrapper.nativeSetAutoSuspend(false);
                mNativeWrapper.nativeSetInteractive(true);
                mNativeWrapper.nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
            }
        }

看下native层的初始化,nativeInit方法对应是实现在com_android_server_power_PowerManagerService.cpp:

    static void nativeInit(JNIEnv* env, jobject obj) {
        //  创建一个全局引用对象gPowerManagerServiceObj
        gPowerManagerServiceObj = env->NewGlobalRef(obj);
    
        // 检查电源HAL服务的当前句柄有效性
        gPowerHalMutex.lock();
        connectPowerHalLocked();
        gPowerHalMutex.unlock();
    }

接着看startService中的onStart方法实现:

    @Override
    public void onStart() {
        publishBinderService(Context.POWER_SERVICE, mBinderService);
        publishLocalService(PowerManagerInternal.class, mLocalService);
    
        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);
    }

将自己加入到看门狗的监控中。

B.SystemReady

SystemServer中的startOtherServices方法:

        traceBeginAndSlog("MakePowerManagerServiceReady");
        try {
            // TODO: use boot phase
            mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
        } catch (Throwable e) {
            reportWtf("making Power Manager Service ready", e);
        }
        traceEnd();

调用PowerManagerService中的systemReady:

    public void systemReady(IAppOpsService appOps) {
        synchronized (mLock) {
            // 对一些成员变量进行赋值
            mSystemReady = true;
            mAppOps = appOps;
            mDreamManager = getLocalService(DreamManagerInternal.class);
            mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);
            mPolicy = getLocalService(WindowManagerPolicy.class);
            mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);
            mAttentionDetector.systemReady(mContext);
    
            PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
            // 屏幕亮度设置限制
            mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();
            mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();
            mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();
    
            // 创建一个SensorManager,用于和传感器交互
            SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
    
            // The notifier runs on the system server's main looper so as not to interfere
            // with the animations and other critical functions of the power manager.
            mBatteryStats = BatteryStatsService.getService();
            mNotifier = mInjector.createNotifier(Looper.getMainLooper(), mContext, mBatteryStats,
                    mInjector.createSuspendBlocker(this, "PowerManagerService.Broadcasts"),
                    mPolicy);
    
            mWirelessChargerDetector = mInjector.createWirelessChargerDetector(sensorManager,
                    mInjector.createSuspendBlocker(
                            this, "PowerManagerService.WirelessChargerDetector"),
                    mHandler);
            mSettingsObserver = new SettingsObserver(mHandler);
    
            mLightsManager = getLocalService(LightsManager.class);
            mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
    
            // Initialize display power management.
            mDisplayManagerInternal.initPowerManagement(
                    mDisplayPowerCallbacks, mHandler, sensorManager);
    
            try {
                final ForegroundProfileObserver observer = new ForegroundProfileObserver();
                ActivityManager.getService().registerUserSwitchObserver(observer, TAG);
            } catch (RemoteException e) {
                // Shouldn't happen since in-process.
            }
    
            // Go.
            // 获取当前的配置属性
            readConfigurationLocked();
            // 更新设置属性
            updateSettingsLocked();
            mDirty |= DIRTY_BATTERY_STATE;
            // 刷新电源状态
            updatePowerStateLocked();
        }
    
        final ContentResolver resolver = mContext.getContentResolver();
        mConstants.start(resolver);
    
        // 启动BatterySave相关
        mBatterySaverController.systemReady();
        mBatterySaverPolicy.systemReady();
    
        // Register for settings changes.
        // 注册设置相关属性
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.SCREENSAVER_ENABLED),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.System.getUriFor(
                Settings.System.SCREEN_OFF_TIMEOUT),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.SLEEP_TIMEOUT),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Global.getUriFor(
                Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.System.getUriFor(
                Settings.System.SCREEN_BRIGHTNESS_MODE),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.System.getUriFor(
                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Global.getUriFor(
                Settings.Global.THEATER_MODE_ON),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.DOZE_ALWAYS_ON),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Secure.getUriFor(
                Settings.Secure.DOUBLE_TAP_TO_WAKE),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(Settings.Global.getUriFor(
                Settings.Global.DEVICE_DEMO_MODE),
                false, mSettingsObserver, UserHandle.USER_SYSTEM);
        IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE));
        if (vrManager != null) {
            try {
                vrManager.registerListener(mVrStateCallbacks);
            } catch (RemoteException e) {
                Slog.e(TAG, "Failed to register VR mode state listener: " + e);
            }
        }
    
        // Register for broadcasts from other components of the system.
        // 注册接收来自系统其他组件的广播。
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);
    
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_DREAMING_STARTED);
        filter.addAction(Intent.ACTION_DREAMING_STOPPED);
        mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);
    
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_USER_SWITCHED);
        mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
    
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_DOCK_EVENT);
        mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
    }

除了成员变量的赋值,获取一些默认属性值。最关键的是updatePowerStateLocked()方法,这是PowerManagerService的核心方法,后面会有讲到。

总结下,附上大致流程图:
在这里插入图片描述

PS:源码基于Android 10.

发布了18 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zplxl99/article/details/103021257