You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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命令快速设置:
    settings put system screensaver_enabled 0
    
    如果禁用后异常行为消失,那说明确实是屏保在待机时触发了HDMI输出,这时候你可以再考虑是否要定制屏保的触发条件(比如仅在本地屏幕显示,不在外部HDMI输出),而不是完全禁用。

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相关的低功耗显示服务

日志里的PASRDozeReceiverPASRServiceACTION_SCREEN_OFF后被启动,PASR(Panel Self Refresh)是一种面板低功耗技术,但部分设备会在外部HDMI显示时错误地保持信号。你可以尝试:

  • 先找到PASR服务所属的包名:
    adb shell ps | grep 3494  # 3494是日志里PASRService的进程ID
    
  • 然后禁用该接收器或服务:
    pm disable --user 0 <包名>/com.example.PASRDozeReceiver
    
    注意:这个操作可能需要设备有root权限,或者你有系统签名的应用权限。

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):
    echo 0 > /sys/class/hdmi/hdmi/state
    
    这个命令会直接关闭HDMI输出,你可以把它加到待机广播的处理逻辑里,比如在ACTION_SCREEN_OFF时触发。

5. 定制系统待机时的HDMI行为(适合ROM开发场景)

如果你有设备的ROM源码权限,可以从系统层面修改:

  • DozeServicePowerManagerService中,添加判断:当设备进入待机且连接外部HDMI时,直接关闭HDMI输出,而不是进入低功耗显示状态;
  • 修改PASRService的触发条件,仅在本地屏幕存在时启动,忽略外部HDMI显示。

验证步骤

每做完一个调整后,按以下步骤验证:

  1. 发送CEC睡眠消息给设备,等待进入待机;
  2. 开启电视,检查是否有HDMI信号;
  3. 唤醒设备,确认待机的其他功能(比如快速唤醒、后台进程保留)是否正常。

这样一步步排查,应该能定位到问题根源并解决,同时保留你需要的待机功能~

火山引擎 最新活动