Appcompat-v7 v21.0.0, вызывающий крах на устройствах Samsung с Android v4.2.2

Мы просто изменили наше приложение, чтобы использовать библиотеку appcompat-v7 support, чтобы использовать панель поддержки поддержки и поддерживать темы материалов. Используя v21.0.0 of appcompat-v7v21.0.0 of support-v4), мы теперь видим сбои в Google Play и Crashlytics только с устройств Samsung running Android v4.2.2 . Here is the stack trace from Google Play and the app appears to crash as soon as the actionbar` отображается и/или недействительна.

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)

Другие устройства и эмуляторы, работающие с версией v4.2.2, не проявляют такого поведения. Насколько я понимаю, многие приложения Google уже используют эту новую версию appcompat для отображения панели действий. Если эти приложения не сообщают о сбоях на этих устройствах, было бы полезно знать, как этого избежать/исправлено.

Я сообщил об этом как об ошибке для Google, но закрыл ее по причине того, что это проблема разработки. Хотя я действительно согласен, что это может быть так, мне интересно, если/как кто-то в настоящее время может использовать appcompat-v7 v21.0.0 и не получать сбои на Samsung 4.2.2 devices.

Обновление. Похоже, Google, по крайней мере, рассматривает возможные обходные пути для этого. Подробнее см. .

Ответ 1

Я нашел правильное решение здесь: fooobar.com/questions/37856/...

Используя

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

вместо

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

Ответ 2

Как # 150 из https://code.google.com/p/android/issues/detail?id=78377 сказал

Потому что осторожно с классом -keep! Android.support.v7.internal.view.menu. **. Существует ряд классы, на которые ссылаются ресурсы appcompat.

Лучшее решение вместо этого добавляет следующие строки:

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

Ответ 3

Так как Appcompat 23.1.1 пакет .internal в банке AppCompat удален.

Обновлено исправление с помощью proguard:

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

Ответ 5

Если кто-то заинтересован в использовании решения без progaurd.

Прочтите ссылку я пробовал это в одном из моих приложений, которое дало исключение на setSupportActionBar (панели инструментов) в onCreate().

Его довольно просто добавьте блок catch try вокруг вызова

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

Ответ 6

Я столкнулся с той же проблемой в Tecno P9, но после использования инструментов сборки 24 и для моей библиотеки поддержки я использовал 24.2.0, это было исправлено.

Ответ 7

Измените версию Compile Sdk вашего проекта на "API 18: (JellyBean)"

По умолчанию установлено значение "Lollipop"

До сих пор он решил мою проблему на Qmobile i9

ШАГОВ

  • Щелкните правой кнопкой мыши на своем проекте и выберите "Открыть настройки модуля" (или нажмите F4)
  • На вкладке свойств Скомпилированная версия Sdk

Ответ 8

Заменить AppCompatActivity С активностью

Это помогло мне.

Ответ 9

Заменить

public class class_name extends AppCompatActivity
{

.........

}

С

public class class_name extends Activity
{

.........

}

Это помогло мне.