问题分类处理指南
外部构建版本中的测试问题对于区分应用相关问题和操作系统相关问题至关重要。通过检查应用在不同构建版本中的行为,我们可以有效地查明根本原因在于应用代码还是操作系统本身。这种系统化的方法有助于确保准确识别问题和有针对性的解决方案,从而提高故障排除和调试流程的效率。
在对应用问题进行故障排除时,您可以使用版本比较作为有效的诊断方法。如果在运行相同的应用构建版本时,最新的操作系统版本和以前的操作系统版本都复现问题,则通常表明根本原因在于应用代码或其依赖项。相反,如果问题仅出现在最新操作系统版本上,但尽管使用相同的应用构建版本,仍能在先前的操作系统版本上正常运行,则表明存在操作系统兼容性问题,可能需要在您的应用中进行特定处理。这种比较测试方法可以帮助您有效地确定是将调试工作重点放在应用代码上,还是调查操作系统特定的兼容性要求,最终实现更有针对性的问题解决方案。
以下部分详细介绍了应用端问题的示例。
ANR崩溃
应用无响应 (ANR) 崩溃通常源于应用相关的问题,发生在应用无法响应生命周期管理器 (LCM) 或系统调用。在这些情况下,LCM会强制终止无响应的应用。有几种特定场景可能会触发ANR,从而导致应用终止。
阅读ANR报告
如果您的应用进程发生ANR,那么您要查看的下一个字段将是LCM_ANR_REASON字段;顾名思义,这将是该进程发生ANR的原因。这些原因详述如下:
| LCM_ANR_REASON | 描述 | 其他元数据 | 输出示例 |
|---|---|---|---|
| Lifecycle Callback(生命周期回调) | 当应用更改状态时,LCM会触发回调以将其新状态通知应用(例如:onForeground)。预计应用将在这些过渡后立即返回,以免阻止应用接收新的回调。 | LCM_APP_TRANSITION - 表示哪个组件的生命周期过渡导致了ANR以及它是什么过渡。 | LCM_APP_TRANSITION: appInst[20]: FOREGROUND transition |
| Display Input Event(显示输入事件) | 交互式组件可以订阅以处理来自用户的输入事件,例如触摸、指针或键盘事件。如果异步处理这些事件,则必须在处理事件时进行确认。如果应用未能在给定时间段内确认进行异步处理,则该应用将被视为无响应,应用将被终止。请注意,某些图形实用工具可能会代表应用处理输入确认。 | 不适用 | |
| Thread Monitor(线程监控) | LCM提供了一个名为Thread Monitor的实用工具,监控注册的线程,在发现任何线程没有响应时终止应用。默认情况下,所有应用的主线程都受到监控,但可以使用Thread Watchdog监视其他线程 | LCM_ANR_THREAD_NAME - 如果发生ANR的线程以某个名称注册,则此字段将列出注册时使用的名称。 | LCM_ANR_THREAD_NAME: MyThread |
| Task Execution Limits Exceeded(已超过任务执行限制) | 当任务管理器启动任务时,它有10分钟的时间在后台完成工作。如果任务超过该阈值,则该任务将被终止。请注意,这仅适用于任务管理器启动的任务。 | TASK_MANAGER_COMPONENT_ID - 被终止的任务的组件ID。 TASK_MANAGER_TASK_ID - 被终止的任务的工作ID。 TASK_MANAGER_TASK_NAME - 被终止的任务的可选名称。 |
TASK_MANAGER_COMPONENT_ID: com.amazon.appfwk.test.tm.task TASK_MANAGER_TASK_ID: 1047 TASK_MANAGER_TASK_NAME: triggerExecutionLimits |
应用因无响应 (ANR) 而被终止
为了确保系统上运行的所有应用都处于活动状态并积极遵守其合同,系统上的各种服务会跟踪应用的响应能力。如果它们确定应用已无响应,将请求LCM强制终止该进程。以下是可能导致ANR的事件。请注意,配置文件、平台和产品配置可以覆盖默认的超时长度,因此这可能不是您的应用必须遵守的超时长度。
| ANR原因 | 来源 | ANR过渡描述 | 默认超时长度 |
|---|---|---|---|
| 应用无法从过渡回调中返回 | LCM | 当应用更改状态时,LCM会触发回调以将其新状态通知应用(例如:onForeground)。预计应用将在这些过渡后立即返回,以免阻止应用接收新的回调。 | 8秒 |
| 交互式应用无法在处于前台时创建表面 | LCM / DisplayServer | 所有交互式应用都应在处于前台时创建表面。将组件添加到DisplayStack时,DisplayServer会通知LCM,我们会标明,该组件对用户可见。 | 12秒 |
| 应用不及时响应输入 | DisplayServer | 当应用处于前台且不响应触摸输入时,GWSI会监视触摸ANR并通过LCM进行报告。 | 依据GWSI |
| 应用主线程由于上述原因以外的任何其他原因没有响应 | 应用Thread Monitor | 当主线程过度阻塞或出现死锁时。请注意,这是按设备有条件启用的。 | 45秒 |
| 应用JS线程没有响应 | 应用Thread Monitor | 当JS线程过度阻塞或出现死锁时。 | 依据VS(8秒) |
有了上述数据,我们应该向应用团队提供上述信息,并根据LCM_ANR_REASON向应用团队推荐解决方案。
JS异常
JavaScript (JS) 异常通常源自应用,并记录在journald日志中。在调查问题时,将JS异常与所报告问题的时间戳和重现步骤相关联非常重要。尽管由于各种因素,某些JS异常可能会随机出现在日志中,但若找到符合特定问题时间范围的异常,则强烈表明存在应用端问题,而不是操作系统层面的问题。如果JSErrors出现致命异常后发生崩溃,则是应用的方法引发异常。
媒体控制按钮不起作用
当视频播放期间遥控器上的媒体控制键(如播放、暂停或快进/快退)失效时,日志分析就变得至关重要。全面调查通常侧重于两个方面:验证遥控器的按键事件是否正确到达应用,以及确认应用是否成功确认这些信号。此系统检查有助于确定通信链中断的位置。
但是,应用开发者只能查看应用确认日志
输入日志
~~Jul 14 12:50:38.950438 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:accept:189: Display Power Resource Acquired in response to Key Event [KEY_FASTFORWARD]: Took 0.010ms
Jul 14 12:50:38.950856 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:sendKeyToClient:2300: sending key to passthrough-capable client: id=17 pid=2564 prio=HIGHEST_PRIORITY_OBSERVER: TimeStamp=1752497438.950153 : keyType=EV_KEY : keyCode=[KEY_FASTFORWARD] : state=down
Jul 14 12:50:38.950978 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:sendKeyToClient:2300: sending key to passthrough-capable client: id=5 pid=1231 prio=TIMEOUT_MANAGER_PRIORITY: TimeStamp=1752497438.950153 : keyType=EV_KEY : keyCode=[KEY_FASTFORWARD] : state=down
Jul 14 12:50:38.951094 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:sendKeyToClient:2300: sending key to passthrough-capable client: id=22 pid=2440 prio=USAGE_STATS_PRIORITY: TimeStamp=1752497438.950153 : keyType=EV_KEY : keyCode=[KEY_FASTFORWARD] : state=down
Jul 14 12:50:38.951206 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:sendKeyToClient:2300: sending key to passthrough-capable client: id=19 pid=2008 prio=PUFFIN_OBSERVER_PRIORITY: TimeStamp=1752497438.950153 : keyType=EV_KEY : keyCode=[KEY_FASTFORWARD] : state=down
Jul 14 12:50:38.951306 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:sendKeyEvent:2389: id 65 is registered for key event device injection intercept, injecting [KEY_FASTFORWARD] to the original input device
Jul 14 12:50:38.951508 firestick-3193544e8fbc4619 inputd[1702]: I Inputd:~~~~inject_ke~~y:385: Input event successfully written to udev: TimeStamp=1752497438.950153 : keyType=EV_KEY : keyCode=[KEY_FASTFORWARD] : state=down
应用的确认日志
Jul 14 12:50:38.951859 firestick-3193544e8fbc4619 layer.androidtv[22766]: I GWSI_LOG:KB key:XF86AudioForward state:1 evtId:42
Jul 14 12:50:39.211834 firestick-3193544e8fbc4619 layer.androidtv[22766]: I GWSI_LOG:KB key:XF86AudioForward state:0 evtId:43
当应用的确认日志确认接收了来自远程的输入,但预期的操作仍未发生时,这可能表明存在应用端问题。应用已接收但未能正确处理这些关键事件。此外,如果应用已实现Vega媒体控制 (KMC),则VMC处理程序日志可以提供进一步的确认 - 如果应用未正确实现所需的KMC方法,它将记录每次按下按钮的“未定义按键事件”。
调用KMC时,如果alexa正在处理与暂停/播放/快进/快退相关的内容,KSM (VegaSpeechModule) 必须确认才能将信息传递给KMC。
KMC按钮事件未定义日志
Jul 11 09:29:20.821184 firestick-82bf81af994b24a7 local0.info layer.androidtv[10448]: 20 I Volta:[KeplerScript-JavaScript] mitxp[KIKAPLAYER][KMC-handler] - handlePlayPause (undefined)
Jul 11 09:29:10.117873 firestick-82bf81af994b24a7 local0.info layer.androidtv[10448]: 20 I Volta:[KeplerScript-JavaScript] mitxp[KIKAPLAYER][KMC-handler] - handleRewind (undefined)
Jul 11 09:29:10.663667 firestick-82bf81af994b24a7 local0.info layer.androidtv[10448]: 20 I Volta:[KeplerScript-JavaScript] mitxp[KIKAPLAYER][KMC-handler] - handleFastForward (undefined)
导航不起作用
这与上面提到的媒体控制按钮问题相同。调查应侧重于两个方面:验证遥控器的按键事件是否正确到达应用,以及确认应用是否成功确认这些信号。此系统检查有助于确定通信链中断的位置。虽然无权访问输入日志,但应用开发者可以看到应用对按钮事件的确认。如果应用确认了按钮事件,则很可能已收到来自遥控器的导航事件,应在应用端进行第一级分类,以检查应用实现中是否存在任何问题。
VoiceView不能正常工作
如果VoiceView不能正常工作且未读取用户报告值,则应当查看ucc树,看看标签上是否有可供阅读的无障碍功能描述。Vega脚本和Webview应用的链接如下
用户界面裁剪/用户界面焦点问题
因为应用控制用户界面 (UI) 元素的呈现,UI裁剪问题通常是与应用相关的问题。这些问题要么是组件被截断,要么是选项卡、菜单或子菜单中有空白字段。应用团队必须进行调查,以检查UI对象的呈现和布局实现。由于这些是与UI焦点相关的问题,因此操作系统日志通常不会包含有关这些问题的相关信息。
音频相关问题
音频丢失/重叠问题
如果应用尝试在不获取音频焦点的情况下写入音频,则应用会返回“Would block”(将进行阻止)错误。这需要从应用的角度对它们未能获得所需焦点会话的原因进行分类:
E AudioStream_VNTK:writeBuffer:180 failed Would Block
音频泄漏问题
在这种情况下,应用在Paused焦点状态下写入失败后会进入不良状态。例如,当Alexa中断后无法恢复播放并停留在加载微调器屏幕上时,可能会发生这种情况。
audioFocus Analysis
/// ABP获取媒体音频焦点
Jan 03 06:31:32.736009 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioControlService: requestAudioFocus(): pid=11411, sessionId=44
Jan 03 06:31:32.736033 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusStack: requestAudioFocus(): pid=11411, sessionId=44, life=2, request=1, flag=2, type=media, usage=media
Jan 03 06:31:32.736711 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusRecordState: handleAudioFocusGained(): pid 11411 session 44 moving from state [init] to [granted]
/// 按下了麦克风按钮
Jan 03 06:31:49.516182 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[12d] VegaBluetoothKeyEventObserver:startSconeMicStreaming::scone mic button pressed
/// PuffinApp获得语音识别焦点,ABP的媒体焦点将暂停
Jan 03 06:31:49.555699 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioControlService: requestAudioFocus(): pid=1565, sessionId=11
Jan 03 06:31:49.555723 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusStack: requestAudioFocus(): pid=1565, sessionId=11, life=0, request=0, flag=0, type=voice recognition, usage=voice recognition
/// ABP媒体焦点已暂停
Jan 03 06:31:49.556032 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusRecordState: handleAudioFocusLost(): pid 11411 session 44 moving from state [paused] to [paused]
/// PuffinApp语音识别焦点正在转移
Jan 03 06:31:49.555045 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[e:4b] AudioFocusIntegration:acquireFocus:focusRequestId=Dialog
Jan 03 06:31:49.607146 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusRecordState: handleAudioFocusGained(): pid 1565 session 11 moving from state [init] to [granted]
Jan 03 06:31:49.608561 firestick-74357a7ea4ea1145 PuffinApp[1565]: 2875 I AudioManagerAipc: dispatchAudioFocusEventCb(): Dispatching audio focus listener event sessionId=11, event=0
Jan 03 06:31:49.608585 firestick-74357a7ea4ea1145 PuffinApp[1565]: 2875 W AudioManagerBase: onAudioFocusResumed(), no handler with focusSessionId 11 is registered before
/// ABP的媒体代码已收到焦点暂停
Jan 03 06:31:49.607683 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPlayerAudioFocusObserver.cpp(103) audioFocusEventObserver Alert: onAudioPause received
Jan 03 06:31:49.607867 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPlayerAudioFocusObserver.cpp(105) audioFocusEventObserver Alert: 音频焦点暂时暂停,已向应用发送事件
Jan 03 06:31:49.608230 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPipelineObserverImpl.cpp(132) operator() AudioFocus Paused.
/// PuffinApp使用其焦点
Jan 03 06:31:49.608656 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[dd] AudioFocusIntegration:onAudioFocusGranted:sessionId=11
Jan 03 06:31:49.609276 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[dd] AudioFocusIntegration:onAudioFocusGranted:focusgrantresponsetime=53
Jan 03 06:31:49.609820 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[e:4] AudioFocusIntegration:executeOnFocusAcquire::acquired channel:channelName=Dialog,focusRequestId=Dialog,sessionId=11
/// 松开麦克风按钮
Jan 03 06:31:51.563061 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[12d] VegaBluetoothKeyEventObserver:stopSconeMicStreaming::scone mic button released or cancelled by other key press
/// ABP媒体正在尝试在媒体焦点暂停状态下写入音频,正如预期那样,它会失败并显示“Would block”,这不是系统音频问题
Jan 03 06:31:52.645487 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: E AudioStream_VNTK:writeBuffer:180 failed Would Block
Jan 03 06:31:52.665143 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: E AudioStream_VNTK:writeBuffer:180 failed Would Block
/// 现在PuffinApp正在释放语音识别焦点
Jan 03 06:31:53.131161 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[e:4b] AudioFocusIntegration:onFocusRelease:focusRequestId=Dialog
Jan 03 06:31:53.131504 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioControlService: releaseAudioFocus(): pid=1565, sessionId=11
Jan 03 06:31:53.131524 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusStack: releaseAudioFocus(): pid=1565, sessionId=11
Jan 03 06:31:53.131558 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusRecordState: handleAudioFocusReleased(): pid 1565 session 11 moving from state [granted] to [released]
/// ABP媒体焦点现已在此处恢复
Jan 03 06:31:53.131889 firestick-74357a7ea4ea1145 mixer[841]: 12236 I AudioFocusRecordState: handleAudioFocusGained(): pid 11411 session 44 moving from state [paused] to [granted]
Jan 03 06:31:53.132524 firestick-74357a7ea4ea1145 PuffinApp[1565]: I PuffinApp:[254] AudioFocusIntegration:onAudioFocusReleased:sessionId=11
Jan 03 06:31:53.132438 firestick-74357a7ea4ea1145 PuffinApp[1565]: 13562 I AudioManagerAipc: dispatchAudioFocusEventCb(): Dispatching audio focus listener event sessionId=11, event=1
Jan 03 06:31:53.132461 firestick-74357a7ea4ea1145 PuffinApp[1565]: 13562 W AudioManagerBase: onAudioFocusStopped(), no handler with focusSessionId 11 is registered before
// ABP媒体代码表明恢复焦点的接收,现在可以成功再次播放音频
Jan 03 06:31:53.132662 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPlayerAudioFocusObserver.cpp(83) audioFocusEventObserver Alert: onAudioGranted received
Jan 03 06:31:53.132705 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPlayerAudioFocusObserver.cpp(85) audioFocusEventObserver Alert: 已授予音频焦点,已向应用发送事件
Jan 03 06:31:53.132796 firestick-74357a7ea4ea1145 com.abp.firetv[11411]: W MEDIA_PLAYERV2:MediaPipelineObserverImpl.cpp(140) operator() AudioFocus Granted.
///// 但是ABP现在无法播放写入音频,可能是在Paused焦点状态下写入失败后已进入不良状态,应用开发者应该进一步调查这个问题!!!
媒体播放不能正常运行
遇到媒体播放问题时,要区分操作系统级问题和应用特定问题,需要系统调查。一种关键的诊断方法是测试多个应用的播放情况 - 如果问题在各种媒体应用中仍然存在,则可能表示存在操作系统层面或硬件问题,而单个应用的问题通常源于应用特定的原因。不同媒体格式的行为也可以说明问题;如果所有格式都无法播放,则表明存在操作系统或驱动程序问题,而特定格式的问题通常表明存在应用编解码器或兼容性限制。
系统音频行为提供了另一个关键的诊断指标。如果音频正常运行但应用中的媒体播放失败,这通常表示应用出现问题。相反,如果所有音频(包括系统声音)都受到影响,则问题可能出在操作系统或硬件层面。问题的发生时间也可以提供信息 - 操作系统更新后出现的问题通常表明存在系统层面的变化,而与应用更新同时出现的问题则表明存在应用特定的原因。
播放冻结
在调查媒体播放冻结问题时,一些关键指标有助于确定问题是源于操作系统还是应用层面。一个主要指标是CPU和内存使用率 - 如果系统在所有进程中表现出较高的CPU利用率或冻结期间显著的内存压力,这通常表明存在操作系统层面的资源限制。相反,如果只有媒体应用显示资源消耗过多,则问题可能出在应用中。冻结的频率和模式也提供了宝贵的见解 - 定期发生的间歇性冻结通常表示应用中存在缓冲或内存管理问题,而同时影响多个应用的全系统卡顿或冻结通常表示存在操作系统层面的问题。
冻结期间的应用行为提供额外的诊断线索。如果应用在冻结期间完全没有响应,而其他系统功能仍能正常运行,则表明存在应用特定的问题,例如死锁或线程管理不善。但是,如果在媒体播放期间整个系统变得缓慢或没有响应,这通常表示操作系统层面的资源限制或驱动程序问题。冻结与特定操作之间的关系也可以说明问题 - 如果在特定操作(例如搜索或更改质量设置)期间持续出现冻结,则表明存在应用层面的处理问题。同时,若有与系统事件(例如后台进程启动或系统资源被重新分配)同时发生的冻结,通常表示存在操作系统层面的冲突。
WebView特定问题
WebView异常未显示在日志中
onError、onHttpError和onSslError将捕获WebView的一些连接错误,但不会显示console.log输出。为此,您需要使用vda forward tcp:9229 tcp:9229进行端口转发,然后使用chrome://inspect/#devices连接到设备。在这里,可以使用Chrome作为调试工具,包括在控制台选项卡中查看console.logs。
未找到WebView本地HTML资产
这是一个常见问题,可能有两个原因。向/assets/*添加本地文件时,调试快速刷新和“运行”按钮不会上传资产文件夹中的更改。每次对本地html资产进行更改时,都需要在运行之前进行重建。您也可以删除构建文件夹,然后重建,以确保新的html文件存在。还要确保您的source.uri指向file:///pkg/assets/*并且该文件位于项目根目录的/asset目录中(而不是/src目录中)
WebView菜单按钮不起作用
启用allowsDefaultMediaControl属性时,不会捕获菜单按钮。Vega脚本包装器应用需要使用预期的命令将JavaScript注入WebView参考。
Last updated: 2025年10月6日

