如何分析Android ANR問題? How to trace ANR
ANR(Application Not Responding)是指 Android 系統中當應用程式沒有及時響應用戶操作而被強制關閉的情況。這種情況通常是由於某些長時間運行或阻塞 UI 线程的操作引起的。以下是一些分析 Android ANR 問題的方法:
- 使用 DDMS 工具:DDMS 可以用來監視正在運行的 Android 應用程式,包括線程和記憶體使用情況。可以使用 DDMS 工具來檢查是否有某個線程正在阻塞 UI 线程,或者是否有任何內存泄漏等問題。
- 查看 ANR 日誌:當系統發生 ANR 時,會生成一個 ANR 日誌文件。可以使用 Android Studio 或者其他文本編輯器來查看這個日誌文件,以了解發生 ANR 的原因和具體信息。通常,這個日誌文件會包含 ANR 發生的時間、應用程式的 PID、當前線程的狀態和堆棧跟踪信息等等。
- 分析 ANR 堆棧:當應用程式發生 ANR 時,堆棧跟踪信息中會顯示導致 ANR 的原因。開發人員可以分析這個堆棧跟踪信息,以找到造成問題的代碼或者操作。
- 記憶體回收機制:如果應用程式使用大量記憶體,就有可能導致 ANR。開發人員可以使用 Android SDK 提供的記憶體回收機制,例如手動執行 GC(Garbage Collection)或使用記憶體快取等方法,以減少內存使用量,提高應用程式性能。
總之,分析 Android ANR 問題需要仔細查看記憶體使用情況、應用程式運行狀態和相關日誌信息,以找到問題所在,並進行相應的優化和調整。
What Triggers ANR?
http://developer.android.com/guide/practices/design/responsiveness.html
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
A 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
中文相關討論
留言
張貼留言
發表一下意見,互動一下唄!