Android设备Standby Mode与CEC交互异常问题排查及需求咨询
Android设备Standby Mode与CEC交互异常问题排查及需求咨询
问题背景
我目前在调试一款Android视频设备的间歇性异常问题:设备的待机模式与CEC“睡眠”消息交互时,连接的CEC感知电视会出现两种截然不同的行为:
- 理想行为:电视正常关机,再次开启电视(未开启设备)时无HDMI视频信号;唤醒设备时需1-2秒恢复。
- 异常行为:电视正常关机,但再次开启电视时HDMI端口显示黑屏(仍有视频信号);唤醒设备时几乎瞬间恢复。
根据现象推测,问题根源是Android设备进入待机模式时,试图启动某种屏保画面,导致HDMI接口被持续激活。以下是关键日志片段:
01-15 18:04:53.370 2639 3095 D vol.VolumeDialogControl: onReceive ACTION_SCREEN_OFF 01-15 18:04:53.370 2639 2639 D DozeScreenState: setDozeScreenState(1) 01-15 18:04:53.370 2639 2639 D KeyguardViewMediator: handleNotifyFinishedGoingToSleep 01-15 18:04:53.372 2639 2639 D CentralSurfaces: Received new disable state: enaihbcrso.qingr (unchanged) 01-15 18:04:53.372 2639 2639 E OverviewProxyService: Failed to get overview proxy for disable flags. 01-15 18:04:53.372 2639 2639 D CentralSurfaces: Received new disable state: enaihbcrso.qingr (unchanged) -- 01-15 18:04:53.382 3519 3519 D SYS_EVENT: send event 8 notification to client 01-15 18:04:53.382 2015 2968 D SystemServerTiming: getUserSwitchability-0 01-15 18:04:53.382 2015 2968 D SystemServerTiming: TM.isInCall 01-15 18:04:53.382 2015 2968 D Telecom : Logging: START_SESSION 01-15 18:04:53.382 2015 2968 D Telecom : Logging: END_SESSION (dur: 0 ms): TSI.iIC@ALI 01-15 18:04:53.382 3494 3494 D PASRDozeReceiver: Received Intent Intent { act=android.intent.action.SCREEN_OFF flg=0x50200010 } 01-15 18:04:53.382 2015 2968 D SystemServerTiming: hasUserRestriction-DISALLOW_USER_SWITCH 01-15 18:04:53.382 2015 2968 D SystemServerTiming: getInt-ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED 01-15 18:04:53.382 2015 2968 D SystemServerTiming: isUserUnlocked-USER_SYSTEM 01-15 18:04:53.383 2015 4003 D SystemServerTiming: getUserSwitchability-0 01-15 18:04:53.383 2015 4003 D SystemServerTiming: TM.isInCall -- 01-15 18:04:53.383 2015 4003 D SystemServerTiming: hasUserRestriction-DISALLOW_USER_SWITCH 01-15 18:04:53.383 2015 4003 D SystemServerTiming: getInt-ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED 01-15 18:04:53.383 2015 4003 D SystemServerTiming: isUserUnlocked-USER_SYSTEM 01-15 18:04:53.384 3494 3494 D PASRDozeReceiver: Sent intent Successfully 01-15 18:04:53.384 3494 3494 D PASRService: PASRService started 01-15 18:04:53.384 3494 3494 D PASRService: OnStartteett, Intent: android.intent.action.SCREEN_OFF 01-15 18:04:53.384 3494 3494 D PASRService: Screen Off timer prop: 0. val: 0
核心需求
如何阻止Android设备为了显示屏保而保持HDMI接口活跃,但保留设备其他的待机模式功能?
专家解决方案(口语化落地)
Charles,针对你遇到的这个问题,我结合Android待机机制和HDMI CEC的工作逻辑,给你几个可落地的排查和解决方向:
1. 先从屏保设置入手,直接切断触发源
既然你推测是屏保导致HDMI保持活跃,第一步可以直接禁用系统屏保,验证是否能解决问题:
- 进入设备的设置 > 显示 > 屏保,关闭“启动屏保”开关;
- 或者用ADB命令快速设置:
如果禁用后异常行为消失,那说明确实是屏保在待机时触发了HDMI输出,这时候你可以再考虑是否要定制屏保的触发条件(比如仅在本地屏幕显示,不在外部HDMI输出),而不是完全禁用。settings put system screensaver_enabled 0
2. 排查Doze模式下的外部显示设置
日志里的DozeScreenState: setDozeScreenState(1)是关键——这里的1通常代表Doze模式下保持屏幕(包括外部HDMI)处于低功耗活跃状态。你可以尝试调整Doze模式对外部显示的处理:
- 检查设备是否有“Doze模式下保持外部显示”的隐藏设置,可通过
adb shell settings list global查找相关参数(比如doze_external_display_enabled),如果有则设置为0:settings put global doze_external_display_enabled 0 - 若设备支持,也可以在开发者选项中关闭“始终显示”(AOD)功能,因为AOD和Doze模式联动时,可能会强制保持HDMI信号。
3. 禁用PASR相关的低功耗显示服务
日志里的PASRDozeReceiver和PASRService在ACTION_SCREEN_OFF后被启动,PASR(Panel Self Refresh)是一种面板低功耗技术,但部分设备会在外部HDMI显示时错误地保持信号。你可以尝试:
- 先找到PASR服务所属的包名:
adb shell ps | grep 3494 # 3494是日志里PASRService的进程ID - 然后禁用该接收器或服务:
注意:这个操作可能需要设备有root权限,或者你有系统签名的应用权限。pm disable --user 0 <包名>/com.example.PASRDozeReceiver
4. 调整HDMI CEC的待机控制逻辑
Android的HDMI CEC服务负责和电视交互,你可以强制设备在待机时发送“关闭HDMI输出”的指令,而不是保持黑屏信号:
- 检查HDMI CEC的相关系统设置:
settings put global hdmi_cec_auto_off 1 settings put global hdmi_cec_enable 1 - 或者直接操作HDMI节点(需要root):
这个命令会直接关闭HDMI输出,你可以把它加到待机广播的处理逻辑里,比如在echo 0 > /sys/class/hdmi/hdmi/stateACTION_SCREEN_OFF时触发。
5. 定制系统待机时的HDMI行为(适合ROM开发场景)
如果你有设备的ROM源码权限,可以从系统层面修改:
- 在
DozeService或PowerManagerService中,添加判断:当设备进入待机且连接外部HDMI时,直接关闭HDMI输出,而不是进入低功耗显示状态; - 修改
PASRService的触发条件,仅在本地屏幕存在时启动,忽略外部HDMI显示。
验证步骤
每做完一个调整后,按以下步骤验证:
- 发送CEC睡眠消息给设备,等待进入待机;
- 开启电视,检查是否有HDMI信号;
- 唤醒设备,确认待机的其他功能(比如快速唤醒、后台进程保留)是否正常。
这样一步步排查,应该能定位到问题根源并解决,同时保留你需要的待机功能~




