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

问题描述 投票:6回答:4

你能帮我解决这个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.access$700 (WindowAndroid.java:134)
  at org.chromium.ui.base.WindowAndroid$1.onVSync$5166USJ75THMGSJFDLKNAR9FELKIULIJF5N66JBFDPKN8RRI7D52ILG_0 (WindowAndroid.java:16)
  at org.chromium.ui.VSyncMonitor$1.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)
android android-anr-dialog
4个回答
6
投票

“ANR”代表“应用程序无响应”。这意味着您的应用已为用户锁定。通常有两个原因中的一个:

  • 你有一个僵局
  • 你在UI线程上做了一些缓慢的操作,这意味着你的UI没有响应

在这种情况下,我们看到堆栈跟踪的顶部位于“org.chromium.ui.base.WindowAndroid.nativeOnVSync”中。了解“铬”是为谷歌浏览器提供支持的开源项目是有帮助的。这意味着您可以查看源代码。

谷歌搜索github上的“nativeOnVysnc”找到了java source code

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


1
投票

你可以做的事情很少:

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

1
投票

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

1. Chromium bug

以前版本的Chrome有一个错误,有时不会释放VSync侦听器。但是,在最新版本的chrome中,似乎已经修复了这个bug。

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

2. Admob - long holding UnifiedNativeAdView

如果您的项目包含AdMob原生广告,则可能是原因。似乎UnifiedNativeAdView在内部使用VSync,如果你不调用destroy(),VSync监听器仍然存在并且泄漏,我想。


0
投票

一周前我遇到了同样的问题。我无法在任何地方找到答案。对我的ANR分析尚不清楚。结果,事实证明这是我的错 - 在onResume()中我使用了recreate()if(camera == null)。当测试一切都没问题,并且在第一次安装之后,有一个对相机的许可请求,并且活动重新启动到无穷大。编辑代码后,此错误减少到几乎为零。您必须在代码中搜索错误。

© www.soinside.com 2019 - 2024. All rights reserved.