屏幕超时休眠-Android13

04-14 1160阅读

屏幕超时休眠-Android13

  • 1、设置界面
    • 1.2 属性值
      • 1.2.1 默认值
      • 1.2.2 最小值限制
      • 1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT
      • 2、超时灭屏
        • 2.1 锁定屏幕的超时
        • 2.2 屏幕灭屏的超时
        • 3、永不休眠
        • * 关键日志

          1、设置界面

          屏幕超时休眠-Android13

          packages/apps/Settings/src/com/android/settings/display/ScreenTimeoutSettings.java

          packages/apps/Settings/res/xml/screen_timeout_settings.xml

          12-16 12:13:54.707  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.display.ScreenTimeoutSettings
          

          1.2 属性值

          Settings.System.SCREEN_OFF_TIMEOUT

          adb shell settings get System screen_off_timeout
          

          packages/apps/Settings/res/values/arrays.xml

              
              
                  15 seconds
                  30 seconds
                  1 minute
                  2 minutes
                  5 minutes
                  10 minutes
                  30 minutes
              
              
              
                  
                  15000
                  
                  30000
                  
                  60000
                  
                  120000
                  
                  300000
                  
                  600000
                  
                  1800000
              
          

          1.2.1 默认值

          def_screen_off_timeout : frameworks/base/packages/SettingsProvider/res/values/defaults.xml

          frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

              private void loadSystemSettings(SQLiteDatabase db) {
                  SQLiteStatement stmt = null;
                  try {
                      stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                              + " VALUES(?,?);");
                      loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
                              R.bool.def_dim_screen);
                      loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
                              R.integer.def_screen_off_timeout);
                      // Set default cdma DTMF type
                      loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
                      // Set default hearing aid
                      loadSetting(stmt, Settings.System.HEARING_AID, 0);
                      // Set default tty mode
                      loadSetting(stmt, Settings.System.TTY_MODE, 0);
                      loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
                              R.integer.def_screen_brightness);
                      loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_FOR_VR,
                              com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault);
                      loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
                              R.bool.def_screen_brightness_automatic_mode);
                      loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
                              R.bool.def_accelerometer_rotation);
                      loadIntegerSetting(stmt, Settings.System.USER_ROTATION, R.integer.def_user_rotation);
                      loadDefaultHapticSettings(stmt);
                      loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
                              R.bool.def_notification_pulse);
                      loadUISoundEffectsSettings(stmt);
                      loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
                              R.integer.def_pointer_speed);
                      /*
                       * IMPORTANT: Do not add any more upgrade steps here as the global,
                       * secure, and system settings are no longer stored in a database
                       * but are kept in memory and persisted to XML.
                       *
                       * See: SettingsProvider.UpgradeController#onUpgradeLocked
                       */
                  } finally {
                      if (stmt != null) stmt.close();
                  }
              }
          

          frameworks/base/packages/SettingsProvider/res/values/defaults.xml

          60000
          

          1.2.2 最小值限制

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

          mMinimumScreenOffTimeoutConfig = resources.getInteger(com.android.internal.R.integer.config_minimumScreenOffTimeout);
          Math.max(timeout, mMinimumScreenOffTimeoutConfig);
          

          1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT

          在设置屏幕超时代码代码中,最大值可以为“Long.MAX_VALUE”,属性设置Settings.System.putLong(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);,但是实质最大值只能是Integer.MAX_VALUE(2147483647);该属性实质在fwk中是Integer保存,获取方式mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT);

          屏幕超时休眠-Android13

          frameworks/base/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java 中 NON_NEGATIVE_INTEGER_VALIDATOR 检查非法值

          屏幕超时休眠-Android13

              private Long getMaxScreenTimeout(Context context) {
                  if (context == null) {
                      return Long.MAX_VALUE;
                  }
                  final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
                  if (dpm == null) {
                      return Long.MAX_VALUE;
                  }
                  mAdmin = RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context);
                  if (mAdmin != null) {
                      return dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId());
                  }
                  return Long.MAX_VALUE;
              }
              private String getCurrentSystemScreenTimeout(Context context) {
                  if (context == null) {
                      return Long.toString(FALLBACK_SCREEN_TIMEOUT_VALUE);
                  } else {
                      return Long.toString(Settings.System.getLong(context.getContentResolver(),
                              SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE));
                  }
              }
              private void setCurrentSystemScreenTimeout(Context context, String key) {
                  try {
                      if (context != null) {
                          final long value = Long.parseLong(key);
                          mMetricsFeatureProvider.action(context, SettingsEnums.ACTION_SCREEN_TIMEOUT_CHANGED,
                                  (int) value);
                          Settings.System.putLong(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
                      }
                  } catch (NumberFormatException e) {
                      Log.e(TAG, "could not persist screen timeout setting", e);
                  }
              }
          

          2、超时灭屏

          2.1 锁定屏幕的超时

          更新延时 mLockScreenTimeout 执行 mScreenLockTimeout

          frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

          mLockScreenTimeout = Settings.System.getIntForUser(resolver,Settings.System.SCREEN_OFF_TIMEOUT, 0, UserHandle.USER_CURRENT);
          mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);
              class ScreenLockTimeout implements Runnable {
                  Bundle options;
                  @Override
                  public void run() {
                      synchronized (this) {
                          if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard");
                          if (mKeyguardDelegate != null) {
                              mKeyguardDelegate.doKeyguardTimeout(options);
                          }
                          mLockScreenTimerActive = false;
                          mLockNowPending = false;
                          options = null;
                      }
                  }
                  public void setLockOptions(Bundle options) {
                      this.options = options;
                  }
              }
          

          2.2 屏幕灭屏的超时

          updateUserActivitySummaryLocked更新mUserActivitySummary的值,用户活动超时时调用updateUserActivitySummaryLocked,这里获取getScreenOffTimeoutLocked状态更新

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

          mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT);
              @GuardedBy("mLock")
              private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) {
                  long timeout = mScreenOffTimeoutSetting;
                  if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
                      timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
                  }
                  if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
                      timeout = Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
                  }
                  if (sleepTimeout >= 0) {
                      timeout = Math.min(timeout, sleepTimeout);
                  }
                  if (attentiveTimeout >= 0) {
                      timeout = Math.min(timeout, attentiveTimeout);
                  }
                  return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
              }
              private void handleUserActivityTimeout() { // runs on handler thread
                  synchronized (mLock) {
                      if (DEBUG_SPEW) {
                          Slog.d(TAG, "handleUserActivityTimeout");
                      }
                      mDirty |= DIRTY_USER_ACTIVITY;
                      updatePowerStateLocked();
                  }
              }
              /**
               * Updates the value of mUserActivitySummary to summarize the user requested
               * state of the system such as whether the screen should be bright or dim.
               * Note that user activity is ignored when the system is asleep.
               *
               * This function must have no other side-effects.
               */
              @GuardedBy("mLock")
              private void updateUserActivitySummaryLocked(long now, int dirty) {
                  // Update the status of the user activity timeout timer.
                  if ((dirty & (DIRTY_DISPLAY_GROUP_WAKEFULNESS | DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY
                          | DIRTY_WAKEFULNESS | DIRTY_SETTINGS | DIRTY_ATTENTIVE)) == 0) {
                      return;
                  }
                  mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);
                  final long attentiveTimeout = getAttentiveTimeoutLocked();
                  final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
                  long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
                          attentiveTimeout);
                  final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
                  screenOffTimeout =
                          getScreenOffTimeoutWithFaceDownLocked(screenOffTimeout, screenDimDuration);
                  final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
                  long nextTimeout = -1;
                  boolean hasUserActivitySummary = false;
                  for (int idx = 0; idx = powerGroup.getLastWakeTimeLocked()) {
                              groupNextTimeout = lastUserActivityTime + screenOffTimeout - screenDimDuration;
                              if (now = powerGroup.getLastWakeTimeLocked()) {
                              groupNextTimeout = lastUserActivityTimeNoChangeLights + screenOffTimeout;
                              if (now = 0) {
                                  final long anyUserActivity = Math.max(lastUserActivityTime,
                                          lastUserActivityTimeNoChangeLights);
                                  if (anyUserActivity >= powerGroup.getLastWakeTimeLocked()) {
                                      groupNextTimeout = anyUserActivity + sleepTimeout;
                                      if (now  0) {
                      nextTimeout = Math.min(nextTimeout, nextProfileTimeout);
                  }
                  if (hasUserActivitySummary && nextTimeout >= 0) {
                      scheduleUserInactivityTimeout(nextTimeout);
                  }
              }
              private void scheduleUserInactivityTimeout(long timeMs) {
                  final Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
                  msg.setAsynchronous(true);
                  mHandler.sendMessageAtTime(msg, timeMs);
              }
          

          3、永不休眠

            1. 在 PowerManagerService 和 PhoneWindowManager 处理
            1. 直接配置 Settings.System.SCREEN_OFF_TIMEOUT 为Integer.MAX_VALUE( 2147483647 = 24.855 天 一般没有这么长时间亮屏待机 ),设置更长时间替换 Settings.System.SCREEN_OFF_TIMEOUT属性 VALIDATORS.put(System.SCREEN_OFF_TIMEOUT, NON_NEGATIVE_INTEGER_VALIDATOR) 中NON_NEGATIVE_INTEGER_VALIDATOR检测为NONE_NEGATIVE_LONG_VALIDATOR

            * 关键日志

            SettingsActivity:|SubSettings: Launching fragment|start u|ScreenTimeout:|sysui_multi_action: \[757,1754|screen_toggled:|sysui_multi_action:.*screen_timeout|power_screen_state:|PowerManagerService: Waking up|PowerManagerService: Going to sleep
            

            sysui_multi_action: [757,1754,758,4,759,15000]

            sysui_multi_action: [757,1754,758,4,759,30000]

            sysui_multi_action: [757,1754,758,4,759,60000]

            sysui_multi_action: [757,1754,758,4,759,120000]

            sysui_multi_action: [757,1754,758,4,759,300000]

            sysui_multi_action: [757,1754,758,4,759,600000]

            sysui_multi_action: [757,1754,758,4,759,1800000]

            12-17 07:13:37.536   645   678 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.apps.nexuslauncher/.NexusLauncherActivity (has extras)} from uid 0
            12-17 07:13:40.128   645  2427 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.settings/.Settings bnds=[581,351][858,771]} from uid 10149
            12-17 07:13:46.309   645  2510 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.android.settings/.SubSettings (has extras)} from uid 1000
            12-17 07:13:46.408  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.DisplaySettings
            12-17 07:13:46.409  7976  7976 D SubSettings: Launching fragment com.android.settings.DisplaySettings
            12-17 07:13:48.942  7976  7976 I sysui_multi_action: [757,830,758,4,833,0,854,screen_timeout,1089,0]
            12-17 07:13:48.948   645  1716 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.android.settings/.SubSettings (has extras)} from uid 1000
            12-17 07:13:49.036  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.display.ScreenTimeoutSettings
            12-17 07:13:49.037  7976  7976 D SubSettings: Launching fragment com.android.settings.display.ScreenTimeoutSettings
            12-17 07:13:50.690  7976  7976 I sysui_multi_action: [757,1754,758,4,759,15000]
            12-17 07:13:52.884  7976  7976 I sysui_multi_action: [757,1754,758,4,759,30000]
            12-17 07:13:54.152  7976  7976 I sysui_multi_action: [757,1754,758,4,759,60000]
            12-17 07:13:55.559  7976  7976 I sysui_multi_action: [757,1754,758,4,759,120000]
            12-17 07:13:57.041  7976  7976 I sysui_multi_action: [757,1754,758,4,759,300000]
            12-17 07:13:58.400  7976  7976 I sysui_multi_action: [757,1754,758,4,759,600000]
            12-17 07:13:59.653  7976  7976 I sysui_multi_action: [757,1754,758,4,759,1800000]
            12-17 07:14:01.446  7976  7976 I sysui_multi_action: [757,1754,758,4,759,15000]
            12-17 07:14:16.400   645   708 I PowerManagerService: Going to sleep due to timeout (uid 1000)...
            12-17 07:14:17.032   645   645 I power_screen_state: [0,3,0,0,628]
            12-17 07:14:17.032   645   645 I screen_toggled: 0
            12-17 07:14:17.032   645   645 I sysui_multi_action: [757,804,799,screen_timeout,801,15,802,1]
            12-17 07:14:28.765   645   793 I PowerManagerService: Waking up from Asleep (uid=1000, reason=WAKE_REASON_POWER_BUTTON, details=android.policy:POWER)...
            12-17 07:14:28.770   645   645 I screen_toggled: 1
            12-17 07:14:28.905   645   645 I power_screen_state: [1,0,0,0,110]
            
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]