綜述
在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的相關信息進行交互。當然在此過程中還有很多的更新參數、讀取參數等等不再一一列出,代碼一看就能夠明白。較爲詳細的可以參照如下時序圖。
下一篇介紹下WakeLock.acquire()的相關流程