Android 15最坑破坏性变更:禁用锁屏居然要改这个隐藏属性(RK356x实测)

电子说

1.4w人已加入

描述

在瑞芯微 RK356x 平台适配 Android 15 系统时,会遇到一个极具迷惑性的兼容性问题: Android 12 沿用至 Android 14 的 "开机直接进入系统标准配置,在部分 Android 15 版本上彻底失效

对于工业平板、自助终端、广告机这类设备来说,开机自动跳过锁屏、屏幕永不休眠是最基础的刚需。但 Google 在 Android 15 开发周期中对锁屏初始化逻辑进行了多次调整,且全程没有任何官方文档说明,导致大量从旧版本升级的项目都踩了这个坑。

最让人困惑的现象是:明明在系统设置中看到 "锁屏方式:无",但开机依然会显示滑动锁屏。这种 "配置显示正确但行为错误的问题,排查难度远高于直接报错。

本文将基于 AOSP Android 15 官方源码,拆解不同版本间的逻辑差异,给出全版本兼容的解决方案,并详细解释旧配置失效的根本原因。

Linux

一、问题复现:为什么同样的配置在不同 Android 15 上表现不一样?

Android 12/13/14 通用标准配置

在过去三个大版本中,行业内通用的禁用锁屏配置只需在设备 overlay 中添加两行:

  •  
  •  
  •  
<bool name="config_disableLockscreenByDefault">truebool><bool name="def_lockscreen_disabled">truebool>

这两行配置的作用清晰明确:

config_disableLockscreenByDefault:系统框架级别的开关,控制新用户默认是否禁用锁屏

def_lockscreen_disabledSettingsProvider 的默认值,系统初始化时会写入数据库

 部分 Android 15 版本完全失效

但在 Android 15 正式版及部分 Beta 版本中,即使原封不动保留上述配置,烧录后开机依然会停留在锁屏界面。

典型异常现象

1.开机必须手动滑动才能进入桌面

2.进入设置→ 安全 → 屏幕锁定,显示为 ""

3.手动切换为 "滑动再改回 "",重启后锁屏再次出现

4.通过命令查询settings get secure lockscreen_disabled,返回值为1(表示已禁用)

这说明配置已经正确写入系统数据库,但系统在初始化的关键阶段没有读取到这个值。

二、Android 15 全版本通用解决方案

经过对多个 Android 15 版本的源码分析和交叉验证,以下方案在所有 Android 15 版本(从 Beta 1 到最新正式版)上都能稳定生效,同时向下兼容 Android 12/13/14

1. 禁用锁屏:三个配置同时保留(全版本兼容)

为了覆盖所有 Android 版本和厂商 SDK 变体,建议同时保留以下三个配置:

  •  
  •  
  •  
  •  
<bool name="config_disableLockscreenByDefault">truebool><bool name="def_lockscreen_disabled">truebool>
  •  
  •  
  •  
  •  
# 添加 Android 15 专属属性(重中之重)# device/xxx/xxx.mk# 注意:必须使用 PRODUCT_DEFAULT_PROPERTY_OVERRIDES,不能用 PRODUCT_PROPERTY_OVERRIDESPRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.lockscreen.disable.default=true

关键说明

ro.lockscreen.disable.default  Android 15 新增的系统属性,优先级最高

必须使用PRODUCT_DEFAULT_PROPERTY_OVERRIDES 写入/default.prop

保留旧配置不会产生任何副作用,同时保证向下兼容性

不同芯片厂商的 Android 15 SDK 同步进度不同,部分厂商的早期 SDK 可能仍依赖旧配置

2. 屏幕永不休眠:配置方式无变化

屏幕超时配置在所有 Android 版本中保持一致:

  •  
  •  
  •  
  •  
  •  
<resources>        <integer name="def_screen_off_timeout">2147483647integer>resources>

注意事项

不要设置为 0 或负数,部分系统会将其视为无效值并使用默认 60 

系统设置界面会显示为 "30 分钟",这是 UI 层的最大值限制,实际内部值正确

24.8 天对于绝大多数工业设备来说已等同于 "永不休眠"

三、Android 15 内部版本逻辑差异详解

这是最容易被忽略的一点:Android 15 在开发过程中三次修改了锁屏初始化逻辑,导致不同阶段的版本行为完全不同。这也是为什么有人说旧配置在 Android 15 上还能用,有人说完全不行的根本原因。

1. Android 15 Beta 1

沿用 Android 14 的逻辑

旧配置config_disableLockscreenByDefault def_lockscreen_disabled 完全有效

不存在ro.lockscreen.disable.default 属性

2. Android 15 Beta 2 ~ Beta 4

首次引入ro.lockscreen.disable.default 属性

逻辑实现在LockSettingsService.onBootPhase() 方法中

系统服务就绪后优先读取该属性,若为 true 则直接禁用锁屏

旧配置依然有效,但优先级低于新属性

3. Android 15 正式版(r1 及以后)

逻辑实现位置发生重大变更

移至LockSettingsService.Injector.getStorage() 方法中的数据库创建回调

locksettings.db 数据库创建时直接写入禁用值

旧配置完全失效,因为 SettingsProvider 启动时数据库中已有值

4. 厂商 SDK 差异

不同芯片厂商的 Android 15 SDK 同步进度不同:

瑞芯微 2026 年 月之后发布的 SDK 已同步正式版逻辑

部分厂商的早期 Android 15 SDK 仍停留在 Beta 阶段逻辑

个别厂商可能会对 Google 的逻辑进行二次修改

四、根本原因分析:为什么旧配置失效了?

Android 15 正式版的逻辑变更最为彻底,直接从数据库层面覆盖了所有其他配置。

核心代码逻辑

 LockSettingsService 初始化时,会注册一个数据库创建回调:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
public LockSettingsStorage getStorage() {    final LockSettingsStorage storage = new LockSettingsStorage(mContext);    storage.setDatabaseOnCreateCallback(new LockSettingsStorage.Callback() {        @Override        public void initialize(SQLiteDatabase db) {            // 从系统属性读取默认值            boolean lockScreenDisable = SystemProperties.getBoolean(                    "ro.lockscreen.disable.default"false);            if (lockScreenDisable) {                // 直接写入数据库,优先级最高                storage.writeKeyValue(db, LockPatternUtils.DISABLE_LOCKSCREEN_KEY"1"0);            }        }    });    return storage;}

系统启动时序决定一切

  •  
  •  
  •  
  •  
  •  
  •  
[阶段1] 内核启动 → 加载 /default.prop → ro.lockscreen.disable.default 生效[阶段2] system_server 启动 → LockSettingsService 初始化[阶段3] 创建 /data/system/locksettings.db 数据库[阶段4] 执行数据库创建回调,直接写入 DISABLE_LOCKSCREEN_KEY = "1"[阶段5] 很久以后,SettingsProvider 启动[阶段6] 发现数据库中已有值,忽略 def_lockscreen_disabled 默认值

可以看到,ro.lockscreen.disable.default  SettingsProvider 启动之前就已经完成了数据库写入,旧配置自然被完全覆盖。

为什么必须用 

PRODUCT_DEFAULT_PROPERTY_OVERRIDES

数据库创建发生在系统启动极早期

此时/system/build.prop 尚未完全加载

只有/default.prop 中的属性在该阶段可用

PRODUCT_DEFAULT_PROPERTY_OVERRIDES 写入/default.prop

PRODUCT_PROPERTY_OVERRIDES 仅写入/system/build.prop

五、99% 开发者都会踩的终极巨坑

这个逻辑有一个完全没有文档说明的反人类特性:

 数据库创建回调只在数据库第一次创建时执行一次!

也就是说:

1.若首次烧录固件时未添加ro.lockscreen.disable.default=true

2.locksettings.db 会被创建,且DISABLE_LOCKSCREEN_KEY 值为0

3.之后再添加该属性并重新烧录,依然不会生效

4.因为数据库已存在,回调不会再次执行

解决方法:每次修改该属性后,必须执行:

  •  
  •  
  •  
adb rootadb shell rm -rf /data/system/locksettings.db*adb reboot

或在烧录固件时选择擦除 data 分区,或恢复出厂设置。

六、全 Android 版本配置对比表

Android 版本

有效配置

优先级

备注

12/13/14

config_disableLockscreenByDefault=true
def_lockscreen_disabled=true

两个都需要,缺一不可

15 Beta 1

同上

无新增属性

15 Beta 2~4

旧配置 + ro.lockscreen.disable.default=true

新属性 > 旧配置

新属性可选,旧配置仍有效

15 正式版

ro.lockscreen.disable.default=true

最高

旧配置完全失效

最佳实践:三个配置同时保留,可实现从 Android 12 到 Android 15 的全版本兼容,无需针对不同版本单独修改。

七、完整验证步骤

烧录新固件并擦除 data 分区后,按以下步骤验证:

1.重启设备,确认开机后直接进入桌面,无任何锁屏界面

2.进入设置→ 显示 → 屏幕超时,确认显示为 "30 分钟"

3.等待 30 分钟以上,确认屏幕未熄灭

4.进入设置→ 安全 → 屏幕锁定,确认显示为 "None"

5.执行getprop ro.lockscreen.disable.default,返回值应为true

6.执行settings get secure lockscreen_disabled,返回值应为1

7.恢复出厂设置后再次重启,确认依然直接进入桌面

八、完整补丁文件(RK356x 全版本兼容)

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
diff --git a/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml b/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xmlindex 7a8d9f6e..b2c3d4f5 100644--- a/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml+++ b/device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml@@ -63,5 +63,9 @@          2: gestures only for back, home and overview -->     <integer name="config_navBarInteractionMode">0integer>     <bool name="config_swipe_up_gesture_setting_available">truebool>++    +    <bool name="config_disableLockscreenByDefault">truebool>+    <bool name="def_lockscreen_disabled">truebool> resources>diff --git a/device/rockchip/rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/device/rockchip/rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xmlindex b02c48b5..a5e2a236 100755--- a/device/rockchip/rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml+++ b/device/rockchip/rk356x/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml@@ -17,7 +17,7 @@  */ --> <resources>-    <integer name="def_screen_off_timeout">60000integer>+    <integer name="def_screen_off_timeout">2147483647integer> resources>diff --git a/device/rockchip/rk356x/rk3566_u/rk3566_u.mk b/device/rockchip/rk356x/rk3566_u/rk3566_u.mkindex 3ec62e6a..0ab868ed 100644--- a/device/rockchip/rk356x/rk3566_u/rk3566_u.mk+++ b/device/rockchip/rk356x/rk3566_u/rk3566_u.mk@@ -47,3 +47,4 @@ PRODUCT_PROPERTY_OVERRIDES += ro.vendor.hdmirotationlock=true PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A PRODUCT_PROPERTY_OVERRIDES += persist.vendor.framebuffer.main=1920x540+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.lockscreen.disable.default=true

九、总结

Android 15 对锁屏逻辑的多次调整,给工业设备适配带来了不小的麻烦。由于 Google 没有提供任何官方文档说明,导致大量开发者在这个问题上浪费了大量时间,重要提醒,在rk平台开发发现,不同的android15还是有差异,沿用之前的也可以实现功能。

核心要点回顾

Android 15 内部不同版本的锁屏逻辑差异巨大

正式版中ro.lockscreen.disable.default 是唯一有效的配置

必须使用PRODUCT_DEFAULT_PROPERTY_OVERRIDES 写入该属性

修改后必须擦除 data 分区或删除 locksettings.db 文件

同时保留旧配置可实现全版本兼容

希望本文能帮助正在适配 Android 15 的开发者们避开这个坑。如果在适配过程中遇到其他问题,欢迎交流讨论。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分