0

I'm new to java/android and trying to help out with an open source project. I decided I could learn the most from trying to fix bugs and so I've been running Monkey on the app to start generating crash reports with bugsense (I don't have access to play.google crash reports). I consistently run into the crash below and since it doesn't identify where in the code the app is having problems, I'm not even sure what exactly the problem is. I'm not asking for a line by line fix (although it is open source) but some helpful hints would be much appreciated.

Complete Repo: https://github.com/rackspace/android-rackspacecloud Stacktrace + source: http://pastebin.com/YkX7NvdD

Stacktrace:
// CRASH: com.rackspace.cloud.android (pid 3330)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: google/takju/maguro:4.1.1/JRO03C/398337:user/release-keys
// Build Changelist: 398337
// Build Time: 1341437384000
// java.lang.NullPointerException
//  at android.widget.Spinner$DialogPopup.dismiss(Spinner.java:828)
//  at android.widget.Spinner$DialogPopup.onClick(Spinner.java:862)
//  at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924)
//  at android.widget.AdapterView.performItemClick(AdapterView.java:298)
//  at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
//  at android.widget.AbsListView.onKeyUp(AbsListView.java:2996)
//  at android.widget.ListView.commonKey(ListView.java:2196)
//  at android.widget.ListView.onKeyUp(ListView.java:2051)
//  at android.view.KeyEvent.dispatch(KeyEvent.java:2633)
//  at android.view.View.dispatchKeyEvent(View.java:7086)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1354)
//  at android.widget.ListView.dispatchKeyEvent(ListView.java:2026)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
//  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358)
//  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1892)
//  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1369)
//  at android.app.Dialog.dispatchKeyEvent(Dialog.java:702)
//  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1819)
//  at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3575)
//  at android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.java:3531)
//  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3113)
//  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4153)
//  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4132)
//  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4224)
//  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
//  at android.os.MessageQueue.nativePollOnce(Native Method)
//  at android.os.MessageQueue.next(MessageQueue.java:125)
//  at android.os.Looper.loop(Looper.java:124)
//  at android.app.ActivityThread.main(ActivityThread.java:4745)
//  at java.lang.reflect.Method.invokeNative(Native Method)
//  at java.lang.reflect.Method.invoke(Method.java:511)
//  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
//  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
//  at dalvik.system.NativeStart.main(Native Method)
// 
** Monkey aborted due to error.
Events injected: 5252
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=23 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=47382ms (0ms mobile, 47382ms wifi, 0ms not connected)
** System appears to have crashed at event 5252 of 10000 using seed 0
Jav_Rock
  • 22,059
  • 20
  • 123
  • 164

1 Answers1

1

According to the code I am seeing at GrepCode, we have this :

    public void dismiss() {
        mPopup.dismiss();
        mPopup = null;
    }

So your NPE is caused by mPopup which is private AlertDialog of DialogPopup (private class of Spinner), probably the dialog to show the options of the spinner when you click it. mPopup is only set to something different from null at DialogPopup.show(). That method is called at Spinner.performClick(),i.e., when the spinner is clicked.

But then this is the weird part. The stack trace seem to be when an item of the mPopup was clicked, because DialogPopup is set as its OnClickListener. So at that point mPopup should not be null. But when DialogPopup.dismiss() it is null.

What can explain that? Here's my hypothesis. Well, monkey usually is pretty fast. Faster than actual users. It might be able to click two items before the mPopup was really dismissed by the first DialogPopup.onClick(). So we have two calls to DialogPopup.dismiss(), with the second cauing the NPE.

So here are my conclusions:

  • Because we are dealing only with internal classes and your code is not responsible for triggering the code that crashed, this is very likely an Android platform bug.
  • To fix this you must be able to reproduce and debug in eclipse in order to fully understand what is happening . You will need to download the Android platform code inorder to be able to step into the spinner code. Alternatively you can put log on the Spinner code and build Jelly Beans and flash your phone ( or replace the framework.jar)
  • If my hypothesis is correct, then debugging with ecplise won't help. You will need the logs to debug the problem. But if my hypothesis is right, then we think we should not worry. Normal user will hardly be able to click so fast.
  • You could advice the Android guys to do a if-null check. But only after you found the real root cause. Otherwise , you will be maskig the problem
André Oriani
  • 3,553
  • 22
  • 29