MTK-Android12-13 屏幕永不休眠功能實現
文章目錄
- 需求
- 場景
- 參考資料
- 修改文件
- 簡要分析
- 實現方案
- 默認休眠時間設置 def_screen_off_timeout
- 息屏時間添加永不休眠 screen_timeout_entries
- 更新休眠時間 updateUserActivitySummaryLocked
- 總結
需求
屏幕永不休眠功能
備注:前面正好講到過 修改屏幕息屏時間,這里新增一個小的需求,新增屏幕永不休眠選項
在接觸的 Android12/13 版本產品,系統默認是沒有永不休眠功能的
場景
廣告機、商顯設備、展示設備 要求屏幕默認常亮或者有永不休眠功能
比如如下在設置選項里面需要有一個永不休眠的選項
參考資料
MTK-Android12-13 修改默認息屏時間
Android 屏保功能實現
PowerManagerService 進入屏保 updateUserActivitySummaryLocked
PowerManagerService分析-updatePowerStateLocked方法
PowerManagerService之自動滅屏
前面正好涉及到 修改屏幕默認息屏時間、屏保功能定制實現,和當前需求有所關聯。 在設置里面更改UI組件、加載 添加的永不休眠功能后,最終是需要再PowerManagerService 里面實現永不休眠功能邏輯的呀。
修改文件
/vendor/mediatek\proprietary/packages/apps/SettingsProvider/res/values/defaults.xml
/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml
/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/arrays.xml
/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
簡要分析
如上參考資料,特別是之前實現的部分需求 修改息屏默認時間及屏保功能實現,分析如下:
- defaults.xml 修改默認息屏時間 屬性def_screen_off_timeout,可以設置為0 或者 -1
或者任意你想設置的值 對應永不休眠的值,表示息屏時間默認值。 - arrays.xml
修改屬性dream_timeout_entries,如修改息屏默認時間分析的內容,系統設置中息屏時間界面加載數據源,那就在這里添加 - PowerManagerService.java 如屏保功能分析和其它相關資料參考,在更新休眠時間的地方,不讓更新即可實現需求
實現方案
默認休眠時間設置 def_screen_off_timeout
這里設置為0
<integer name="def_screen_off_timeout">0</integer>
息屏時間添加永不休眠 screen_timeout_entries
<!-- Display settings. The delay in inactivity before the dream is shown. These are shown in a list dialog. --><string-array name="dream_timeout_entries"><item>Never</item><item>15 seconds</item><item>30 seconds</item><item>1 minute</item><item>2 minutes</item><item>5 minutes</item><item>10 minutes</item><item>30 minutes</item></string-array><string-array name="screen_timeout_entries"><item msgid="8386012403457852396">"15 秒"</item><item msgid="4572123773028439079">"30 秒"</item><item msgid="7016081293774377048">"1 分鐘"</item><item msgid="838575533670111144">"2 分鐘"</item><item msgid="2693197579676214668">"5 分鐘"</item><item msgid="1955784331962974678">"10 分鐘"</item><item msgid="5578717731965793584">"30 分鐘"</item><item>"永不休眠"</item></string-array>
更新休眠時間 updateUserActivitySummaryLocked
看方法注釋,就是用來計算一個系統是否進入dim or bright 的狀態
/*** 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.*/private void updateUserActivitySummaryLocked(long now, int dirty) {.....}
在這個方法里面,我們來判斷當前設置的time 值,來判斷是否進行 時間計算就可以了。
if (mScreenOffTimeoutSetting != 0) {if ((groupUserActivitySummary & USER_ACTIVITY_SCREEN_BRIGHT) != 0&& (mDisplayGroupPowerStateMapper.getWakeLockSummaryLocked(groupId)& WAKE_LOCK_STAY_AWAKE) == 0) {groupNextTimeout = mAttentionDetector.updateUserActivity(groupNextTimeout,screenDimDuration);}hasUserActivitySummary |= groupUserActivitySummary != 0;if (nextTimeout == -1) {nextTimeout = groupNextTimeout;} else if (groupNextTimeout != -1) {nextTimeout = Math.min(nextTimeout, groupNextTimeout);}}else {groupUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;}mScreenOffTimeoutSetting 是什么,看PowerManagerService 里面變量的聲明如下:mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,UserHandle.USER_CURRENT);
總結
- 這里重點是PMS 在息屏時間上面的一個功能分析
- 關聯到PMS 里面實現的另外一個功能 屏保功能 都是跟息屏相關,部分邏輯業務關聯的
- 對于默認息屏時間,這里屬于新增息屏時間選項的一個功能。 如果需要新增其它息屏時間選項,只需要在修改息屏時間源即可 就 不需要修改PMS了。