appcompat-v7 v21.0.0 causing crash on Samsung devices with Android v4.2.2

AndroidProguardAndroid AppcompatSamsung MobileAndroid 4.2-Jelly-Bean

Android Problem Overview


We just changed our application to use the appcompat-v7 support library in order to take advantage of the support actionbar and support Material themes. Using v21.0.0 of appcompat-v7 (and v21.0.0 of support-v4), we are now seeing crashes in Google Play and Crashlytics only from Samsung devicesrunningAndroid v4.2.2. Here is the stack trace from Google Play and the app appears to crash as soon as the actionbar` is shown and/or invalidated.

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:991)
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1041)
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259)
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:80)
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:116)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5299)
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:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

Other devices and emulators running v4.2.2 do no exhibit this behavior. It's my understanding that many Google apps are already using this new version of appcompat to display the action bar. If these apps are not reporting crashes on these devices, it would be helpful to know how this is being avoided/fixed.

I reported this as a bug to Google but it got closed with the reason that it is a development issue. Although I do agree this may be the case, I'm wondering if/how anyone is currently able to use appcompat-v7 v21.0.0 and not get crashes on Samsung 4.2.2 devices.

Update: It looks like Google is at least considering possible workarounds for this. See this for details.

Android Solutions


Solution 1 - Android

I found the proper solution here: https://stackoverflow.com/a/26641388/1266123

By using

-keep class !android.support.v7.internal.view.menu.**,android.support.v7.** {*;}

instead of

-keep class android.support.v7.** {*;}

Solution 2 - Android

As #150 from https://code.google.com/p/android/issues/detail?id=78377 said

> Because careful with -keep class > !android.support.v7.internal.view.menu.**. There are a number of > classes in there which are referenced from the appcompat's resources.

The better solution is add the following lines instead:

-keep class !android.support.v7.internal.view.menu.MenuBuilder, !android.support.v7.internal.view.menu.SubMenuBuilder, android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }

Solution 3 - Android

Since Appcompat 23.1.1 the .internal package in the AppCompat jar was removed.

Updated fix using proguard:

#FOR APPCOMPAT 23.1.1:
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; }
-keep interface android.support.v7.* { *; }

Solution 4 - Android

For all having this problem, only workaround so far seems to be using proguard. Checkout discussion at https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377

Solution 5 - Android

If anyone interested in using a solution without progaurd .

Read the link i have tried this in one of my apps which gave the exception on setSupportActionBar(toolbar) in onCreate().

Its pretty simple just add try catch block around the call

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

Solution 6 - Android

I encountered the same issue on Tecno P9, but after using build tools 24 and for my support library I used 24.2.0, it was fixed.

Solution 7 - Android

Change the Compile Sdk Version of your project to "API 18:(JellyBean)"

The default is set to "Lollipop"

So far it solved my problem on Qmobile i9

STEPS

  1. Right Click on your project and select Open Module Settings (or press F4)
  2. In the properties tab Compiled Sdk Version

Solution 8 - Android

Replace AppCompatActivity With Activity

This helped me.

Solution 9 - Android

Replace

public class class_name extends AppCompatActivity
{

.........

}

With

public class class_name extends Activity
{

.........

}

This helped me.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionErik PedersenView Question on Stackoverflow
Solution 1 - AndroidrobUx4View Answer on Stackoverflow
Solution 2 - AndroidPongpatView Answer on Stackoverflow
Solution 3 - AndroidRWILView Answer on Stackoverflow
Solution 4 - AndroidMartin VandzuraView Answer on Stackoverflow
Solution 5 - AndroidRaviView Answer on Stackoverflow
Solution 6 - AndroidIkechukwu KaluView Answer on Stackoverflow
Solution 7 - AndroidJazib HasanView Answer on Stackoverflow
Solution 8 - AndroidSachin WaghmareView Answer on Stackoverflow
Solution 9 - AndroidSachin WaghmareView Answer on Stackoverflow