2012-11-20 5 views
8

In meinem Android logcat log warten, ich sehe:Warum android behandelt eine App in ANR, wenn es in der Looper ist

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

Und dann, wenn ich /data/anr/traces.txt gehe, sehe ich

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) 

Meine Frage ist, warum android denkt, dass die App in ANR ist, wenn der Stack-Trace den Haupt-Thread in Looper wartet auf Nachricht zeigt? Das kommt mir normal vor. Ich verstehe Android zeigt ANR, wenn der Hauptthread etwas herunterlädt/eine lange Operation macht. Aber es scheint normal, dass es auf eine Nachricht wartet. Bitte klau mich, wenn ich falsch liege.

Antwort

2

Ich habe diesen interessanten Bug-Report gefunden:

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

Kurze Zusammenfassung ist, dass es ein Fehler in dem NDK-Wrapper-Code zu sein scheint, was bedeutet, dass Ereignisse in aus mehreren Quellen kommen eine ANR verursachen können. Das passt genau zu meinem Anwendungsfall --- Ich habe eine NDK-App, deren Arbeit in Hintergrundthreads und einem Gamepad passiert, und die ANR, die ich bekommen habe, entspricht genau der, die du beschrieben hast und der im Fehlerbericht.

Ist das Ihrer Einrichtung ähnlich?

Update: weitere Informationen: http://ps3computing.blogspot.co.uk/2012/12/anr-application-not-responding.html

Nachdem das Update auf seinem Blog beschrieben angewandt hat, scheint ich nicht in der Lage zu sein, die ANR manifestiert wieder zu machen. Das heißt aber nicht, dass es weg ist ...

Verwandte Themen