10

Я пытаюсь использовать библиотеку Android Support Design (в версии 23.0.1) и класс NavigationMenu (я использую этот класс как XML-тег в макет).NoClassDefFoundError: android.support.design.internal.NavigationMenu на Android 4.2.2 (wiko)

Когда я выполняю свое приложение на Samsung на Android 4.3 или на Nexus на Android 5.x или 6.0, все работает хорошо, но когда я запускаю приложение на Wiko Rainbow на Android 4.2.2, он падает с следующее исключение:

java.lang.RuntimeException: Unable to start activity ComponentInfo{applicationId/package.MainActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown> 
[...] 
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown> 
Caused by: java.lang.reflect.InvocationTargetException 
     at java.lang.reflect.Constructor.constructNative(Native Method) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
     at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
[...] 
Caused by: java.lang.NoClassDefFoundError: android.support.design.internal.NavigationMenu 
     at android.support.design.widget.NavigationView.<init>(NavigationView.java:99) 
     at android.support.design.widget.NavigationView.<init>(NavigationView.java:92) 
     at java.lang.reflect.Constructor.constructNative(Native Method) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
     at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
[...] 

Эта ошибка заставляет меня думать о схожих разработчиках были несколько месяцев назад, используя библиотеку AppCompat-v7 на некоторых телефонах WIKO и Samsung на Android 4.2.2.

Ошибка:

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder 
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:914) 
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:964) 
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1182) 
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:79) 
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:118) 
at android.os.Handler.handleCallback(Handler.java:800) 
at android.os.Handler.dispatchMessage(Handler.java:100) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5391) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 

Решение было использовать следующий файл Proguard в проект:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-dontobfuscate 
-dontoptimize 

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

Это решение было здорово, потому что не нужно добавлять определенные правила (только некоторые строки -dontwarn) для других библиотек, которые я использую как Jackson или для добавления определенных правил для компонентов Android.

Поскольку NavigationMenu класс наследуется в MenuBuilder классе, я думал, что мы можем изменить файл Proguard, как это исправить вопрос:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-dontobfuscate 
-dontoptimize 

-keep class !android.support.design.internal.**, ** { *; } 

К сожалению, это не работает ... Так что я попробовал другое решение :

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-dontobfuscate 
-dontoptimize 

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

этого решение работ но ... на самом деле, я не имею NoClassDefFoundError исключения больше, но у меня есть другие исключения (что происходит на всех Android версии):

  • некоторые отсутствующие конструкторы используют с отражением;
  • некоторые отсутствующие пустые конструкторы на объектах Джексона или на Fragment.

Итак, вы знаете решение, которое позволяет мне выполнять мое приложение на Wiko на Android 4.2.2, и в котором я не должен добавлять определенные правила для каждой библиотеки, которую я использую или использую в будущее ?

Заранее благодарю вас за помощь!

ответ

-4

Thx для Шимона Klimaszewski за помощь! Здесь файл proguard, который работает для меня:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-dontobfuscate 
-dontoptimize 
-repackageclasses '' 

#Jackson 
-dontwarn com.fasterxml.jackson.databind.** 

#View Pager Indicator 
-dontwarn com.viewpagerindicator.** 

#Android 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class android.support.v7.app.** { *; } 
-keep interface android.support.v7.app.** { *; } 
-keep class android.support.v13.app.** { *; } 
-keep interface android.support.v13.app.** { *; } 

#droid4me 
-keep class com.smartnsoft.** { *; } 

#my app 
-keep class my.app.package.** { *; } 

#Critercism 
-keep public class com.crittercism.** 
-keepclassmembers public class com.crittercism.* { *; } 
+8

В этом файле конфигурации есть много чего, что может не иметь ничего общего с этим вопросом. Не могли бы вы уточнить, что именно вылечит эту проблему с помощью NavigationView? Я хочу, например, обфускацию и не отключать ее - я не думаю, что это связано с проблемой ... – Zordid

5

Я следую аналогичным thread и борюсь с поиском решения, но у меня нет устройства.

Опираясь на комментарии людей я добавил следующее в ProGuard конфигурации типа сборки:

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt' 
    } 
} 

ProGuard-project.txt

-repackageclasses '' 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 

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

-keep class android.support.v13.app.** { *; } 
-keep interface android.support.v13.app.** { *; } 

Не могли бы вы, пожалуйста, попробуйте с помощью следующей конфигурации? У меня есть некоторые сомнения к этому решению, потому что, когда у меня есть незашифрованные классы, у меня все еще был NavigationMenuView в том же пакете.Он не был перемещен из-за его отношений доступа к пакету. Так что может помочь добавляет еще один флаг в Proguard-project.txt конфигурации, довольно рискованно, хотя:

-allowaccessmodification 

Это может быть хорошим началом, чтобы попытаться фиксируя проблему.

Так что в вашем случае Proguard-проект должен выглядеть следующим образом:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-dontobfuscate 
-dontoptimize 
-allowaccessmodification 
-repackageclasses '' 
-keep class your.package.name.** { *; } 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 

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

-keep class android.support.v13.app.** { *; } 
-keep interface android.support.v13.app.** { *; } 
+0

Thx для вашего ответа. Я попробовал ваше решение. Я не исключение NoClassDefFoundError, но у меня есть другие исключения, такие как: '' ' Вызванные: java.lang.NoSuchMethodException: [класс java.lang.String, Int] в java.lang.Class.getConstructorOrMethod (Class .java: 460) at java.lang.Class.getDeclaredConstructor (Class.java:588) at com.smartnsoft.droid4me.cache.Persistence.getInstance (Persistence.java:460) '' ' Знаете ли вы, решение, которое исправляет исключение NoClassDefFoundError и в котором вам не нужно добавлять правила для каждой библиотеки, используемой в проекте? – rolandl

+0

repackageclasses разбивает большинство отражений, которые используются в вашем коде. Вам нужно добавить в [config] (http://proguard.sourceforge.net/manual/usage.html#keep): -keep class your.package.name. ** {*; } –

+0

Thx! Кажется, это работает. Я собираюсь опубликовать полный файл proguard в качестве ответа. – rolandl

0

Я собираюсь с этим. Я не пробовал еще, так как у меня нет какой-либо из пострадавших устройств:

-keep class !android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu 

Это идет в дополнение к этому правилу, которое помогает много устройств Samsung (см http://goo.gl/ywG1c4):

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

-

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

Проверьте com.android.support:appcompat version. Например, вместо com.android.support:appcompat-v7:23.1.1 попробуйте использовать com.android.support:appcompat-v7:23.0.1