Android ANR项目实战:Reason: Broadcast { act=android.intent.action.TIME_TICK}

同事最近出现一个ANR,又没Trace文件,不知道如何分析,报错信息如下:

1.报错信息

12-23 复制代码
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 事件类型: 
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 发生时间: 2025-12-23 15:32:05.537
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 调用耗时: 5001ms
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: === 系统资源状态 ===
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 进程内存: 126MB (PSS)
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: Java堆内存: 39MB
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: Native堆内存: 0MB
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 系统可用内存: 15224MB / 16385MB
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: CPU使用率: 0.0%
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: Binder状态: 统计不可用
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: === 性能分析 ===
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 问题描述: 获取无障碍根节点耗时5001ms,超过正常阈值
12-23 15:32:05.537  1539  1833 W VoiceAccessibilityPerformance: 建议: 检查系统负载,优化无障碍服务逻辑
yaml 复制代码
12-23 15:32:17.270   254   268 E ActivityManager: ANR in com.tencent.carecolauncher
12-23 15:32:17.270   254   268 E ActivityManager: PID: 43162
12-23 15:32:17.270   254   268 E ActivityManager: Reason: Broadcast of Intent { act=android.intent.action.TIME_TICK flg=0x50200014 (has extras) }
12-23 15:32:17.270   254   268 E ActivityManager: Load: 169.8 / 144.63 / 112.13
12-23 15:32:17.270   254   268 E ActivityManager: CPU usage from 0ms to 7239ms later (2025-12-23 15:32:10.006 to 2025-12-23 15:32:17.245):
12-23 15:32:17.270   254   268 E ActivityManager:   19% 44555/gzip: 12% user + 6% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   16% 100/surfaceflinger: 8.2% user + 8.4% kernel / faults: 164 minor
12-23 15:32:17.270   254   268 E ActivityManager:   14% 43162/com.tencent.carecolauncher: 10% user + 4.5% kernel / faults: 8324 minor 3 major
12-23 15:32:17.270   254   268 E ActivityManager:   9.3% 254/system_server: 3% user + 6.3% kernel / faults: 4072 minor
12-23 15:32:17.270   254   268 E ActivityManager:   8.8% 2071/com.autonavi.amapauto: 4.9% user + 3.8% kernel / faults: 4576 minor 4 major
12-23 15:32:17.270   254   268 E ActivityManager:   6.7% 44554/tar_custom: 0.2% user + 6.4% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   0.3% 43186/com.android.systemui: 0.2% user + 0% kernel / faults: 2327 minor
12-23 15:32:17.270   254   268 E ActivityManager:   1.3% 1539/com.tencent.cloudsmartvoice: 0.9% user + 0.4% kernel / faults: 6130 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.8% 1100/com.android.phone: 0.1% user + 0.6% kernel / faults: 680 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 1560/com.tencent.netserver: 0% user + 0% kernel / faults: 2003 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 1081/com.tencent.datatrackclient: 0% user + 0% kernel / faults: 785 minor 1 major
12-23 15:32:17.270   254   268 E ActivityManager:   0.5% 1060/com.tencent.datatrackservice: 0.2% user + 0.2% kernel / faults: 730 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.2% 1//init: 0% user + 0.2% kernel / faults: 173 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.2% 46/logd: 0% user + 0.2% kernel / faults: 18 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 131/tombstoned: 0% user + 0% kernel / faults: 7 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.2% 137/logcat: 0% user + 0.2% kernel / faults: 1 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 47/servicemanager: 0% user + 0.1% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   0% 48/hwservicemanager: 0% user + 0% kernel / faults: 60 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 78/netd: 0% user + 0.1% kernel / faults: 45 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 79/zygote64: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 107/cameraserver: 0% user + 0.1% kernel / faults: 50 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 120/media.extractor: 0% user + 0% kernel / faults: 19 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 122/mediaserver: 0% user + 0% kernel / faults: 24 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0% 1440/com.baidu.input_huawei: 0% user + 0% kernel / faults: 24 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 1938/com.tencent.settings: 0% user + 0.1% kernel / faults: 17 minor
12-23 15:32:17.270   254   268 E ActivityManager:   0.1% 2316/com.autonavi.amapauto:locationservice: 0% user + 0.1% kernel / faults: 13 minor
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 44854/audioserver: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 44856/CloudAppEngine: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 44989/media.codec: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 45004/sh: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 45005/sh: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager:  +0% 45006/tee: 0% user + 0% kernel
12-23 15:32:17.270   254   268 E ActivityManager: 2% TOTAL: 1.6% user + 0.4% kernel
12-23 15:32:17.270   254   268 E ActivityManager: CPU usage from 26ms to 260ms later (2025-12-23 15:32:10.032 to 2025-12-23 15:32:10.266):
12-23 15:32:17.270   254   268 E ActivityManager:   16% 254/system_server: 4.1% user + 12% kernel / faults: 274 minor
12-23 15:32:17.270   254   268 E ActivityManager:     16% 268/ActivityManager: 4.1% user + 12% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   8.3% 100/surfaceflinger: 4.1% user + 4.1% kernel
12-23 15:32:17.270   254   268 E ActivityManager:     12% 100/surfaceflinger: 4.1% user + 8.3% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   8.8% 44555/gzip: 4.4% user + 4.4% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   4.2% 1659/CloudAppEngine: 0% user + 4.2% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   4.2% 2071/com.autonavi.amapauto: 0% user + 4.2% kernel / faults: 3 minor
12-23 15:32:17.270   254   268 E ActivityManager:     4.2% 2262/gnet_proc: 0% user + 4.2% kernel
12-23 15:32:17.270   254   268 E ActivityManager:   4.4% 44554/tar_custom: 0% user + 4.4% kernel
12-23 15:32:17.270   254   268 E ActivityManager: 0.9% TOTAL: 0.6% user + 0.2% kernel
12-23 15:32:17.294   254   270 I ActivityManager: Start proc 45028:

2.问题概述:

ANR原因: 处理广播 android.intent.action.TIME_TICK 时超时

3.关键问题分析:

1. 系统负载极高

makefile 复制代码
Load: 169.8 / 144.63 / 112.13
  • 系统1分钟平均负载高达169.8(远超正常值)
  • 这表明系统极度繁忙,CPU资源严重不足

2. 主要CPU占用者

  • gzip进程 (PID: 44555): 19% CPU
  • surfaceflinger: 16% CPU
  • 问题应用本身: 14% CPU(且有大量缺页中断)
  • system_server: 9.3% CPU
  • 高德地图车机版: 8.8% CPU

三个数字的含义:

格式: 1分钟平均 / 5分钟平均 / 15分钟平均

  • 169.8 - 过去1分钟的平均负载
  • 144.63 - 过去5分钟的平均负载
  • 112.13 - 过去15分钟的平均负载

如何理解这些数值:

基准对比:

通常与CPU核心数进行比较:

  • 负载值 < CPU核心数:系统相对空闲
  • 负载值 ≈ CPU核心数:系统满负荷运行
  • 负载值 > CPU核心数:系统过载,有进程在等待CPU

车机系统分析:

假设这个车机系统有8个CPU核心

  • 正常情况:负载应该在8以下
  • 实际负载:169.8(远超CPU核心数)

用命令查看: adb shell uptime 正常情况下的负载参数:

10:08:11 up 100 days, 15:26, 0 users, load average: 0.47, 0.42, 0.42

具体含义:

为什么这么高?

  1. 大量进程在运行队列中等待CPU

    • 系统中有平均169个进程在等待执行
    • 包括:可运行状态(R状态)和不可中断睡眠状态(D状态)
  2. 系统严重过载

    • CPU资源极度匮乏
    • 进程需要长时间等待才能获得CPU时间片

在ANR问题中的意义:

直接导致ANR的原因:

  1. Launcher应用无法及时获得CPU时间片

    • 系统中有169个进程在排队
    • Launcher的广播接收器需要等待很长时间才能执行
  2. TIME_TICK广播处理延迟

    ini 复制代码
    Reason: Broadcast of Intent { act=android.intent.action.TIME_TICK }
    • TIME_TICK广播每分钟发送一次
    • 由于系统负载高,Launcher可能延迟了几秒甚至几十秒才处理到这个广播
    • Android系统检测到广播处理超时(通常5秒),触发ANR

代码里面没用注册这个广播:

TextClock

csharp 复制代码
public void afterTextChanged(Editable s) {
    LogUtil.d(TAG, "afterTextChanged s: " + s); // ← 这行每分钟都打日志!
    if ("00:00".equals(s.toString()) || ...) {
        updateDate();
    }
}

验证方法:看 traces.txt 主线程堆栈

如果你能拿到 /data/anr/traces.txt,搜索 main 线程,大概率会看到:

swift 复制代码
"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x74b0a8a0 self=0xb400007c...
  at android.os.BinderProxy.transactNative(Native method)
  at android.os.BinderProxy.transact(Binder.java:1133)
  at android.app.IActivityManager$Stub$Proxy.broadcastIntent(...)
  ...
  at android.widget.TextClock$1.onReceive(TextClock.java:123)
  at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1550)
  ...
  at com.gwm.presetcard.vehicle.view.VehicleSettingsCardView$1.afterTextChanged(VehicleSettingsCardView.java:XX)

→ 明确显示卡在 TextClock 的广播接收 + 你的 TextWatcher

解决方案:

替换为 TextView + Handler 是最稳妥方案,彻底绕过系统广播机制。

private void startClock() { mClockUpdater.run(); } private final Runnable mClockUpdater = new Runnable() { @Override public void run() { mVehicleSettingsClock.setText(new SimpleDateFormat("HH:mm").format(new Date())); long delay = 60_000 - (System.currentTimeMillis() % 60_000); mHandler.postDelayed(this, delay); } };

3. 具体问题表现

yaml 复制代码
14% 43162/com.tencent.carecolauncher: 10% user + 4.5% kernel / faults: 8324 minor 3 major
  • 应用本身占用14% CPU
  • 8324次minor faults和3次major faults:表明应用在进行大量内存分配/访问操作
  • 处理TIME_TICK广播时响应超时

CPU使用部分:

  • 14% - 该进程占总CPU时间的14%
  • 10% user - 在用户态运行占10%(执行应用自己的代码)
  • 4.5% kernel - 在内核态运行占4.5%(执行系统调用、内核服务)

缺页中断部分(关键线索):

  • 8324 minor faults - 8324次次缺页中断
  • 3 major faults - 3次主缺页中断

这说明了什么:

1. 应用正在大量分配/访问内存

  • Minor faults(次缺页中断) :当进程访问的页面在物理内存中但未映射到进程地址空间时发生

    • 常见于:堆内存分配、文件映射、动态链接库加载、写时复制等
    • 8324次 在7秒多的时间内,表明应用在进行非常频繁的内存操作

2. 可能的内存密集型操作

应用可能正在:

  • 创建大量对象(频繁的垃圾回收)
  • 处理大尺寸图片/资源
  • 加载大量数据到内存
  • 进行文件映射操作
  • 执行大量的UI布局/渲染

3. Major faults的严重性

  • Major faults(主缺页中断) :需要从磁盘读取数据到内存
  • 通常涉及:从存储设备读取文件、内存交换(swap)等
  • 3次major faults虽然不多,但每次都会导致显著延迟(毫秒级阻塞)

4. ANR抓取错误了,ANR 日志中的"Reason"是误导性的

在极端高负载(Load > 160)情况下:

  • 系统可能在 发送 TIME_TICK 时发现你的应用主线程无响应
  • 即使你根本没注册,AMS(ActivityManagerService)也可能把"最近一次尝试发送的广播"记为 ANR 原因
  • 实际根本原因是:你的主线程早已卡死(比如死锁、I/O 阻塞),恰好在 TIME_TICK 到来时被检测到

💡 类比:一个人已经昏迷 5 分钟,救护车(TIME_TICK)来了发现他没反应,就记录"因救护车到来时无反应",但真正病因是 earlier 的脑梗。

可能的原因:

主要原因:

  1. 系统级资源竞争

    • gzip进程占用大量CPU(可能是系统压缩/备份操作)
    • 多个车机应用同时高CPU使用,导致Launcher无法及时响应
  2. Launcher应用问题

    • TIME_TICK广播每分钟一次,可能触发Launcher的时钟更新等操作
    • 广播接收器中可能执行了耗时操作
    • 应用可能在进行大量UI渲染或数据处理
  3. 内存压力

    • 大量缺页中断表明内存访问频繁,可能存在内存泄漏或频繁GC

3.后面补充了Trace文件,进一步确认了

less 复制代码
"RenderThread" daemon prio=7 tid=26 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x130c0818 self=0x3ffedf5f7400
  | sysTid=55663 nice=-4 cgrp=default sched=0/0 handle=0x3ffedcf054f0
  | state=S schedstat=( 31569136200 4107637200 156698 ) utm=2105 stm=1051 core=9 HZ=100
  | stack=0x3ffedce0a000-0x3ffedce0c000 stackSize=1009KB
  | held mutexes=
  kernel: (couldn't read /proc/self/task/55663/stack)
  native: #00 pc 000000000006e0d8  /system/lib64/libc.so (__ioctl+4)
  native: #01 pc 0000000000029058  /system/lib64/libc.so (ioctl+136)
  native: #02 pc 0000000000004dd8  /system/vendor/lib64/libdrm.so (drmIoctl+28)
  native: #03 pc 0000000000004920  /system/vendor/lib64/libdrm_amdgpu.so (amdgpu_cs_query_fence_status+248)
  native: #04 pc 00000000002ba4cc  /system/vendor/lib64/dri/gallium_dri.so (amdgpu_fence_wait+288)
  native: #05 pc 000000000025c8f0  /system/vendor/lib64/dri/gallium_dri.so (si_fence_finish+516)
  native: #06 pc 00000000002c7d68  /system/vendor/lib64/dri/gallium_dri.so (dri_flush+300)
  native: #07 pc 0000000000016c84  /system/vendor/lib64/egl/libGLES_mesa.so (droid_swap_buffers+192)
  native: #08 pc 00000000000149bc  /system/vendor/lib64/egl/libGLES_mesa.so (dri2_swap_buffers_with_damage+276)
  native: #09 pc 000000000000c6a0  /system/vendor/lib64/egl/libGLES_mesa.so (_eglSwapBuffersWithDamageCommon+248)
  native: #10 pc 00000000000175f4  /system/lib64/libEGL.so (eglSwapBuffersWithDamageKHR+412)
  native: #11 pc 000000000047f6d8  /system/lib64/libhwui.so (android::uirenderer::renderthread::EglManager::swapBuffers(android::uirenderer::renderthread::Frame const&, SkRect const&)+124)
  native: #12 pc 0000000000478cac  /system/lib64/libhwui.so (android::uirenderer::skiapipeline::SkiaOpenGLPipeline::swapBuffers(android::uirenderer::renderthread::Frame const&, bool, SkRect const&, android::uirenderer::FrameInfo*, bool*)+88)
  native: #13 pc 0000000000106da4  /system/lib64/libhwui.so (android::uirenderer::renderthread::CanvasContext::draw()+296)
  native: #14 pc 000000000047e124  /system/lib64/libhwui.so (_ZNSt3__110__function6__funcIZN7android10uirenderer12renderthread13DrawFrameTask11postAndWaitEvE3$_0NS_9allocatorIS6_EEFvvEEclEv$c303f2d2360db58ed70a2d0ac7ed911b+644)
  native: #15 pc 0000000000434ab4  /system/lib64/libhwui.so (android::uirenderer::WorkQueue::process()+168)
  native: #16 pc 0000000000113cd0  /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+240)
  native: #17 pc 000000000000fa8c  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+280)
  native: #18 pc 00000000000818c8  /system/lib64/libc.so (__pthread_start(void*)+36)
  native: #19 pc 0000000000023400  /system/lib64/libc.so (__start_thread+68)
  (no managed stack frames)

这是 ANR的完整线程转储(Thread Dump) ,它提供了ANR发生时应用内部所有线程的详细状态。以下是关键问题的深入分析:

关键发现:

根本原因

less 复制代码
"main" prio=5 tid=1 Native
  native: #00 pc 000000000001f02c  /system/lib64/libc.so (syscall+28)
  native: #01 pc 0000000000022104  /system/lib64/libc.so (__futex_wait_ex)
  native: #02 pc 0000000000080e0c  /system/lib64/libc.so (pthread_cond_wait+60)
  native: #03 pc 000000000047ddfc  /system/lib64/libhwui.so (android::uirenderer::renderthread::DrawFrameTask::postAndWait()+260)
  
  at android.view.ThreadedRenderer.nSyncAndDrawFrame(Native method)
  at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:823)
  at android.view.ViewRootImpl.draw(ViewRootImpl.java:3318)
  ...

核心问题: 主线程在等待渲染线程完成绘制(DrawFrameTask::postAndWait()),但渲染线程被阻塞。

2. 渲染线程(RenderThread)被阻塞

yaml 复制代码
"RenderThread" daemon prio=7 tid=26 Native
  native: #00 pc 000000000006e0d8  /system/lib64/libc.so (__ioctl+4)
  native: #01 pc 0000000000029058  /system/lib64/libc.so (ioctl+136)
  native: #02 pc 0000000000004dd8  /system/vendor/lib64/libdrm.so (drmIoctl+28)
  native: #03 pc 0000000000004920  /system/vendor/lib64/libdrm_amdgpu.so (amdgpu_cs_query_fence_status+248)
  ...

关键发现: 渲染线程在等待GPU的fence状态(amdgpu_cs_query_fence_status),这表明GPU渲染过慢或被阻塞

3. 多个渲染相关线程处于等待状态

线程ID 55553-55564 都是以.carecolauncher命名的线程,它们都在等待条件变量:

text

rust 复制代码
native: #03 pc 000000000003aa34  /system/lib64/libRS_internal.so (android::renderscript::Signal::wait()+84)

这些是RenderScript计算线程,用于图形计算,它们也在等待。

问题链分析:

时间线重建:

scss 复制代码
1. TIME_TICK广播触发 → 
2. 主线程需要更新UI(可能包括TextClock更新、日期更新等) → 
3. 主线程调用ThreadedRenderer.nSyncAndDrawFrame() → 
4. 主线程等待渲染线程完成绘制(postAndWait()) → 
5. 渲染线程在GPU层面被阻塞(等待fence状态) → 
6. 多个RenderScript线程也在等待 → 
7. 主线程等待超时(5秒)→ 
8. ANR发生

GPU问题的可能原因:

  1. GPU过载:系统中有太多3D渲染任务
  2. GPU驱动程序问题:amdgpu驱动程序响应慢
  3. 显存不足:GPU显存被占满
  4. 渲染任务过重:需要渲染的UI内容太复杂

根本原因:三级阻塞导致的渲染链断裂

核心问题链:

markdown 复制代码
1. **系统级资源枯竭**(Load: 169.8)
   ↓
2. **GPU驱动层阻塞**(amdgpu_cs_query_fence_status)
   ↓  
3. **渲染线程等待**(RenderThread被阻塞)
   ↓
4. **主线程超时**(等待渲染线程完成绘制)
   ↓
5. **ANR发生**

详细分解:

1. 根本触发点:TIME_TICK广播

  • 现象:每分钟一次的TIME_TICK广播
  • 作用:触发Launcher的UI时间更新
  • 不是根本原因 ,只是触发器

2. 直接原因:GPU驱动层阻塞

ini 复制代码
"RenderThread" daemon prio=7 tid=26 Native
  native: #03 pc 0000000000004920  /system/vendor/lib64/libdrm_amdgpu.so (amdgpu_cs_query_fence_status+248)
  • 问题 :GPU驱动程序amdgpu在查询fence状态时阻塞
  • 影响:渲染线程等待GPU完成渲染命令
  • 本质:GPU硬件或驱动无法及时响应

3. 传导原因:渲染线程链式阻塞

  • 主线程 → 调用ThreadedRenderer.nSyncAndDrawFrame()
  • 主线程 → 等待渲染线程完成(DrawFrameTask::postAndWait()
  • 渲染线程 → 等待GPU的fence状态
  • 12个RenderScript线程 → 也在等待信号(Signal::wait()

4. 放大原因:系统级资源枯竭

makefile 复制代码
Load: 169.8 / 144.63 / 112.13
  • 系统有169个进程在等待CPU
  • CPU调度器无法及时调度所有进程
  • GPU调度也受影响(GPU调度依赖CPU)

5. 加剧因素:应用内存访问频繁

yaml 复制代码
faults: 8324 minor 3 major
Total GC time: 8.993s
Total GC count: 141
  • 频繁的内存分配和GC消耗CPU时间
  • 进一步加剧了CPU竞争

根本原因一句话总结:

车机GPU驱动(amdgpu)在高系统负载(Load 169.8)下无法及时处理渲染命令,导致渲染链断裂,主线程等待渲染线程超时,最终在TIME_TICK广播触发UI更新时发生ANR。

各层责任分配:

层级 责任 具体问题
硬件/驱动层 主要责任 AMD GPU驱动程序响应慢,fence查询阻塞
系统层 重要责任 系统负载极高(169.8),资源调度失效
应用层 次要责任 频繁的内存操作和GC,UI更新时机不当
广播机制 触发责任 TIME_TICK广播在错误的时间触发UI更新

4.总结:

维度 高系统负载(Load ≈ 170) 使用 TextClock
性质 系统级环境问题(外部诱因) 应用级实现问题(直接导火索)
表现 Load: 169.8 / 144.63 / 112.13 大量进程排队,CPU/I/O 资源枯竭 布局中使用 <TextClock>,代码中持有 TextClock 引用
根本机制 后台进程(如 gziptar_custom)持续占用 CPU + I/O,导致主线程调度延迟 TextClock 内部自动注册 android.intent.action.TIME_TICK 广播,每分钟在主线程响应系统广播
是否必要条件 ❌ 单独存在通常不会直接导致 ANR(但会造成卡顿) ❌ 在正常系统中完全安全
是否充分条件 ❌ 系统可能卡但不一定会 ANR ❌ 正常负载下无风险
联合效应 两者叠加 → 主线程无法在 10 秒内处理广播 → Broadcast ANR
排查方式 adb shell cat /proc/loadavg adb shell top 查看 ANR 日志中的 Load 和 CPU 分布 全局搜索 TextClock 检查布局文件是否包含 <TextClock> 确认是否在大卡片模式启用
短期修复 暂无法由应用层解决(需平台配合) 替换为 TextView + Handler 定时更新 彻底绕过系统广播,消除 ANR 风险
长期优化 ✅ 联系车机平台: - 限制 tar_custom/gzip 的 I/O 频率 - 优化后台任务调度 - 提升存储性能 ✅ 移除所有隐式广播依赖,避免使用自动注册广播的系统控件(如 TextClock, DigitalClock
风险等级 🔴 极高(影响整个系统稳定性) 🟠 中高(在高负载环境下极易触发 ANR)
相关推荐
卡奥斯开源社区官方2 小时前
技术落地里程碑:北京发放全国首批L3自动驾驶号牌,智驾商业化闭环正式打通
人工智能·机器学习·自动驾驶
温轻舟2 小时前
圣诞节雪人动态效果 | HTML页面
开发语言·前端·javascript·html·css3·温轻舟·圣诞
光锥智能2 小时前
昇思MindSpore打造HyperParallel架构,引领AI框架迈入“超节点时代”
人工智能·架构
云技纵横2 小时前
Vue 2 生产构建 CSS 压缩报错修复与深度选择器规范
前端·css·vue.js
Godspeed Zhao2 小时前
自动驾驶中的传感器技术81——Sensor Fusion(4)
人工智能·机器学习·自动驾驶
Codebee2 小时前
打破偏见!企业级AI不是玩具!Ooder全栈框架+程序员=专业业务系统神器
前端·全栈
Elastic 中国社区官方博客2 小时前
Elasticsearch:圣诞晚餐 BBQ
大数据·人工智能·elk·elasticsearch·搜索引擎·ai·全文检索
小鸡吃米…2 小时前
基于Python监督学习的人工智能:分类
人工智能·python·学习
翻斗花园岭第一爆破手2 小时前
flutter3.Container中的decoration
开发语言·前端·javascript