如何修复 /data/app/com.android.chrome-1/base.apk 上的 ANR 问题?

How to fix ANR issue on /data/app/com.android.chrome-1/base.apk?

你能帮我解决这个 ANR 问题吗?用户多次向 Google Play 管理中心报告,但我自己无法重现。非常感谢。

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x73898658 self=0xb0204400
  | sysTid=3708 nice=-4 cgrp=default sched=0/0 handle=0xb2f69534
  | state=S schedstat=( 5873509009 1942619080 10289 ) utm=484 stm=102 core=3 HZ=100
  | stack=0xbe00c000-0xbe00e000 stackSize=8MB
  | held mutexes=
  #00  pc 00000000000174d4  /system/lib/libc.so (syscall+28)
  #01  pc 0000000000046a5d  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)
  #02  pc 0000000000039bb1  /data/app/com.android.chrome-1/base.apk (???)
  at org.chromium.ui.base.WindowAndroid.nativeOnVSync (Native method)
  at org.chromium.ui.base.WindowAndroid.access0 (WindowAndroid.java:134)
  at org.chromium.ui.base.WindowAndroid.onVSync66USJ75THMGSJFDLKNAR9FELKIULIJF5N66JBFDPKN8RRI7D52ILG_0 (WindowAndroid.java:16)
  at org.chromium.ui.VSyncMonitor.doFrame (VSyncMonitor.java:22)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:872)
  at android.view.Choreographer.doCallbacks (Choreographer.java:686)
  at android.view.Choreographer.doFrame (Choreographer.java:618)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:860)
  at android.os.Handler.handleCallback (Handler.java:751)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6165)
  at java.lang.reflect.Method.invoke! (Native method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:888)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:778)

"ANR"代表"Application not responding"。这意味着您的应用已为用户锁定。通常有两个原因之一:

  • 你遇到了死锁
  • 您在 UI 线程上执行一些缓慢的操作,这意味着您的 UI 没有响应

在这种情况下,我们看到堆栈跟踪的顶部在 "org.chromium.ui.base.WindowAndroid.nativeOnVSync" 中。了解 "chromium" 是为 Google Chrome 提供支持的开源项目会很有帮助。这意味着你可以去看看源代码。

谷歌搜索 "nativeOnVysnc" github 找到 java source code

基本上看起来有些东西锁定在某些 Chrome 渲染代码中。 这有助于了解 Chromium 用于 Webkit,它用于在 Android 应用程序中呈现 webview windows。所以很可能你的应用程序中有某种 webview,它在渲染时表现不佳,但除此之外我无能为力。我会检查我的网络视图中的 javascript 内存使用情况或其他危险行为,或者查看 C++ 本机代码中的 Chromium 存储库以试图更好地了解正在发生的事情。

你能做的事情很少:

  1. 名为 ANR-WatchDog 的开源 git 项目。 您可以使用非常简单的几个步骤捕获每个 anr。 您可以定义您认为是 ANR 的秒数(例如,如果您将其设置为 0.5 秒,您可能会遇到上述 ANR。
  2. 在您的代码中搜索 Wakelocks
  3. 您正在使用 sqlite(或任何其他数据库库)吗?如果是这样,如果插入、更新、获取时间过长,我会使用 ANR-Watchdog 检查。总的来说,检查所有查询没有阻塞 ui 线程太久。

一周前我遇到了同样的问题。我无法在任何地方找到答案。我的 ANR 分析不清楚。结果发现是我的错——在onResume()中我用了recreate()if(camera == null)。测试时一切正常,在第一次安装后,有一个相机权限请求,activity 被重新启动到无穷大。编辑代码后,这个错误几乎减少到零。您必须在代码中搜索错误。

我有同样的问题。但是我可以大大减少关于这个问题的 ANR。

1。铬错误

Chrome 之前的版本有一个错误,有时不会释放 VSync 侦听器。 然而,在最新版本的 chromium 中,似乎已经修复了这个错误。

https://bugs.chromium.org/p/chromium/issues/detail?id=900557

2。 Admob - 长期持有 UnifiedNativeAdView

如果您的项目有 AdMob 原生广告,这可能是一个原因。 似乎 UnifiedNativeAdView 在内部使用 VSync,如果你不调用 destroy(),我认为 VSync 侦听器仍然存在并泄漏。