Android PowerManager 之启动

综述

Android PowerManager 之一 初识中介绍了PowerManager的一些简单的demo。这里简要介绍下PowerManager的启动过程

启动

PowerManagerService是系统提供的用于管理设备电源的一套服务,在SystemServer中被启动。如下面代码所示:

private void run() {
     /*
     * 初始化,申请内存,加载so。等等
     */
     // Start services.
     try {
         Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
         startBootstrapServices();//启动引导的相关Service
         startCoreServices();//启动核心的Service
         startOtherServices();//启动其他的一些必要的Service
     } catch (Throwable ex) {
         Slog.e("System", "******************************************");
         Slog.e("System", "************ Failure starting system services", ex);
         throw ex;
     } finally {
         Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
     }
     // Loop forever.
     Looper.loop();
     throw new RuntimeException("Main thread loop unexpectedly exited");
 }

使用SystemServiceManager这个工厂类来启动PowreManagerService

private void 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).
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
}

看下SystemServiceManager.java中的具体实现

/**
 * Starts a service by class name.
 *
 * @return The service instance.
 */
@SuppressWarnings("unchecked")
public SystemService startService(String className) {
    final Class<SystemService> serviceClass;
    try {
        serviceClass = (Class<SystemService>)Class.forName(className);
    } catch (ClassNotFoundException ex) {
        Slog.i(TAG, "Starting " + className);
        //
    }
    return startService(serviceClass);
}

/**
 * Creates and starts a system service. The class must be a subclass of
 * {@link com.android.server.SystemService}.
 *
 * @param serviceClass A Java class that implements the SystemService interface.
 * @return The service instance, never null.
 * @throws RuntimeException if the service fails to start.
 */
@SuppressWarnings("unchecked")
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 {
            Constructor<T> constructor = serviceClass.getConstructor(Context.class);
            service = constructor.newInstance(mContext);
        }
        // Register it.
        mServices.add(service);

        // Start it.
        try {
            service.onStart();
        } 
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

总结:PowerManagerService会在SystemServer中被启动。在SystemServiceManager中会调用PowerManagerService的构造函数及其onStart方法

    public PowerManagerService(Context context) {
        super(context);
        mContext = context;
        //创建HandlerThread,Handler并启动。
        mHandlerThread = new ServiceThread(TAG,
                Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
        mHandlerThread.start();
        mHandler = new PowerManagerHandler(mHandlerThread.getLooper());

        synchronized (mLock) {
            //创建一个WakeLock,一个Display的SuspendBlocker
            mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
            mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
            mDisplaySuspendBlocker.acquire();
            //......
            //native的初始化。
            nativeInit();
            nativeSetAutoSuspend(false);
            nativeSetInteractive(true);
            nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
        }
    }

    @Override
    public void onStart() {
        //本别将 POWER_SERVICE 和 PowerManagerInternal暴露出去
        publishBinderService(Context.POWER_SERVICE, new BinderService());
        publishLocalService(PowerManagerInternal.class, new LocalService());
        //设置看门狗
        Watchdog.getInstance().addMonitor(this);
        Watchdog.getInstance().addThread(mHandler);
    }

    @Override
    public void systemReady(IAppOpsService appOps) {
        synchronized (mLock) {
            // 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 = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
                    mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
                    mPolicy);

            //注册一大堆的广播,一大堆的监听器
            // Go.
            readConfigurationLocked();
            updateSettingsLocked();
            mDirty |= DIRTY_BATTERY_STATE;
            updatePowerStateLocked();
        }
    }

在启动过程中会创建Notifier对象,主要作用是来发出各种同Power相关的通知,并和Battery的相关信息进行交互。当然在此过程中还有很多的更新参数、读取参数等等不再一一列出,代码一看就能够明白。较为详细的可以参照如下时序图。

PowerManager 启动

下一篇介绍下WakeLock.acquire()的相关流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章