2011-03-13 3 views
1

특정 구성 요소에서 ANR을 계속 사용하는 앱이 있는데, CPU 시간을 늘리는 것이 무엇인지 파악할 수 없습니다. 최근에 나는 네 종류의 ANR, 네이티브 및 대기를 얻었습니다.ANR keyDispatchingTimedOut

DALVIK THREADS: 
"main" prio=5 tid=1 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8c0 self=0xccc8 
    | sysTid=10569 nice=0 sched=0/0 cgrp=default handle=-1345017816 
    | schedstat=(9041503981 6690216078 17225) 
    at android.view.Surface.lockCanvasNative(Native Method) 
    at android.view.Surface.lockCanvas(Surface.java:314) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:773) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:322) 
    at android.view.View.dispatchTouchEvent(View.java:3766) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

"Binder Thread #3" prio=5 tid=9 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44821de0 self=0x2b9b78 
    | sysTid=10585 nice=0 sched=0/0 cgrp=default handle=2857768 
    | schedstat=(726806597 708740243 2395) 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #2" prio=5 tid=6 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4476c5e8 self=0x13cbf8 
    | sysTid=10574 nice=0 sched=0/0 cgrp=default handle=1213280 
    | schedstat=(767669649 687500005 2512) 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #1" prio=5 tid=5 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4476b310 self=0x126f90 
    | sysTid=10573 nice=0 sched=0/0 cgrp=default handle=1208144 
    | schedstat=(749938913 622802748 2497) 
    at dalvik.system.NativeStart.run(Native Method) 

"Compiler" daemon prio=5 tid=4 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x447652a0 self=0x125b80 
    | sysTid=10572 nice=0 sched=0/0 cgrp=default handle=1251720 
    | schedstat=(999145549 669586193 5169) 
    at dalvik.system.NativeStart.run(Native Method) 

"Signal Catcher" daemon prio=5 tid=3 RUNNABLE 
    | group="system" sCount=0 dsCount=0 s=N obj=0x447651e8 self=0x121988 
    | sysTid=10571 nice=0 sched=0/0 cgrp=default handle=1251656 
    | schedstat=(16204836 16693113 8) 
    at dalvik.system.NativeStart.run(Native Method) 

"HeapWorker" daemon prio=5 tid=2 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x431a9650 self=0x1317c0 
    | sysTid=10570 nice=0 sched=0/0 cgrp=default handle=1172520 
    | schedstat=(28203003083 34572570617 10984) 
    at dalvik.system.NativeStart.run(Native Method) 

DALVIK THREADS: 
"main" prio=5 tid=1 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8c0 self=0xccc8 
    | sysTid=2428 nice=0 sched=0/0 cgrp=default handle=-1345017816 
    | schedstat=(5054412632 4232574644 11781) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x4001d950> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.Surfaceview.onTouchEvent(Surfaceview.java:319) 
    at android.view.View.dispatchTouchEvent(View.java:3766) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 

"Thread-448" prio=5 tid=16 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447e4b40 self=0x2e5960 
    | sysTid=2892 nice=0 sched=0/0 cgrp=default handle=3037856 
    | schedstat=(495635974 519531260 463) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447eeb10> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-447" prio=5 tid=15 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447fb5f0 self=0x2bd690 
    | sysTid=2890 nice=0 sched=0/0 cgrp=default handle=2873296 
    | schedstat=(636688219 727813733 545) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447fb780> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-446" prio=5 tid=14 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44823a68 self=0x2ccac0 
    | sysTid=2889 nice=0 sched=0/0 cgrp=default handle=2874496 
    | schedstat=(774780280 777496325 693) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x44786fe8> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-445" prio=5 tid=13 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447f2288 self=0x2e2a80 
    | sysTid=2888 nice=0 sched=0/0 cgrp=default handle=3026032 
    | schedstat=(831634516 815490735 696) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447f2418> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-444" prio=5 tid=12 WAIT 
    | group="main" sCount=1 dsCount=0 s=N obj=0x447c97c0 self=0x2c4910 
    | sysTid=2887 nice=0 sched=0/0 cgrp=default handle=2780792 
    | schedstat=(1249114988 1195007328 1038) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x447cd918> (a java.lang.VMThread) 
    at java.lang.Thread.parkFor(Thread.java:1535) 
    at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) 
    at sun.misc.Unsafe.park(Unsafe.java:317) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:131) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:790) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:823) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:764) 
    at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:756) 
    at com.dane.hud.Surfaceview$DrawThread.run(Surfaceview.java:776) 
    at com.dane.hud.HUD.updateWithNewLocation(HUD.java:639) 
    at com.dane.hud.HUD.access$3(HUD.java:618) 
    at com.dane.hud.HUD$updateEverythingFromGPS.run(HUD.java:573) 

"Thread-443" prio=5 tid=11 VMWAIT JIT 
    | group="main" sCount=1 dsCount=0 s=Y obj=0x4480cd28 self=0x2d27b0 
    | sysTid=2886 nice=0 sched=0/0 cgrp=default handle=2959600 
    | schedstat=(1636657703 1482391360 1374) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.addWaiter(AbstractQueuedSynchronizer.java:~562) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1153) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) 
    at android.view.Surfa... 

어떤 아이디어? 새 스레드로 작업을 옮겼습니다. 아마도 join()을 호출하지 않을 것입니다. 그 (것)들에.

도움 주셔서 감사합니다.

가 인용 : 여기에서

답변

5

: 메인 스레드가 뭔가에 너무 오래 작업이 항상 자식 스레드에서 그것을하는 것이 좋습니다 차단 될 때

http://developer.android.com/guide/practices/design/responsiveness.html

ANR은

따라서 주 스레드 에서 실행되는 모든 방법은 가능한 한 작은 작업으로 수행해야합니다 ( ). 특히 활동 은 onCreate() 및 onResume()과 같은 주요 수명주기 방법에서 가능한 한 작게 수행하여 을 설정해야합니다. 같은 네트워크 나 데이터베이스 작업, 또는 크기 조정 비트 맵과 같은 계산 비용 계산 잠재적 장기 실행 작업 (AN 비동기 요청을 통해, 또는 데이터베이스 작업의 경우 에서) 을 자식 스레드에서 수행해야합니다. 그러나이 은 자식 스레드가 완료 될 때까지 기다리는 동안 기본 스레드 이 차단되어야 함을 의미하지 않으며 을 Thread.sleep() 또는 이라고 부르지 않아도됩니다. 자식 스레드가 이 될 때까지 대기하는 동안 을 차단하는 대신 주 스레드는 자식 스레드 용 처리기를 에 제공해야합니다. 이런 식으로 응용 프로그램을 설계하면 메인 스레드가 입력에 응답 할 수 있으므로 5 초 입력 이벤트 시간 초과로 인한 ANR 대화 상자가 표시되지 않습니다. UI를 표시하는 다른 스레드에 대해서도 이와 동일한 방법으로 을 따라야합니다. 도 동일한 시간 제한을받습니다.

나는 쉽지는 않지만 위의 권장 사항은 UI가 메인 스레드가 아니라는 것입니다.

반면에 주 스레드는 비동기 작업이 사용됨을 의미하는 "대기"상태입니다. 아마도 u는 비동기 옵션을 시도하려는 - 다음과 같이 TIMED_WAIT 상태를 초래한다 :

Android - how do I investigate an ANR?

(누구의 주요 스레드가 괜찮습니다).

그러나 등이 여기에 설명 :

http://groups.google.com/group/android-ndk/browse_thread/thread/84d6a9be21f4e579/b83537161b96da82?q=%22Bitmap+creation+and+composition+in+native+code%22#b83537161b96da82

비트 맵 그림이 lockCanvas()와 unlockCanvas() 사이에 너무 오래 걸리기 때문에 나는 의심 문제입니다 - 아마도 당신은 작은 조각으로 비트 맵 업데이트를 중단 할 수 있습니다 ? 또한 동일한 논의에서 JNI/NDK를 사용하여 계산을 수행하는 데 너무 오래 걸리면 비트 맵 계산을 수행해야합니다 (Java 기반 비트 맵 업데이트 방법 내에서 수행하면 안 됨). 권장

읽기 :

http://obviam.net/index.php/the-android-game-loop/

감사합니다.

+0

감사합니다. – Danedo

+1

고맙습니다. 당신은 신사이고 학자입니다. – Danedo

0

는 로그를 기반으로, 나는 그 생각할 수있는 유일한 이유는 ANR은 트리거 할 수 :

지금까지 내가 아는 한, 일반적으로 자바의 모든 스레드가 2 개 구성 요소와 연결되어 있습니다. 하나는 프로그램 카운터이고 다른 하나는 가비지 컬렉터입니다. 그래서 모든 쓰레드는 전체적으로 gc 모니터를 갖게 될 것입니다.

java.lang.Object.wait를 (기본 방법)에서

- < 0x4001d950> (A java.lang.VMThread)에서 대기

VMThreads 이상적으로 모니터링 GC의 이러한 측면을 처리하는 데 사용됩니다 거의 평행하게. 그래서 내가 생각할 수있는 시나리오는 SurfaceViewis가 잠금을 얻으 려하지만 VMThread가 잠금을 해제하고 있기 때문에 아직 해제되지 않은 것입니다 (일부 주요 GC 작동으로 인한 것일 수 있음). 따라서 vmthread가 잠금을 해제 할 때까지 기다립니다. .

gc 활동이 기록 된 메인 로그 덤프를 확인하여 gc가이 스레드 CPU 시간을 너무 많이 먹고 응용 프로그램 프로파일 링에 도움이되는 이유에 대한 더 나은 그림을 얻을 수 있습니다. 재스 체크.