9

私のandroid logcatログには、次のように表示されます。

01-02 02:01:46.523 E/ActivityManager(  459): ANR in com.android.phone (com.android.phone/.InCallScreen)

そして、/data/anr/traces.txt にアクセスすると、

Cmd line: com.android.phone

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x410f7508 self=0x40eeeb68
  | sysTid=649 nice=0 sched=0/0 cgrp=apps handle=1075429168
  | schedstat=( 0 0 0 ) utm=1361 stm=314 core=1
  #00  pc 0000dac0  /system/lib/libc.so (epoll_wait+12)
  #01  pc 00014899  /system/lib/libutils.so (android::Looper::pollInner(int)+96)
  #02  pc 00014b01  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+104)
  #03  pc 00063aeb  /system/lib/libandroid_runtime.so (android::NativeMessageQueue::pollOnce(_JNIEnv*, int)+22)
  #04  pc 0001df30  /system/lib/libdvm.so (dvmPlatformInvoke+112)
  #05  pc 0004d1fb  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+394)
  #06  pc 00038f4d  /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+8)
  #07  pc 00000214  /dev/ashmem/dalvik-jit-code-cache (deleted)
  at android.os.MessageQueue.nativePollOnce(Native Method)
  at android.os.MessageQueue.next(MessageQueue.java:125)
  at android.os.Looper.loop(Looper.java:124)
  at android.app.ActivityThread.main(ActivityThread.java:4921)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
  at dalvik.system.NativeStart.main(Native Method)

私の質問は、スタック トレースが Looper のメイン スレッドがメッセージを待っていることを示しているときに、Android がアプリが ANR にあると考えるのはなぜですか? それは私には普通に思えます。メインスレッドが何かをダウンロードしている/長い操作を行っているときに、AndroidがANRを表示することを理解しています。しかし、メッセージを待っているのは普通のようです。間違っている場合は訂正してください。

4

1 に答える 1

2

この興味深いバグレポートを見つけました:

http://code.google.com/p/android/issues/detail?id=41755

簡単に言うと、NDK ラッパー コードにバグがあるようです。つまり、複数のソースからのイベントが ANR を引き起こす可能性があります。これは私のユースケースと正確に一致します --- バックグラウンドスレッドとゲームパッドで作業を行う NDK アプリがあり、取得している ANR は、あなたが説明したものとバグレポートのものと正確に一致します。

これはあなたの設定に似ていますか?

更新:詳細: http://ps3computing.blogspot.co.uk/2012/12/anr-application-not-responding.html

彼のブログに記載されている修正を適用した後、ANR を再度マニフェストにできないようです。無くなった訳ではありませんが…。

于 2013-01-18T16:39:54.283 に答える