What is the difference between ANR and crash in Android? - android

I have searched on the internet regarding what an ANR is. And I studied those references as well. But I don't get details regarding a crash in Android.
Can someone tell me the difference between ANR(Android not Responding) and a crash in Android?

ANR stands for Application Not Responding.
An ANR will occur if you are running a process on the UI thread which takes a long time, usually around 5 seconds. During this time the GUI (Graphical User Interface) will lock up which will result in anything the user presses will not be actioned. After the 5 seconds approx has occurred, if the thread still hasn't recovered then an ANR dialogue box is shown informing the user that the application is not responding and will give the user the choice to either wait, in the hope that the app will eventually recover, or to force close the app.
A crash is when an exception within the app has been thrown which has not been handled. For example, if you try to set the text of an EditText component, but the EditText is null and there is no try catch statement to catch the exception that your app will crash and will be force closed. The user will not see what caused the crash, they will be shown a dialogue telling that the app has force closed unexpectedly and will give them the option to send a bug report. In this example if you were to look in the bug report you would see the error caused by java.lang.NullPointerException.

ANR (Application Not Responding) is due to handling a long running task in the main (UI) thread. If the main thread is stopped for more than 5 seconds, the user will get an ANR.
Crashes are due to exceptions and errors like NullPointerException, ClassNotFoundException, typecasting or parsing errors, etc. ANR also causes a crash of the application.
Note: Never perform a long-running task on the UI thread.
Reference ANR

ANR and Crash Examples:
This question already has an accepted answer, but I am adding 2 simple examples to understand ANR and Crash better.
ANR:
// this will produce an ANR on your app
int i = 0;
while(true) {
i++;
}
Crash:
// this will crash your app : will produce java.lang.ArithmeticException
int value = 5, i = 0;
int result = value / i;

Application Not Responding (ANR):
ANR will display in the following conditions:
Response to the input event (such as key press or screen touch even) within 5 Sec.
A Broadcast Receiver hasn’t finished executing within 10 Sec.
How to avoid ANRs?
Create a different worker thread for long running operations like database operations, network operations etc.
Reinforce Responsiveness:
In android app usually, 100 to 200 ms is the threshold beyond which user will feel that app is slow. Following are the tips through which we can show application more responsive.
Show progress dialog whenever you are doing any background work and a user is waiting for the response.
For games specifically, do calculations for moves in the worker thread.
Show splash screen if your application has time-consuming initial setup.
Crash:
The crash is unhandled condition into the application and it will forcefully close our application. Some of the examples of crashes are like Nullpointer exception, Illegal state exception etc.

ANR stands for Application Not Responding, which means that your app does not register events on the UI Thread anymore because a long running operation is executed there

ANR: It is called when anything your application is doing in the UI thread that
takes a long time to complete (5 sec approx)
Reference: ANR
Crash: It is called when your Application gets some Error or Exception raised by the DVM

ANR also caused by-
No response to an input event (such as key press or screen touch events) within 5 seconds.
A BroadcastReceiver hasn't finished executing within 10 seconds.

ANR stands for Application Not Responding and its occurs when long operation takes place into Main thread......
Crash are due to exception and error like Nullpoint,

ANR stands for Application Not Responding.
It can occur due to many reasons like if an application blocks on some I/O operation on the UI thread so the system can’t process incoming user input events. Or perhaps the app spends too much time building an elaborate in-memory structure or computing the next move in the UI thread.
Blocking the main thread, won't result in a crash, but a popup will be displayed to let users kills the app after 5 seconds.
But For Crash, the main reason is the human errors.
Most of the time an app crashes is because of a coding/design error made by human
Human Errors
Lack of testing
Null Pointer exception
OutofMemory
Example :
This is common when a programmer makes a reference to an object or variable that does not exist, basically creating a null-pointer error.
If you have a bad connection, that can also make your apps crash. The app could also have memory management problems.
Please see my answer for the type of android specific exception which may cause the crash.
Android Specific Exception

ANR for ex: if You are downloading huge amount data in ui thread, meny other possibilities like insufficient memory etc it will come.. probably it leads to crashes in android , We can't say both are same one follows other

[ANR and Crash Different][1]
Android applications normally run entirely on a single thread by default the “UI thread” or
“main thread”. This means anything your application is doing in the UI thread that takes a long time to complete can trigger the ANR dialog because your application is not giving itself a chance to handle the input event or intent broadcasts.

ANR: Basically due to a long running task on main thread.
There are some common patterns to look for when diagnosing ANRs:
The app is doing slow operations involving I/O on the main thread.
The app is doing a long calculation on the main thread.
The main thread is doing a synchronous binder call to another process, and that other process is taking a long time to return.
The main thread is blocked waiting for a synchronized block for a long operation that is happening on another thread.
The main thread is in a deadlock with another thread, either in your process or via a binder call. The main thread is not just waiting for a long operation to finish, but is in a deadlock situation.
The following techniques can help you find out which of these causes is causing your ANRs.
CRASH:
Reason for crashs can be many. Some reasons are obvious, like checking for a null value or empty string, but others are more subtle, like passing invalid arguments to an API or even complex multithreaded interactions

This is good article at developer portal.
It gives clarity in detail about ANR.
https://developer.android.com/training/articles/perf-anr.html

Related

System UI not responding (SUINR), without Application Not Responding (ANR) first?

Is it possible for application code to cause a SUINR, without throwing any kind of ANR?
I haven't seen any ANRs in my app, but my emulator keeps popping up the SUINR dialog.
It is true that I doing something a little hinky on the main thread by programmatically creating a RadioGroup. I would have thought if this were a problem I'd get an ANR, not a SUINR.
I also checked the logs, and I am infrequently dropping no more than about 35 frames.

Sudden spike of ANRs the last few days, trace doesn't have any of my code in it. How do I go about troubleshooting this?

I've had a sudden spike of ANRs lately, seems like October 5th is when they really started spiking up. They are affecting my latest release that is from around that date but they are also affecting my previous release that is from earlier in September. For that earlier release I can see that the ANRs really started on the 5th.
For my top two ANR traces, I don't see a single line that involves my code and the info in them isn't really useful. I'm including a full screen printout of one of the traces, they are all a bit different but they have some of the same stuff. Particularly I noticed most of them have a gms measurement call going on. While I haven't updated gms recently.
So my question is, how do I go about troubleshooting a trace like this?
Trace link https://imgur.com/JYaU9Uo
Thanks.
Here is are couple of clues from the Traces:
CountDown latch is used. So one of those threads, that is using latch is taking a long time to complete. That is causing the Main thread to be blocked.
Shared Preferences is being edited
A service is being stopped
Is there something of this phenomenon thats happening in your app?
"A service is being stopped, and shared preferences is being edited".
Countdown latch :
A java.util.concurrent.CountDownLatch is a concurrency construct that allows one or more threads to wait for a given set of operations to complete.
A CountDownLatch is initialized with a given count. This count is decremented by calls to the countDown() method. Threads waiting for this count to reach zero can call one of the await() methods. Calling await() blocks the thread until the count reaches zero.
#casolorz : Debugging ANR is a challenge. The ANR trace you have is just the state of all threads in your Application Process when the ANR has occurred. It is not as straight forwards as debugging a crash.
Here are some ways that you can debug
Method 1
See the state of the Main Thread.
If the main thread is Waiting, then figure out what is making it wait. It may be some other thread that is making it to wait. You can find out the culprit by tracking down the thread identifier. You might see something like "Waiting because of a resource held by Thread tid= ". tid should help you to navigate to the culprit.
With tid, you can follow the trail as long as possible till you reach a dead end.
If method 1 does not give you a headway, try this
Method 2 : Come up with a Hyphothesis.
Find out whats happening to the Main thread
In your case, the app is getting launched. You can see Zygote getting initialised, which confirms this hypothesis.
Once you know that the ANR is happening at App launch, see what is happening at app launch which would relate to I/O or Network.
This could be like accessing a SharedPreference which is quiet heavy(Say 1 mb which is a bad thing. You need to consider making the shared pref thin).
Or this could be an SDK that you are initialising. You can profile your code using Traces, and this would give you a fair idea of something that is taking a long time to execute.
Sometime this might be totally unrelated to your application. I have seen this occur.
Debugging ANR's are quiet challenging and its interesting too.
1.) It may be because of you are running SharedPreferences apply() method very frequently which are spanning so many threads and all threads are trying to write to the same shared preference file which are queued and while onPause() method is called all these operations are blocking to finish which is causing ANR.
2.) If you are using commit() for Shared Preferences then it will be blocking call on main thread for all previous apply() asynchronous operations for the same SharedPreference which may cause ANR on main thread.
3.) May be some big data is saved in Shared Preference because of which other commit()/apply() are placed in queue and waiting for their turn to write to the I/O file and can cause ANR once onPause() is called since all these commit() and apply() operations need to be finished before onPause() finished.

Android Multi-Threading work

I'm working in a application that I have a button to login, which checks if this account exists already in the database and if so, go to the next activity.
But nothing is showing in the layout screen.
The log cat is repeating the following message:
Skipped 48 frames! The application may be doing too much work on its main thread.
What is causing this?
I suggest you to take a look at http://developer.android.com/guide/components/processes-and-threads.html
Take some time studying how process and threads work on an Android system. It worth the effort.
Quoting a specific sentence related to your issue:
When your app performs intensive work in response to user interaction,
this single thread model can yield poor performance unless you
implement your application properly. Specifically, if everything is
happening in the UI thread, performing long operations such as network
access or database queries will block the whole UI. When the thread is
blocked, no events can be dispatched, including drawing events. From
the user's perspective, the application appears to hang. Even worse,
if the UI thread is blocked for more than a few seconds (about 5
seconds currently) the user is presented with the infamous
"application not responding" (ANR) dialog. The user might then decide
to quit your application and uninstall it if they are unhappy.
Good luck !

Crash Log in Android : Any Idea

I am new in android and working on a maintenance project
Application crashes if no internet connection while creating Soap Request
Following is screenshot of LogCat, Can any body tell me Whats the reason for crashing.
Amit Battan
You are getting a ANR. It stands for Application Not Resoponding.
Android kills applications which are unresponsive to user interactions. Basically when you are doing heavy processing and the user clicks on a button if your application doesn't respond to the click event within 5 seconds.
In your case, if the internet connection is not there I think your application keeps trying to connect and never comes out of this. Hence the ANR. Consider having a timeout for the request..
Check this link for more details on ANR.
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.
Any task that will take more time should not be performed in the UI thread, and should be moved to either an AsyncTask or a Thread & Handler.
Check the /data/anr/traces.txt file.
put the all the downloading task in a thread and check that once....
Actually android allocates some time to every process if the process does not complete its action in that particular time then ANR error will come.

why Key dispatching timed out sending and activity not responding?

I'm working on android application which uses WebServices. In that I'm fetchhing images from web and displaying in imageview. It takes time to fetch images from web and sometimes it forcecloses saying "Activity is not responding" and at that time logcat shows warning as
"Key dispatching timed out sending to
com.Test.TestProject/com.Test.TestProject.Activity1
"
I'm not getting why this is happening.Please help me.
Thanks,
Vishakha.
Read the article on painless threading. You are doing the downloading on the UI thread, which will throw ANRs (Activity Not Responding Exceptions) if it hangs for 30 sec or so. You need to do the downloading in a background task, and update the UI on completion.
You should avoid perform long running tasks on the ui thread. Consider using AsyncTask with ProgressDialog bounded.
The error happens because UI Thread is busy with images downloading, so no key events could be dispatched. The os detecs this and closes your app.

Categories

Resources