Android ANR 怎么查?从 traces 到主线程治理

问题场景:App 在低端机上偶尔弹出"应用无响应",用户只能等待或关闭,留存明显受损,但本地难以复现。

诊断排查:抓 /data/anr/traces.txt(Android 11+ 用 adb bugreport),定位主线程堆栈,看卡在哪一行;同时用 systrace/perfetto 看主线程是否被 Binder、IO 或 GC 抢占。常见元凶是主线程做了网络、数据库或大量序列化。

分步解决:1)把耗时操作全部搬出主线程,数据库用 Room 的异步或协程;2)懒加载和分页,首页不要一次性 inflate 几百个 View;3)第三方 SDK 初始化延后到空闲或子线程;4)用 StrictMode 在开发期暴露主线程磁盘/网络访问。

注意事项:BroadcastReceiver 的 onReceive 也要快,否则前台 ANR;WebView 初始化极慢,提前预热;不要为了去 ANR 把一切都丢线程池却忘了结果回主线程更新 UI。