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. пристрої
Мартін Вандзура

1
У мене на панелі дій теж немає обертання, і я отримую це з пристроїв, що не працюють від Samsung, на яких працює Android 4.2.2: Qmobile I9 та Wiko (невідома модель).
Юрген 'Кашбан' Валманн

1
@Devashish: Рішення proguard у другій відповіді спрацювало для мене. Я протестував проти пристрою Samsung, на який впливає appthwack.com, і після застосування конфігурації proguard більше не отримував помилок.
Юрген 'Кашбан' Валман

Відповіді:


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. Однак це працює для нашого конкретного додатка, тому я позначаю цю відповідь як прийняту.
Ерік Педерсен,

де мені писати цей рядок?
Баги трапляються

@BugsHappen, це буде міститися у вашому файлі збірки Gradle. Детальніше про ProGuard ви можете прочитати тут: developer.android.com/tools/help/proguard.html
Дік Лукас

7

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

У моїх тестах, заснованих на огляді сформованого файлу відображення proguard, ця запропонована конфігурація proguard не призводить до забруднення імені класу MenuBuilder, хоча вона затушовує SubMenuBuilder
Енді Денні

Зрозумів це; див. мою відповідь.
Енді Денні

Ей, Енді, у мене та сама проблема, MenuBuilder не заплутаний, але інші, не забудьте сказати мені, як ви це вирішили? спасибі
Цін

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 ().

Це досить просто, просто додайте спробу catch catch навколо дзвінка

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

0

Я зіткнувся з такою ж проблемою на Tecno P9, але після використання інструментів збірки 24 та для своєї бібліотеки підтримки я використав 24.2.0, це було виправлено.


-2

Змініть версію Compile Sdk вашого проекту на "API 18: (JellyBean)"

За замовчуванням встановлено "Lollipop"

Поки що це вирішило мою проблему на Qmobile i9

КРОКИ

  1. Клацніть правою кнопкою миші на своєму проекті та виберіть Відкрити налаштування модуля (або натисніть F4)
  2. На вкладці властивостей Компільована версія SDK

-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.