
在SystemServer的main()中:
//The main entry point from zygote. public static void main(String[] args) { new SystemServer().run(); }
private void run() { //...... try { startBootstrapServices();//启动引导服务 startCoreServices();//启动核心服务 startOtherServices();//启动其他服务 } catch (Throwable ex) { } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } ...... }
private void startBootstrapServices() { //通过SystemManagerService启动PMS服务 mPowerManagerService = mSystemServiceManager. startService(PowerManagerService.class); //AMS中初始化PowerManager mActivityManagerService.initPowerManagement(); }
public SystemService startService(String className) { final Class
serviceClass; serviceClass = (Class
)Class.forName(className); return startService(serviceClass); } public
T startService(Class
serviceClass) { try { final T service; try { //获取实例 Constructor
constructor = serviceClass.getConstructor(Context.class); service = constructor.newInstance(mContext); } catch (InstantiationException ex) { } mServices.add(service);//添加到List中,进行生命周期管理 try { service.onStart();//启动服务 } catch (RuntimeException ex) { } return service; } }
public PowerManagerService(Context context) { super(context); mContext = context; //获取一个系统级别的HandlerThread,继承于Thread mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/); mHandlerThread.start();//开启线程 //根据Looper实例化一个Handler mHandler = new PowerManagerHandler(mHandlerThread.getLooper()); mConstants = new Constants(mHandler); mAmbientDisplayConfiguration = new AmbientDisplayConfiguration(mContext); //电池监测相关 mBatterySavingStats = new BatterySavingStats(mLock); mBatterySaverPolicy = new BatterySaverPolicy(mLock, mContext, mBatterySavingStats); mBatterySaverController = new BatterySaverController(mLock, mContext, BackgroundThread.get().getLooper(), mBatterySaverPolicy, mBatterySavingStats); mBatterySaverStateMachine = new BatterySaverStateMachine( mLock, mContext, mBatterySaverController); synchronized (mLock) { //获取当应用申请wakelock后让CUP保持激活状态的Suspendlocker实例 mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks"); //获取当显示屏开启、显示屏准备就绪或者有用户活动后让CPU保持激活状态的Suspendlocker mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display"); //申请PowerManagerService.Display类型的suspendBloker锁 mDisplaySuspendBlocker.acquire(); //持有Display锁的bool值 mHoldingDisplaySuspendBlocker = true; //AutoSuspend模式是否开启 mHalAutoSuspendModeEnabled = false; //是否处于交互模式 mHalInteractiveModeEnabled = true; //设置wakefulness表示亮屏状态 mWakefulness = WAKEFULNESS_AWAKE; sQuiescent = SystemProperties.get(SYSTEM_PROPERTY_QUIESCENT, "0").equals("1"); nativeInit();//初始化 nativeSetAutoSuspend(false);//设置是否开启anto suspend模式 nativeSetInteractive(true);//设置是否处于交互模式 nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, 0); } }
@Override public void onStart() { //发布到系统服务中 publishBinderService(Context.POWER_SERVICE, new BinderService()); //发布到本地服务 publishLocalService(PowerManagerInternal.class, new LocalService()); //设置Watchdog监听 Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); }
public static void addService(String name, IBinder service, boolean allowIsolated) { try { getIServiceManager().addService(name, service, allowIsolated); } catch (RemoteException e) { Log.e(TAG, "error in addService", e); } }
public static
void addService(Class
type, T service) { synchronized (sLocalServiceObjects) { if (sLocalServiceObjects.containsKey(type)) { throw new IllegalStateException("Overriding service registration"); } sLocalServiceObjects.put(type, service); } }
public void startBootPhase(final int phase) { if (phase <= mCurrentPhase) { throw new IllegalArgumentException("Next phase must be larger than previous"); } mCurrentPhase = phase; try { final int serviceLen = mServices.size(); for (int i = 0; i < serviceLen; i++) { final SystemService service = mServices.get(i); try { service.onBootPhase(mCurrentPhase); } catch (Exception ex) { } } } }
public void onBootPhase(int phase) { synchronized (mLock) { if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) { //统计启动的apk个数 incrementBootCount(); } else if (phase == PHASE_BOOT_COMPLETED) { final long now = SystemClock.uptimeMillis(); mBootCompleted = true; //mDirty置位 mDirty |= DIRTY_BOOT_COMPLETED; mBatterySaverStateMachine.onBootCompleted(); //更新用户活动时间 userActivityNoUpdateLocked( now, PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, Process.SYSTEM_UID); //更新电源状态信息 updatePowerStateLocked(); if (!ArrayUtils.isEmpty(mBootCompletedRunnables)) { Slog.d(TAG, "Posting " + mBootCompletedRunnables.length + " delayed runnables"); for (Runnable r : mBootCompletedRunnables) { BackgroundThread.getHandler().post(r); } } mBootCompletedRunnables = null; } } }
synchronized (mLock) { mSystemReady = true; mAppOps = appOps; //和DreamManagerService交互 mDreamManager = getLocalService(DreamManagerInternal.class); //和DisplayManagerService交互 mDisplayManagerInternal = getLocalService(DisplayManagerInternal.class); //和WindowManagerService交互 mPolicy = getLocalService(WindowManagerPolicy.class); //和BatteryService交互 mBatteryManagerInternal = getLocalService(BatteryManagerInternal.class); //获取屏幕亮度 PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mScreenBrightnessSettingMinimum = pm.getMinimumScreenBrightnessSetting(); mScreenBrightnessSettingMaximum = pm.getMaximumScreenBrightnessSetting(); mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting(); mScreenBrightnessForVrSettingDefault = pm.getDefaultScreenBrightnessForVrSetting(); SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper()); //获取BatteryStatsService mBatteryStats = BatteryStatsService.getService(); //mNotifier用于PMS和其他系统服务间的交互,以及广播的发送 mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats, mAppOps, createSuspendBlockerLocked(“PowerManagerService.Broadcasts”), mPolicy); //无线充电相关 mWirelessChargerDetector = new WirelessChargerDetector(sensorManager, createSuspendBlockerLocked (“PowerManagerService.WirelessChargerDetector”), mHandler); //监听Stetings中值的变化 mSettingsObserver = new SettingsObserver(mHandler); //和LightsManager交互 mLightsManager = getLocalService(LightsManager.class); mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION); //mDisplayPowerCallbacks提供PMS和Display的接口,当 //DisplayPowerController发生改变,通过该接口回调PMS中的实现 //initPowerManagement()方法中实例化了DisplayPowerController, //DPC是和显示有关,如亮灭屏、背光调节 mDisplayManagerInternal.initPowerManagement( mDisplayPowerCallbacks, mHandler, sensorManager);
// Register for broadcasts from other components of the system. //注册BatteryService中ACTION_BATTERY_CHANGED广播 IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler); //Dream相关 filter = new IntentFilter(); filter.addAction(Intent.ACTION_DREAMING_STARTED); filter.addAction(Intent.ACTION_DREAMING_STOPPED); mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler); //?? filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler); //Dock相关 filter = new IntentFilter(); filter.addAction(Intent.ACTION_DOCK_EVENT); mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
private void updateSettingsLocked() { final ContentResolver resolver = mContext.getContentResolver(); //屏保是否支持 mDreamsEnabledSetting = (Settings.Secure.getIntForUser(resolver, Settings.Secure.SCREENSAVER_ENABLED, mDreamsEnabledByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); //休眠时是否启用屏保 mDreamsActivateOnSleepSetting = (Settings.Secure.getIntForUser(resolver, Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, mDreamsActivatedOnSleepByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); //插入基座时屏保是否激活 mDreamsActivateOnDockSetting = (Settings.Secure.getIntForUser(resolver, Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, mDreamsActivatedOnDockByDefaultConfig ? 1 : 0, UserHandle.USER_CURRENT) != 0); //设备在一段时间不活动后进入休眠或者屏保状态的时间,15*1000ms mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT); /设备在一段时间不活动后完全进入休眠状态之前的超时时间, 该值必须大于SCREEN_OFF_TIMEOUT,否则设置了屏保后来不及显示屏保就sleep/ mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver, Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT, UserHandle.USER_CURRENT); //充电时屏幕一直开启 mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC); //是否支持剧院模式 mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.THEATER_MODE_ON, 0) == 1; //屏幕保持常亮 mAlwaysOnEnabled = mAmbientDisplayConfiguration. alwaysOnEnabled(UserHandle.USER_CURRENT); //双击唤醒屏幕设置 if (mSupportsDoubleTapWakeConfig) { boolean doubleTapWakeEnabled = Settings.Secure.getIntForUser(resolver, Settings.Secure.DOUBLE_TAP_TO_WAKE, DEFAULT_DOUBLE_TAP_TO_WAKE, UserHandle.USER_CURRENT) != 0; if (doubleTapWakeEnabled != mDoubleTapWakeEnabled) { mDoubleTapWakeEnabled = doubleTapWakeEnabled; nativeSetFeature(POWER_FEATURE_DOUBLE_TAP_TO_WAKE, mDoubleTapWakeEnabled ? 1 : 0); } } final String retailDemoValue = UserManager.isDeviceInDemoMode(mContext) ? “1” : “0”; … //屏幕亮度 mScreenBrightnessSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_BRIGHTNESS, mScreenBrightnessSettingDefault, UserHandle.USER_CURRENT); //自动调节亮度值(>0.0 <1.0) final float oldScreenAutoBrightnessAdjustmentSetting = mScreenAutoBrightnessAdjustmentSetting; mScreenAutoBrightnessAdjustmentSetting = Settings.System.getFloatForUser(resolver, Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.0f, UserHandle.USER_CURRENT); //重置临时亮度值 if (oldScreenBrightnessSetting != getCurrentBrightnessSettingLocked()) { mTemporaryScreenBrightnessSettingOverride = -1; } if (oldScreenAutoBrightnessAdjustmentSetting != mScreenAutoBrightnessAdjustmentSetting) { mTemporaryScreenAutoBrightnessAdjustmentSettingOverride = Float.NaN; } //亮度调节模式,自动1,正常0 mScreenBrightnessModeSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT); //低电量模式是否可用,1表示true final boolean lowPowerModeEnabled = Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE, 0) != 0; if (lowPowerModeEnabled != mLowPowerModeSetting || autoLowPowerModeConfigured != mAutoLowPowerModeConfigured) { mLowPowerModeSetting = lowPowerModeEnabled; mAutoLowPowerModeConfigured = autoLowPowerModeConfigured; //更新低电量模式 updateLowPowerModeLocked(); } //标志位置位 mDirty |= DIRTY_SETTINGS; }
4.调用readConfigurationLocked()方法读取配置文件中的默认值:
private void readConfigurationLocked() { final Resources resources = mContext.getResources(); / * auto_suspend模式是否和display分离 * 如果为false,则在亮屏前调用autosuspend_disable(),灭屏后调用 * autosuspend_enable(); * 如果为ture,则调用autosuspend_display()和autosuspend_enable()独立于display * on/off. / mDecoupleHalAutoSuspendModeFromDisplayConfig = resources.getBoolean( com.android.internal.R.bool. config_powerDecoupleAutoSuspendModeFromDisplay); /* * interactive模式是否和display分离 * 如果为false,则在亮屏前调用setInteractive(…, true),灭屏后调用 * setInteractive(…,false); * 如果为ture,则调用setInteractive(…)独立于display on/off. */ mDecoupleHalInteractiveModeFromDisplayConfig = resources.getBoolean( com.android.internal.R.bool .config_powerDecoupleInteractiveModeFromDisplay); //插拔USB是否亮屏 mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean( com.android.internal.R.bool.config_unplugTurnsOnScreen); //设备处于剧院模式时,插拔USB是否亮屏 mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean( com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug); //是否允许设备由于接近传感器而关闭屏幕时CPU挂起,进入suspend状态 mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean( com.android.internal.R.bool. config_suspendWhenScreenOffDueToProximity); //是否支持屏保 mDreamsSupportedConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsSupported); //是否屏保默认打开–false mDreamsEnabledByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsEnabledByDefault); //充电和睡眠时屏保是否激活 mDreamsActivatedOnSleepByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault); //Dock时屏保是否激活 mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault); //放电时是否允许进入屏保 mDreamsEnabledOnBatteryConfig = resources.getBoolean( com.android.internal.R.bool.config_dreamsEnabledOnBattery); //充电时允许屏保的最低电量,使用-1禁用此功能 mDreamsBatteryLevelMinimumWhenPoweredConfig = resources.getInteger( com.android.internal.R.integer. config_dreamsBatteryLevelMinimumWhenPowered); //放电时允许屏保的最低电量,使用-1禁用此功能,默认15 mDreamsBatteryLevelMinimumWhenNotPoweredConfig = resources.getInteger( com.android.internal.R.integer. config_dreamsBatteryLevelMinimumWhenNotPowered); //电亮下降到该百分点,当用户活动超时后不进入屏保,默认5 mDreamsBatteryLevelDrainCutoffConfig = resources.getInteger( com.android.internal.R.integer.config_dreamsBatteryLevelDrainCutoff); //如果为true,则直到关闭屏幕并执行屏幕关闭动画之后,才开始Doze,默认false mDozeAfterScreenOffConfig = resources.getBoolean( com.android.internal.R.bool.config_dozeAfterScreenOff); //用户活动超时的最小时间,默认10000ms,必须大于0 mMinimumScreenOffTimeoutConfig = resources.getInteger( com.android.internal.R.integer.config_minimumScreenOffTimeout); //用户活动超时进入且关闭屏幕前屏幕变暗的最大时间,默认7000ms,必须大于0 mMaximumScreenDimDurationConfig = resources.getInteger( com.android.internal.R.integer.config_maximumScreenDimDuration); //屏幕变暗的时长比例,如果用于超时时间过短,则在7000ms的基础上按还比例减少,默认20% mMaximumScreenDimRatioConfig = resources.getFraction( com.android.internal.R.fraction.config_maximumScreenDimRatio, 1, 1); //是否支持双击唤醒屏幕 mSupportsDoubleTapWakeConfig = resources.getBoolean( com.android.internal.R.bool.config_supportDoubleTapWake); }
// Register for settings changes. resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ENABLED), false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP), false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), …
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207002.html原文链接:https://javaforall.net
