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

被折叠的 条评论
为什么被折叠?



