app for token android.os.BinderProxy@be12cf1 has too many windows 20

Viewed 1391
Fatal Exception: android.view.WindowManager$BadTokenException
Unable to add window -- app for token android.os.BinderProxy@be12cf1 has too many windows 20

I am getting this crash in my crashlytics a lot. I cannot share the code but can anyone help in giving a code snippet on what causes this crash?

p.s: cannot find this error in android source code.

Fatal Exception: android.view.WindowManager$BadTokenException: Unable to add window -- app for token android.os.BinderProxy@7fd051f has too many windows 20
   at android.view.ViewRootImpl.setView(ViewRootImpl.java:993)
   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:408)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
   at android.app.Dialog.show(Dialog.java:372)
   at androidx.fragment.app.DialogFragment.onStart(DialogFragment.java:529)
   at androidx.fragment.app.Fragment.performStart(Fragment.java:2731)
   at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
   at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1206)
   at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1368)
   at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
   at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1509)
   at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2637)
   at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2595)
   at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:258)
   at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:550)
   at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
   at com.carthero.driver.views.activities.BaseActivity.onStart(BaseActivity.java:101)
   at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1479)
   at android.app.Activity.performStart(Activity.java:7891)
   at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3545)
   at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
   at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
   at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2242)
   at android.os.Handler.dispatchMessage(Handler.java:107)
   at android.os.Looper.loop(Looper.java:230)
   at android.app.ActivityThread.main(ActivityThread.java:7789)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
1 Answers

This exception is thrown from within the Android Framework code, inside your app process. The stacktrace points to ViewRootImpl.setView, and in that file we can find several WindowManager$BadTokenException being thrown with a message that's somewhat similar, but not the exact same.

switch (res) {
    case WindowManagerGlobal.ADD_BAD_APP_TOKEN:
    case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:
        throw new WindowManager.BadTokenException(
                "Unable to add window -- token " + attrs.token
                + " is not valid; is your activity running?");
    case WindowManagerGlobal.ADD_NOT_APP_TOKEN:
        throw new WindowManager.BadTokenException(
                "Unable to add window -- token " + attrs.token
                + " is not for an application");
    case WindowManagerGlobal.ADD_APP_EXITING:
        throw new WindowManager.BadTokenException(
                "Unable to add window -- app for token " + attrs.token
                + " is exiting");
    case WindowManagerGlobal.ADD_DUPLICATE_ADD:
        throw new WindowManager.BadTokenException(
                "Unable to add window -- window " + mWindow
                + " has already been added");
    case WindowManagerGlobal.ADD_STARTING_NOT_NEEDED:
        // Silently ignore -- we would have just removed it
        // right away, anyway.
        return;
    case WindowManagerGlobal.ADD_MULTIPLE_SINGLETON:
        throw new WindowManager.BadTokenException("Unable to add window "
                + mWindow + " -- another window of type "
                + mWindowAttributes.type + " already exists");
    case WindowManagerGlobal.ADD_PERMISSION_DENIED:
        throw new WindowManager.BadTokenException("Unable to add window "
                + mWindow + " -- permission denied for window type "
                + mWindowAttributes.type);
    case WindowManagerGlobal.ADD_INVALID_DISPLAY:
        throw new WindowManager.InvalidDisplayException("Unable to add window "
                + mWindow + " -- the specified display can not be found");
    case WindowManagerGlobal.ADD_INVALID_TYPE:
        throw new WindowManager.InvalidDisplayException("Unable to add window "
                + mWindow + " -- the specified window type "
                + mWindowAttributes.type + " is not valid");
    case WindowManagerGlobal.ADD_INVALID_USER:
        throw new WindowManager.BadTokenException("Unable to add Window "
                + mWindow + " -- requested userId is not valid");
}

So you probably are facing a source change made by a specific manufacturer, because their device cannot handle that many windows from a single app.

The error message suggests that your app already has 20 windows added, which seems like a lot, but might make sense with a deep activity stack (since every activity = 1 window).

You could try to ship with square/curtains to keep track of which windows are being added and figure out where the high number comes from.

Related