close

當使用者操作Android應用程式時,若該程式無法即時回應用戶的操作,即稱為ANR(Application Not Responding)。這通常是因為一些長時間運行或阻塞UI線程的操作所引起。以下是一些分析Android ANR問題的方法:

  • 使用DDMS工具:DDMS可用來監視正在運行的Android應用程式,包括UI thread和Memory的使用情況。可以使用DDMS工具來檢查是否有某個線程正在阻塞UI線程,或者是否有任何Memory leak等問題。
  • 查看ANR日誌:當系統發生ANR時,會生成一個ANR日誌文件。可以使用Android Studio或者其他文本編輯器來查看這個日誌文件,以了解發生ANR的原因和具體信息。通常,這個日誌文件會包含ANR發生的時間、應用程式的PID、當前線程的狀態和堆疊跟踪信息等等。
  • 分析ANR堆疊:當應用程式發生ANR時,堆疊跟踪信息中會顯示導致ANR的原因。開發人員可以分析這個堆疊跟踪信息,以找到造成問題的程式碼或者操作。
  • Memory回收機制:如果應用程式使用大量Memory,就有可能導致ANR。開發人員可以使用Android SDK提供的Memory回收機制,例如手動執行GC(Garbage Collection)或使用Memory快取等方法,以減少Memory使用量,提高應用程式性能。

總之,分析Android ANR問題需要仔細查看Memory使用情況、應用程式運行狀態和相關日誌信息,以找到問題所在,並進行相應的優化和調整。

 

===

How to trace ANR problem !
 

 

What Triggers ANR?

In Android, application responsiveness is monitored by the Activity Manager and Window Manager system services. Android will display the ANR dialog for a particular application when it detects one of the following conditions:
  • No response to an input event (e.g. key press, screen touch) within 5 seconds
  • BroadcastReceiver hasn't finished executing within 10 seconds

How to investigate an ANR 

http://stackoverflow.com/questions/704311/android-how-do-i-investigate-an-anr

An ANR happens when some long operation takes place in the "main" thread. This is the event loop thread, and if it is busy, Android cannot process any further GUI events in the application, and thus throws up an ANR dialog.

 

 

 

Now, in the trace you posted, the main thread seems to be doing fine, there is no problem. It is idling in the MessageQueue, waiting for another message to come in. In your case the ANR was likely a longer operation, rather than something that blocked the thread permanently, so the event thread recovered after the operation finished, and your trace went through after the ANR.
Detecting where ANRs happen is easy if it is a permanent block (deadlock acquiring some locks for instance), but harder if it's just a temporary delay. First, go over your code and look for vunerable spots and long running operations. Examples may include using sockets, locks, thread sleeps, and other blocking operations from within the event thread. You should make sure these all happen in separate threads. If nothing seems the problem, use DDMS and enable the thread view. This shows all the threads in your application similar to the trace you have. Reproduce the ANR, and refresh the main thread at the same time. That should show you precisely whats going on at the time of the ANR

--

中文相關討論

 
arrow
arrow

    tttt 發表在 痞客邦 留言(0) 人氣()