View on GitHub


Android crash reports. Detailed. Fast. Direct to your inbox.

Download this project as a .zip file Download this project as a tar.gz file

Acracadabra is a free, open-source Rails app that, together with ACRA, delivers detailed crash reports from your Android applications directly to your email inbox.

After weeks or months of development and testing and lots of blood, sweat and tears, you release your Android app. A few days later, you see a comment about your app crashing in Google Play Store:

This app sucks. Constantly crashes.

You then log in to the Android Developer Console for your app, hoping to get a little more detail. Unfortunately, the user who experienced the crash didn't submit a crash report.

You're stuck.

Maybe you integrated the Google Analytics Android SDK to track your app's exceptions, so you check out the reports for your app.

Can't create handler inside thread that has not called Looper.prepare()

Yes, that's all the detail you get. And it's happened six times in the last two days.

Maybe instead of Google Analytics you chose Flurry.

class java.lang.RuntimeException
Msg: android.os.Handler.<init>:121 (Can't create handler inside thread that has
not called Looper.prepare())

Not much better. Where in your app is this occurring? You use a Handler dozens of places throughout your app.

Enter Acracadabra.

Acracadabra is a free, open-source Rails app that receives ACRA-generated crash reports from Android applications and passes them directly to your email inbox. What's ACRA?

...a library enabling Android Application to automatically post their crash reports to a GoogleDoc form. It is targetted to android applications developers to help them get data from their applications when they crash or behave erroneously.

[It] can be used with your own self-hosted report receiver script.

Acracadabra is a fast-pass to your own "self-hosted report receiver script."

With Acracadabra, you would have received a complete crash report in your email inbox immediately after the app crashed. Here's an excerpt:

at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance( 
at android.preference.GenericInflater.createItem( 
at android.preference.GenericInflater.onCreateItem( 
at android.preference.GenericInflater.createItemFromTag( 
at android.preference.GenericInflater.rInflate( 
at android.preference.GenericInflater.rInflate( 
at android.preference.GenericInflater.inflate( 
at android.preference.GenericInflater.inflate( 
at android.preference.PreferenceManager.inflateFromResource( 
at android.preference.PreferenceManager.setDefaultValues( 
at android.preference.PreferenceManager.setDefaultValues( 
at com.example.activity.BaseActivity$LogoutTask.doInBackground( 
at com.example.activity.BaseActivity$LogoutTask.doInBackground( 
at android.os.AsyncTask$ 
at java.util.concurrent.FutureTask$Sync.innerRun( 
at java.util.concurrent.ThreadPoolExecutor.runWorker( 
at java.util.concurrent.ThreadPoolExecutor$ 
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
at android.os.Handler.( 
at android.view.GestureDetector$GestureHandler.( 
at android.view.GestureDetector.( 
at android.view.GestureDetector.( 
at android.view.GestureDetector.( 
at android.widget.TextView.( 
at android.widget.EditText.( 
at android.widget.EditText.( 
at android.preference.EditTextPreference.( 
at android.preference.EditTextPreference.( 

That's more like it.

Check it out. You can be up and running in under 20 minutes.