RK3588-ANDROID12-永不息屏,不锁屏

本文介绍了一种屏保时间配置的优化方案,通过修改设备配置文件及资源设置,实现了屏保时间从60秒延长至永不自动关闭的效果,并禁用了锁屏功能。

参考https://blog.youkuaiyun.com/longmin96/article/details/122555882

修改:

diff --git a/device/rockchip/common/device.mk b/device/rockchip/common/device.mk
index 9d87af9158..2e0a40d278 100644
--- a/device/rockchip/common/device.mk
+++ b/device/rockchip/common/device.mk
@@ -683,7 +683,8 @@ ifeq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), box)
       ro.rk.screenoff_time=2147483647
 else
 PRODUCT_PROPERTY_OVERRIDES += \
-    ro.rk.screenoff_time=60000
+    ro.rk.screenoff_time=2147483647
+    #ro.rk.screenoff_time=60000
 endif
 
 # incrementalfs config
diff --git a/device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
index b02c48b561..a5e2a23640 100755
--- a/device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
+++ b/device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -17,7 +17,7 @@
  */
 -->
 <resources>
-    <integer name="def_screen_off_timeout">60000</integer>
+    <integer name="def_screen_off_timeout">2147483647</integer>
    <!-- Initial value for the Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS setting,
          which is a comma separated list of packages that no longer need confirmation
          for immersive mode.
diff --git a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
index aba8038e6f..8a24dd9944 100644
--- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
+++ b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -18,7 +18,7 @@
 -->
 <resources>
     <bool name="def_dim_screen">true</bool>
-    <integer name="def_screen_off_timeout">60000</integer>
+    <integer name="def_screen_off_timeout">2147483647</integer>
     <integer name="def_sleep_timeout">-1</integer>
     <bool name="def_airplane_mode_on">false</bool>
     <bool name="def_theater_mode_on">false</bool>
@@ -82,7 +82,7 @@
     <integer name="def_max_sound_trigger_detection_service_ops_per_day" translatable="false">1000</integer>
     <integer name="def_sound_trigger_detection_service_op_timeout" translatable="false">15000</integer>
 
-    <bool name="def_lockscreen_disabled">false</bool>
+    <bool name="def_lockscreen_disabled">true</bool>
     <bool name="def_device_provisioned">false</bool>
     <integer name="def_dock_audio_media_enabled">1</integer>
 
diff --git a/packages/apps/Settings/res/values/arrays.xml b/packages/apps/Settings/res/values/arrays.xml
index c6d59b71f3..2c46661844 100644
--- a/packages/apps/Settings/res/values/arrays.xml
+++ b/packages/apps/Settings/res/values/arrays.xml
@@ -48,6 +48,7 @@
         <item>5 minutes</item>
         <item>10 minutes</item>
         <item>30 minutes</item>
+        <item>never</item>
     </string-array>
 
     <!-- Do not translate. -->
@@ -66,6 +67,7 @@
         <item>600000</item>
         <!-- Do not translate. -->
         <item>1800000</item>
+        <item>2147483647</item>
     </string-array>

<think>我们正在寻找在Android 11系统中通过修改系统源码实现的方法。根据引用内容,我们可以总结出几种可能的修改方向: 1. **修改电源管理服务(PowerManagerService)**:在系统判断是否该进入睡眠时,跳过时的睡眠逻辑。引用[1]中给出了`updateWakefulnessLocked`方法,该方法在满足一定条件时会触发睡眠(`goToSleepNoUpdateLocked`)或小睡(`napNoUpdateLocked`)。我们可以通过修改这里的判断条件来避免。 2. **修改默认超时时间**:引用[2]展示了在设备层覆盖默认的超时时间(`def_screen_off_timeout`)为一个很大的值(2147483647毫秒,约24.8天),从而实现几乎。但是这种方法可能并能完全实现,因为后系统可能还会根据其他策略。 3. **拦截睡眠请求**:引用[3]展示了在`goToSleep`方法中直接返回,从而阻止系统进入睡眠。这是一种比较暴力的方法,但可能会影响正常的睡眠流程(比如用户主动按电源键幕应该熄)。 因此,结合用户需求(),我们重点考虑第一种方法,即修改`PowerManagerService`中的相关逻辑。 ### 修改方案:阻止时进入睡眠 在`PowerManagerService`中,我们需要关注两个关键方法: 1. `updateWakefulnessLocked`:这个方法会根据当前的状态(包括是否有唤醒、用户活动等)更新设备的唤醒状态。 2. `isItBedTimeYetLocked`:这个方法判断是否到了该睡觉()的时间。 根据引用[1],在`updateWakefulnessLocked`方法中有如下代码: ```java if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) { // ... 进入睡眠或小睡 } ``` 我们需要修改这段逻辑,使得在状态下(幕关闭但设备仍处于唤醒状态)进入睡眠。但是,注意时设备通常处于`WAKEFULNESS_AWAKE`状态(除非设备已经休眠)。因此,我们可以考虑在状态下跳过进入睡眠的逻辑。 然而,更直接的修改点可能是`isItBedTimeYetLocked`方法。在该方法中,系统会判断是否满足睡眠条件。我们可以修改该方法,在状态下返回false,即表示还没到睡眠时间。 但是,注意状态在`PowerManagerService`中是如何表示的?通常在Android系统中,状态由`KeyguardManager`管理,我们可以通过`KeyguardManager`来判断是否处于状态。 具体修改步骤: 1. 在`PowerManagerService`中获取`KeyguardManager`。 2. 在`isItBedTimeYetLocked`方法中,检查当前是否处于状态,如果是,则返回false。 然而,需要注意的是,`isItBedTimeYetLocked`方法在系统中有多处调用,我们需要确保修改会影响其他正常逻辑。 另一种思路:修改`shouldNapAtBedTimeLocked`和`shouldSleepWhenReadyLocked`方法,让它们在状态下返回false。 但是,根据引用[1]中展示的代码,我们也可以直接修改`updateWakefulnessLocked`方法,在状态下跳过睡眠。 具体代码修改: ```java private boolean updateWakefulnessLocked(int dirty) { boolean changed = false; if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_BOOT_COMPLETED | DIRTY_WAKEFULNESS | DIRTY_STAY_ON | DIRTY_PROXIMITY_POSITIVE | DIRTY_DOCK_STATE)) != 0) { if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) { // 新增:如果当前处于状态,则进入睡眠 if (isKeyguardLocked()) { // 状态下,进入睡眠 return changed; } // 原有的睡眠逻辑 // ... } } return changed; } ``` 我们需要在`PowerManagerService`中实现`isKeyguardLocked()`方法: ```java private boolean isKeyguardLocked() { KeyguardManager kgm = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); return kgm != null && kgm.isKeyguardLocked(); } ``` 注意:由于`PowerManagerService`是系统服务,它运行在系统进程中,因此可以直接获取`KeyguardManager`服务。 但是,这种方法可能存在一个问题:当设备时,`isItBedTimeYetLocked`方法返回true(表示该睡眠了),而我们通过判断状态跳过了睡眠。这样,状态下幕就会熄。 ### 另一个修改点:修改默认超时 根据引用[2],我们可以修改默认的超时时间。这种方法需要修改`SettingsProvider`的默认配置,将默认的幕超时时间设置为一个很大的值(或者-1表示永不超时)。但是,这种方法会影响到整个系统(仅仅是状态),也就是说,在非状态下,如果用户操作,幕也会长时间亮着。 修改路径:`device/rockchip/rk3326/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml`(具体路径可能因设备而异) 修改内容: ```xml <integer name="def_screen_off_timeout">-1</integer> ``` 或者: ```xml <integer name="def_screen_off_timeout">2147483647</integer> ``` 注意:这种方式需要设备制造商的overlay支持,并且会影响后的超时(因为后系统会使用超时设置)。所以,如果希望,还需要修改后的超时设置。 ### 第三种方法:拦截goToSleep调用 引用[3]展示了一个简单粗暴的方法:在`goToSleep`方法中直接返回,这样任何调用`goToSleep`的操作都会使设备进入睡眠。但是,这个方法会影响到所有睡眠请求(包括用户主动按电源键),可能导致即使非状态下也无法熄,所以推荐。 ### 推荐方案 结合用户需求(),我们建议采用第一种方法(修改`PowerManagerService`的`updateWakefulnessLocked`方法),并增加状态判断。这样可以确保在状态下,系统会因为超时而进入睡眠。 具体修改步骤(针对Android 11源码): 1. 修改文件:`frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java` 2. 在`updateWakefulnessLocked`方法中,在判断是否进入睡眠的代码块前,加入状态判断: ```java if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) { // 检查是否处于状态 if (isKeyguardLocked()) { // 状态,进入睡眠 return changed; } ... // 原有的睡眠逻辑 } ``` 3. 在`PowerManagerService`类中添加`isKeyguardLocked`方法: ```java private boolean isKeyguardLocked() { if (mContext == null) { return false; } KeyguardManager kgm = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); if (kgm == null) { return false; } return kgm.isKeyguardLocked(); } ``` 注意:由于`updateWakefulnessLocked`方法是在(`mLock`)内调用的,我们添加的`isKeyguardLocked`方法内部访问了`KeyguardManager`,而`KeyguardManager`的方法可能会调用到系统服务,因此需要注意避免死。但是`KeyguardManager`的`isKeyguardLocked`方法是一个简单的远程调用,会持有`PowerManagerService`的,所以是安全的。 另外,我们还需要考虑状态下用户活动超时的情况。即使,如果没有任何用户活动,系统还是会触发超时。因此,我们还需要修改状态下的超时时间?实际上,我们的修改已经阻止了时进入睡眠,所以需要修改超时时间。 ### 测试验证 修改后编译系统镜像并刷机测试。测试步骤: 1. 设置一个较短的幕超时时间(比如1分钟)。 2. 手动(按电源键)。 3. 等待超过1分钟,观察幕是否熄。 如果幕保持亮着(可能是半亮状态,取决于设备),则修改成功。 ### 相关问题 1. 这种方法在Android 12及以上版本是否适用? 2. 修改系统源码后如何避免被系统更新覆盖? 3. 除了,如何实现状态下保持全亮(而是半亮)? ### 引用说明 我们在修改`updateWakefulnessLocked`方法时参考了引用[1]的逻辑,在状态下跳过睡眠流程,从而实现[^1]。 </think>在 Android 11 系统中通过修改系统源码实现,主要有以下三种核心方法: ### 方法 1:修改电源管理服务(PowerManagerService) **文件路径**: `frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java` **关键修改**: ```java private boolean updateWakefulnessLocked(int dirty) { boolean changed = false; if ((dirty & (DIRTY_WAKE_LOCKS | ... )) != 0) { if (mWakefulness == WAKEFULNESS_AWAKE && isItBedTimeYetLocked()) { // 增加状态检测 if (isKeyguardActive()) { // 时跳过睡眠流程 return false; } if (shouldNapAtBedTimeLocked()) { changed = napNoUpdateLocked(...); } else { changed = goToSleepNoUpdateLocked(...); } } } return changed; } // 新增状态检测方法 private boolean isKeyguardActive() { KeyguardManager kgm = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); return kgm != null && kgm.isKeyguardLocked(); } ``` **原理**:当检测到设备处于状态时,直接跳过睡眠流程判断逻辑[^1]。 ### 方法 2:覆盖默认超时设置 **文件路径**: `device/[厂商]/[设备名]/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml` **关键修改**: ```xml <integer name="def_screen_off_timeout">2147483647</integer> <!-- 约24.8天 --> ``` 或永久亮: ```xml <integer name="def_screen_off_timeout">-1</integer> ``` **效果**:将系统默认的超时设置为最大值,使系统在状态下也会自动[^2]。 ### 方法 3:拦截睡眠指令 **文件路径**: `frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java` **关键修改**: ```java @Override public void goToSleep(long eventTime, int reason, int flags) { // 拦截相关的睡眠请求 if (reason == PowerManager.GO_TO_SLEEP_REASON_TIMEOUT) { return; // 直接返回,阻止执行 } // ... 原始代码逻辑 } ``` **原理**:当系统因超时尝试进入睡眠时,直接阻断该操作[^3]。 --- ### 实现效果验证 修改后需重新编译系统镜像: ```bash make -j8 # 全编译 adb reboot bootloader fastboot flash system system.img ``` ### 注意事项 1. **权限要求**:需要系统签名权限(`platform`证书) 2. **兼容性问题**:需针对特定设备调整覆盖层路径(如高通/MTK平台) 3. **电源管理冲突**:需同步修改`shouldNapAtBedTimeLocked()`返回`false`防止系统进入半亮状态[^1] > **最佳实践**:对于定制设备,建议组合使用方法1+方法2,既覆盖默认超时设置,又在运行时阻断睡眠逻辑。测试时需验证`adb shell dumpsys power`输出中`mWakefulness=AWAKE`状态是否持续保持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值