appcompat-v7 v21.0.0 вызывает сбой на устройствах Samsung с Android v4.2.2

79

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

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 по крайней мере рассматривает возможные обходные пути для этого. См. Это для деталей.

Эрик Педерсен
источник
Это может быть связанная проблема, но, похоже, это немного другое исключение. Одно недавнее решение, опубликованное в другом вопросе, касается наличия счетчика на панели действий, и у меня такой ситуации нет. Я просто использую пункты меню.
Эрик Педерсен
У меня тоже есть эта проблема. Приложение находится в разработке и получает вылеты от Samsung с 4.2.2. устройства
Мартин Вандзура 03
1
У меня тоже нет счетчика на панели действий, и я получаю его с устройств, отличных от Samsung, работающих под управлением Android 4.2.2: Qmobile I9 и Wiko (неизвестная модель).
Jürgen 'Kashban' Wahlmann
1
@Devashish: Решение proguard во втором ответе у меня сработало. Я тестировал устройство Samsung, на которое влияет appthwack.com, и после применения конфигурации proguard у меня больше не было ошибок.
Юрген 'Kashban' Wahlmann

Ответы:

15

Я нашел здесь подходящее решение: https://stackoverflow.com/a/26641388/1266123

Используя

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

вместо

-keep class android.support.v7.** {*;}
robUx4
источник
1
Я думаю, вы можете сэкономить больше места, используя "-keepnames" вместо "-keep".
Джастин
Как отмечалось в обсуждении на code.google.com/p/android/issues/detail?id=78377 , использование этого конкретного решения может вызвать проблемы из-за ссылок на ресурсы в библиотеке appcompat. Однако это работает для нашего конкретного приложения, поэтому я отмечаю этот ответ как принятый.
Эрик Педерсен,
где я должен написать эту строку?
Bugs Happen
@BugsHappen, это войдет в ваш файл сборки Gradle. Вы можете узнать больше о ProGuard здесь: developer.android.com/tools/help/proguard.html
Дик Лукас,
7

Как сказано в № 150 из https://code.google.com/p/android/issues/detail?id=78377

Потому что осторожно с -keep class! 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.** { *; }
Понгпат
источник
В моих тестах, основанных на обзоре сгенерированного файла сопоставления proguard, эта предлагаемая конфигурация proguard не приводит к обфускации имени класса MenuBuilder, хотя и скрывает SubMenuBuilder
Энди Денни
Догадаться; смотри мой ответ.
Энди Денни
Эй, Энди, у меня такая же проблема, MenuBuilder не запутан, но другие есть, не мог бы сказать мне, как вы ее решили? спасибо
Qing
6

Так как 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.* { *; }
RWIL
источник
1

Если кому интересно использовать решение без прогаурда.

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

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

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}
Рави
источник
0

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

Икечукву Калу
источник
-2

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

По умолчанию установлено значение «Леденец».

Пока это решило мою проблему на Qmobile i9

ШАГИ

  1. Щелкните правой кнопкой мыши свой проект и выберите Открыть настройки модуля (или нажмите F4).
  2. На вкладке свойств Compiled Sdk Version
Джазиб Хасан
источник
-3

Заменить AppCompatActivity на Activity

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

Сачин Вагмаре
источник
Дешевый ремонт. Он может использовать AppCompat, потому что хочет поддерживать API <11 или что-то в этом роде. Это сломает эту идею.
Суфиан
Я думаю, это может быть достаточно плохой пост, чтобы за него проголосовали против, если кто-то согласен с причиной, названной Суфианом. Но не так уж и плохо быть удаленным.
Gangnus
-3

Заменить

public class class_name extends AppCompatActivity
{

.........

}

С участием

public class class_name extends Activity
{

.........

}

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

Сачин Вагмаре
источник
Пожалуйста, прекратите дублировать свои ответы на этот же вопрос.
Суфиан