PowerManagerService 注册及初始化分析

本文详细解析了Android系统中PowerManagerService的启动流程,包括其构造函数、onStart方法及系统准备阶段的工作,深入探讨了服务注册、系统状态更新、配置读取等关键步骤。

service的启动过程:

frameworks/base/services/java/com/android/server/SystemServer.java

303      public static void main(String[] args) {
304          new SystemServer().run();
305      }
 private void run() {
.......
.......
.......
startBootstrapServices();
.......
.......
.......

}

启动PowerManagerService

private void startBootstrapServices() {
    .......
    .......
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    .......
    .......
}

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

54      /**
55       * Starts a service by class name.
56       *
57       * @return The service instance.
58       */
59      @SuppressWarnings("unchecked")
60      public SystemService startService(String className) {
61          final Class<SystemService> serviceClass;
62          try {
63              serviceClass = (Class<SystemService>)Class.forName(className);
64          } catch (ClassNotFoundException ex) {
65              Slog.i(TAG, "Starting " + className);
66              throw new RuntimeException("Failed to create service " + className
67                      + ": service class not found, usually indicates that the caller should "
68                      + "have called PackageManager.hasSystemFeature() to check whether the "
69                      + "feature is available on this device before trying to start the "
70                      + "services that implement it", ex);
71          }
72          return startService(serviceClass);
73      }

aaa

54      /**
55       * Starts a service by class name.
56       *
57       * @return The service instance.
58       */
59      @SuppressWarnings("unchecked")
60      public SystemService startService(String className) {
61          final Class<SystemService> serviceClass;
62          try {
63              serviceClass = (Class<SystemService>)Class.forName(className);
64          } catch (ClassNotFoundException ex) {
65              Slog.i(TAG, "Starting " + className);
66              throw new RuntimeException("Failed to create service " + className
67                      + ": service class not found, usually indicates that the caller should "
68                      + "have called PackageManager.hasSystemFeature() to check whether the "
69                      + "feature is available on this device before trying to start the "
70                      + "services that implement it", ex);
71          }
72          return startService(serviceClass);
73      }
74  
75      /**
76       * Creates and starts a system service. The class must be a subclass of
77       * {@link com.android.server.SystemService}.
78       *
79       * @param serviceClass A Java class that implements the SystemService interface.
80       * @return The service instance, never null.
81       * @throws RuntimeException if the service fails to start.
82       */
83      @SuppressWarnings("unchecked")
84      public <T extends SystemService> T startService(Class<T> serviceClass) {
85          try {
86              final String name = serviceClass.getName();
87              Slog.i(TAG, "Starting " + name);
88              Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);
89  
90              // Create the service.
91              if (!SystemService.class.isAssignableFrom(serviceClass)) {
92                  throw new RuntimeException("Failed to create " + name
93                          + ": service must extend " + SystemService.class.getName());
94              }
95              final T service;
96              try {
97                  Constructor<T> constructor = serviceClass.getConstructor(Context.class);
98                  service = constructor.newInstance(mContext);
99              } catch (InstantiationException ex) {
100                  throw new RuntimeException("Failed to create service " + name
101                          + ": service could not be instantiated", ex);
102              } catch (IllegalAccessException ex) {
103                  throw new RuntimeException("Failed to create service " + name
104                          + ": service must have a public constructor with a Context argument", ex);
105              } catch (NoSuchMethodException ex) {
106                  throw new RuntimeException("Failed to create service " + name
107                          + ": service must have a public constructor with a Context argument", ex);
108              } catch (InvocationTargetException ex) {
109                  throw new RuntimeException("Failed to create service " + name
110                          + ": service constructor threw an exception", ex);
111              }
112  
113              startService(service);
114              return service;
115          } finally {
116              Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
117          }
118      }
119  
120      public void startService(@NonNull final SystemService service) {
121          // Register it.
122          mServices.add(service);
123          // Start it.
124          long time = SystemClock.elapsedRealtime();
125          try {
126              service.onStart();
127          } catch (RuntimeException ex) {
128              throw new RuntimeException("Failed to start service " + service.getClass().getName()
129                      + ": onStart threw an exception", ex);
130          }
131          warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
132      }
mServices.add(service);//注册到服务列表中;
service.onStart(); //调用service的onStart方法

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

看看PowerManagerService的构造函数以及其onStart方法

 

在PowerManagerService的构造函数创建了一个消息发送和处理的Handler和两种WakeLock锁:
    a、PowerManagerService.WakeLocks,主要用于控制CPU的唤醒;
    b、PowerManagerService.Display 主要用于控制屏幕的点亮和熄灭;

然后调用native方法。

653      public PowerManagerService(Context context) {
654          super(context);
655          mContext = context;
                //为系统服务创建处理自己looper的Handler Thread
656          mHandlerThread = new ServiceThread(TAG,
657                  Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/);
658          mHandlerThread.start();
                //用于由电源管理器执行的异步操作的处理程序
659          mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
                //主要是观察Settings.Global.POWER_MANAGER_CONSTANTS的变化
660          mConstants = new Constants(mHandler);
                //显示相关的一些配置
661          mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext);
662             //记录电池消耗率
663          mBatterySavingStats = new BatterySavingStats(mLock);
                //是否为特定服务启用节电模式的类
664          mBatterySaverPolicy = new BatterySaverPolicy(mLock, mContext, mBatterySavingStats);
                //负责节电模式转换逻辑
665          mBatterySaverController = new BatterySaverController(mLock, mContext,
666                  BackgroundThread.get().getLooper(), mBatterySaverPolicy, mBatterySavingStats);
                //决定何时启用/禁用节电助手
667          mBatterySaverStateMachine = new BatterySaverStateMachine(
668                  mLock, mContext, mBatterySaverController);
669  
670          synchronized (mLock) {
                 //主要用于控制CPU的唤醒;              
671              mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
                 //主要用于屏幕的亮/灭; 
672              mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display");
673              mDisplaySuspendBlocker.acquire();
674              mHoldingDisplaySuspendBlocker = true;
675              mHalAutoSuspendModeEnabled = false;
676              mHalInteractiveModeEnabled = true;
677  
678              mWakefulness = WAKEFULNESS_AWAKE;
679  
680              sQuiescent = SystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1");
681              //调用native层初始化
682              nativeInit();
683              nativeSetAutoSuspend(false);
684              nativeSetInteractive(true);
685              nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0);
686          }
687      }

 

Onstart完成的工作就是将POWER_SERVICE作为Binder的服务端,注册到SystemService中去;将PowerManagerInternal注册到本地服务中,将自己加到watchdog的监控队列中去;将之前在构造函数中创建的mHandler对象加入到watchdog的中,用于监视mHandler的looper是否空闲。

711      @Override
712      public void onStart() {
713          publishBinderService(Context.POWER_SERVICE, new BinderService());
714          publishLocalService(PowerManagerInternal.class, new LocalService());
715  
716          Watchdog.getInstance().addMonitor(this);
717          Watchdog.getInstance().addThread(mHandler);
718      }

onBootPhase中主要设置mBootCompleted状态,更新PowerState状态,并执行mBootCompletedRunnables中的runnables方法(低电量模式会设置)。

720      @Override
721      public void onBootPhase(int phase) {
722          synchronized (mLock) {
723              if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
724                  incrementBootCount();
725  
726              } else if (phase == PHASE_BOOT_COMPLETED) {
727                  final long now = SystemClock.uptimeMillis();
728                  mBootCompleted = true;
729                  mDirty |= DIRTY_BOOT_COMPLETED;
730  
731                  mBatterySaverStateMachine.onBootCompleted();
732                  userActivityNoUpdateLocked(
733                          now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID);
734                  updatePowerStateLocked();
735  
736                  if (!ArrayUtils.isEmpty(mBootCompletedRunnables)) {
737                      Slog.d(TAG, "Posting " + mBootCompletedRunnables.length + " delayed runnables");
738                      for (Runnable r : mBootCompletedRunnables) {
739                          BackgroundThread.getHandler().post(r);
740                      }
741                  }
742                  mBootCompletedRunnables = null;
743              }
744          }
745      }

SystemReady所完成的工作如下:
  -获取与PowerManagerServcie相关的系统服务以及本地服务;
  -获取屏幕最大,最小以及默认亮度值;
  -创建SensorManager 对象,用于和SensorService交互;
  -创建Notifier对象,用于通知系统中电源状态的改变;
  -调用DisplayManagerService的initPowerManagement()方法来初始化Power显示模块。
  -注册SettingsObserver监听系统设置的变化。

747      public void systemReady(IAppOpsService appOps) {
748          synchronized (mLock) {
749              mSystemReady = true;
750              mAppOps = appOps;
751              mDreamManager = getLocalService(DreamManagerInternal.class);
752              mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);
753              mPolicy = getLocalService(WindowManagerPolicy.class);
754              mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class);
755  
756              PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
757              mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting();
758              mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting();
759              mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting();
760  
761              SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper());
762  
763              // The notifier runs on the system server's main looper so as not to interfere
764              // with the animations and other critical functions of the power manager.
765              mBatteryStats = BatteryStatsService.getService();
766              mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
767                      createSuspendBlockerLocked("PowerManagerService.Broadcasts"), mPolicy);
768  
769              mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
770                      createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
771                      mHandler);
772              mSettingsObserver = new SettingsObserver(mHandler);
773  
774              mLightsManager = getLocalService(LightsManager.class);
775              mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
776  
777              // Initialize display power management.
778              mDisplayManagerInternal.initPowerManagement(
779                      mDisplayPowerCallbacks, mHandler, sensorManager);
780  
781              try {
782                  final ForegroundProfileObserver observer = new ForegroundProfileObserver();
783                  ActivityManager.getService().registerUserSwitchObserver(observer, TAG);
784              } catch (RemoteException e) {
785                  // Shouldn't happen since in-process.
786              }
787  
788              // Go.
789              readConfigurationLocked();
790              updateSettingsLocked();
791              mDirty |= DIRTY_BATTERY_STATE;
792              updatePowerStateLocked();
793          }
794  
795          final ContentResolver resolver = mContext.getContentResolver();
796          mConstants.start(resolver);
797  
798          mBatterySaverController.systemReady();
799          mBatterySaverPolicy.systemReady();
800  
801          // Register for settings changes.
802          resolver.registerContentObserver(Settings.Secure.getUriFor(
803                  Settings.Secure.SCREENSAVER_ENABLED),
804                  false, mSettingsObserver, UserHandle.USER_ALL);
805          resolver.registerContentObserver(Settings.Secure.getUriFor(
806                  Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP),
807                  false, mSettingsObserver, UserHandle.USER_ALL);
808          resolver.registerContentObserver(Settings.Secure.getUriFor(
809                  Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
810                  false, mSettingsObserver, UserHandle.USER_ALL);
811          resolver.registerContentObserver(Settings.System.getUriFor(
812                  Settings.System.SCREEN_OFF_TIMEOUT),
813                  false, mSettingsObserver, UserHandle.USER_ALL);
814          resolver.registerContentObserver(Settings.Secure.getUriFor(
815                  Settings.Secure.SLEEP_TIMEOUT),
816                  false, mSettingsObserver, UserHandle.USER_ALL);
817          resolver.registerContentObserver(Settings.Global.getUriFor(
818                  Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
819                  false, mSettingsObserver, UserHandle.USER_ALL);
820          resolver.registerContentObserver(Settings.System.getUriFor(
821                  Settings.System.SCREEN_BRIGHTNESS_MODE),
822                  false, mSettingsObserver, UserHandle.USER_ALL);
823          resolver.registerContentObserver(Settings.System.getUriFor(
824                  Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ),
825                  false, mSettingsObserver, UserHandle.USER_ALL);
826          resolver.registerContentObserver(Settings.Global.getUriFor(
827                  Settings.Global.THEATER_MODE_ON),
828                  false, mSettingsObserver, UserHandle.USER_ALL);
829          resolver.registerContentObserver(Settings.Secure.getUriFor(
830                  Settings.Secure.DOZE_ALWAYS_ON),
831                  false, mSettingsObserver, UserHandle.USER_ALL);
832          resolver.registerContentObserver(Settings.Secure.getUriFor(
833                  Settings.Secure.DOUBLE_TAP_TO_WAKE),
834                  false, mSettingsObserver, UserHandle.USER_ALL);
835          resolver.registerContentObserver(Settings.Global.getUriFor(
836                  Settings.Global.DEVICE_DEMO_MODE),
837                  false, mSettingsObserver, UserHandle.USER_SYSTEM);
838          IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE);
839          if (vrManager != null) {
840              try {
841                  vrManager.registerListener(mVrStateCallbacks);
842              } catch (RemoteException e) {
843                  Slog.e(TAG, "Failed to register VR mode state listener: " + e);
844              }
845          }
846  
847          // Register for broadcasts from other components of the system.
848          IntentFilter filter = new IntentFilter();
849          filter.addAction(Intent.ACTION_BATTERY_CHANGED);
850          filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
851          mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler);
852  
853          filter = new IntentFilter();
854          filter.addAction(Intent.ACTION_DREAMING_STARTED);
855          filter.addAction(Intent.ACTION_DREAMING_STOPPED);
856          mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler);
857  
858          filter = new IntentFilter();
859          filter.addAction(Intent.ACTION_USER_SWITCHED);
860          mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
861  
862          filter = new IntentFilter();
863          filter.addAction(Intent.ACTION_DOCK_EVENT);
864          mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
865      }
readConfigurationLocked()方法读取配置文件中的默认值
867      private void readConfigurationLocked() {
868          final Resources resources = mContext.getResources();
869 
            /**
            *电源管理:指定是否将设备的自动挂起状态与显示开/关状态解耦。
            *如果为false,则在打开显示器之前将调用autosuspend_disable(),并在关闭显示器后调                
            *用autosuspend_enable()。此模式为使用传统电源管理功能(如早期暂停/延迟恢复)的设 
            *备提供最佳兼容性。
            *如果为true,则将调用autosuspend_display()和autosuspend_enable(),而与是否打 
            *开或关闭显示无关。 此模式使电源管理器在显示器开启时暂停应用处理器。
            */

870          mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean(
871                  com.android.internal.R.bool.config_powerDecoupleAutoSuspendModeFromDisplay);
             /**
              *电源管理:指定是否将设备的交互状态与显示开/关状态分离。
              *如果为false,则在打开显示之前将调用setInteractive(...,true),并在关闭显示后 
              *调用setInteractive(...,false)。此模式为期望交互状态的设备提供最佳兼容性 被绑        
              *定到显示状态。
              *如果为true,则将调用setInteractive(...),而与是否打开或关闭显示无关。
              *此模式使电源管理器能够在显示器打开时减少时钟并禁用触摸控制器。
              */
872          mDecoupleHalInteractiveModeFromDisplayConfig = resources.getBoolean(
873                  com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay);
             /*插拔USB时亮屏*/
874          mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean(
875                  com.android.internal.R.bool.config_unplugTurnsOnScreen);
             /*在影院模式下插拔能被唤醒
876          mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean(
877                  com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug);
             /**
              *是否允许设备由于接近传感器而关闭屏幕时CPU挂起,进入suspend状态	
              *如果传感器HAL正确地将接近传感器作为唤醒源处理,则此资源仅应设置为true。否则,设        
              *备可能无法可靠地从挂起中唤醒。默认值为false。
              */
878          mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean(
879               com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity);
             /*是否支持屏保*/		
880          mDreamsSupportedConfig = resources.getBoolean(
881                  com.android.internal.R.bool.config_dreamsSupported);
             /*是否屏保默认打开*/
882          mDreamsEnabledByDefaultConfig = resources.getBoolean(
883                  com.android.internal.R.bool.config_dreamsEnabledByDefault);
             /*充电和睡眠时屏保是否激活*/
884          mDreamsActivatedOnSleepByDefaultConfig = resources.getBoolean(
885                  com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
             /*Dock时屏保是否激活*/         
886          mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean(
887                  com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
             //没有充电时是否允许进入屏保
888          mDreamsEnabledOnBatteryConfig = resources.getBoolean(
889                  com.android.internal.R.bool.config_dreamsEnabledOnBattery);
             //充电时允许屏保的最低电量,使用-1禁用此功能	
890          mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger(
891           com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenPowered);
             //未充电时允许屏保的最低电量,使用-1禁用此功能	
892          mDreamsBatteryLevelMinimumWhenNotPoweredConfig = resources.getInteger(
893                  com.android.internal.R.integer.config_dreamsBatteryLevelMinimumWhenNotPowered);
            //电亮下降到该百分点,当用户活动超时后不进入屏保,默认5%
894          mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger(
895                  com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff);
            //如果为true,则直到关闭屏幕并执行屏幕关闭动画之后,才开始Doze,默认false	
896          mDozeAfterScreenOff = resources.getBoolean(
897                  com.android.internal.R.bool.config_dozeAfterScreenOffByDefault);
            //用户活动超时的最小时间,默认10000ms,必须大于0	
898          mMinimumScreenOffTimeoutConfig = resources.getInteger(
899                  com.android.internal.R.integer.config_minimumScreenOffTimeout);
            //用户活动超时进入且关闭屏幕前屏幕变暗的最大时间,默认7000ms,必须大于0	
900          mMaximumScreenDimDurationConfig = resources.getInteger(
901                  com.android.internal.R.integer.config_maximumScreenDimDuration);
            //屏幕变暗的时长比例,如果用于超时时间过短,则在7000ms的基础上按还比例减少,默认20%		
902          mMaximumScreenDimRatioConfig = resources.getFraction(
903                  com.android.internal.R.fraction.config_maximumScreenDimRatio, 1, 1);
            //是否支持双击唤醒屏幕	
904          mSupportsDoubleTapWakeConfig = resources.getBoolean(
905                  com.android.internal.R.bool.config_supportDoubleTapWake);
906      }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值