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()的相關流程

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