OpenHarmony系统解决方案 - 锁屏引起的卡开机动画 原创 精华
问题描述
问题环境
系统版本:OpenHarmony-3.2-Release
问题现象
设备接通电源,开机动画正常播放结束,长时间静止在开机动画结束界面,无法正常进入系统。
问题原因
- 设备性能导致的锁屏应用未在锁屏服务检测监听事件的时间段内启动完成,导致无法触发关闭开机动画。
- 系统不需要锁屏应用,把锁屏应用删除后,未移除锁屏服务(theme_screenlock_mgr)导致无法触发关闭开机动画。
解决方案
针对设备性能问题的解决方案
调整锁屏检测次数,增加锁屏检测的时间,保证可以在锁屏应用启动后正常设置系统参数bootevent.lockscreen.ready为true。
根据设备性能调整OnSystemReady函数的tryTime变量数值,服务会间隔1S执行检测锁屏应用是否成功注册监听,并执行回调。如果超过检测次数,则会一直处于开机动画界面。
针对删除锁屏应用的解决方案
移除锁屏服务(screenlock_mgr)组件,以RK3568编译配置为例。需在编译配置文件productdefine/common/inherit/rich.json中删除screenlock_mgr组件的编译配置。以下为删除后的theme编译配置。
如果需要保留锁屏服务,则需删除锁屏服务开机检测项bootevents,配置项位于base/theme/screenlock_mgr/etc/init/screenlockservice.cfg。
定位过程
1. 开机动画退出逻辑,当开机动画获取到bootevent.boot.completed属性为true时,退出开机动画。
2. 开机启动服务组件会收集设备服务开机配置信息中的bootevents配置,并统计数量后赋值变量g_bootEventNum。当系统参数被设置时,过滤bootevent字段,调用下方函数进行g_bootEventNum--。当数量变为0时则将bootevent.bootanimation.started设置为true。
3. 查看锁屏服务开机配置,存在bootevents配置项。
4. 通过shell查看系统中的参数。发现bootevent.lockscreen.ready参数未被设置。
param get | grep bootevent
5. 尝试手动添加参数,判断是否为此问题。如果可以正常退出开机动画,则确定是由于锁屏参数未设置导致的此问题。
param set bootevent.lockscreen.ready true
6. 查看锁屏应用源码,应用启动后会注册ScreenLockMar.onSystemEvent事件。事件注册后,当触发systemReady设置时,会将bootevent.lockscreen.ready参数设置为true。
7. 在锁屏服务中遍历判断是否有systemEventListener_的监听,如果有systemReady事件将被触发。而systemEventListener_则是由步骤6中锁屏应用设置,形成闭环。
8. 落盘开机Log,查看日志中ScreenLockSystemAbility OnSystemReady type not found., flag_ = %{public}d日志的打印数量,如果为20条则确定是由于锁屏应用未在检测结束前注册监听导致。
很实用的问题分析分享👍
非常好,不错不错!!
监听事件的时间段不设置太长主要还是为用户作想吧
确实有时候开机会卡在开机动画