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.** {*;}

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.* { *; }


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
{

.........

}

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


Пожалуйста, прекратите дублировать свои ответы на этот же вопрос.
Суфиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.