NoClassDefFoundError: android.support.design.internal.NavigationMenu sur Android 4.2.2 (wiko)
Bonjour à tous,
J'utilise actuellement la bibliothèque Android Support Design en version 23.0.1 et notamment la classe NavigationMenu en tant que tag XML dans un layout.
Quand j’exécute l'application sur, par exemple, un Samsung sous Android 4.3 ou sur un Nexus sur Android 5.x ou 6.0 tout fonctionne. Mais si j’exécute l'application sur un Wiko Rainbow sous Android 4.2.2, l'application crash avec l'exception suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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)
[...] |
Puisque la classe NaviagtionMenu hérite de la classe MenuBuilder, cette erreur me fait penser à une autre connue des développeurs qui était causée par l'utilisation de la bibliothèque appcompat-v7 en version 21. Le crash généré alors l'exception suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
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) |
Pour cette erreur, la solution passée par l'utilisation de proguard et notamment via les règles suivantes :
Code:
1 2 3 4 5 6 7
|
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.**, ** { *; } |
J'ai donc essayé de m'inspirer de cette solution pour régler ce nouveau soucis via par exemple les règles proguard suivants :
Code:
1 2 3 4 5 6 7
|
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.design.internal.**, ** { *; } |
Malheureusement, ça ne fonctionne pas. En creusant un peu, je me suis aperçu que les règles proguard suivantes fonctionnent :
Code:
1 2 3 4 5 6 7
|
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; } |
Effectivement, je ne rencontre plus l'exception de type NoClassDefFoundError, mais à la place, je rencontre des erreurs relatives à l’absence de constructeurs utilisés via introspection ou encore des erreurs relatives à l'absence de constructeurs vides sur mes fragments ou des objets de la bibliothèques Jackson.
Connaissez-vous une solution qui permettent de faire fonctionner la bibliothèque Android Support Design sur un Wiko Rainbow sous Android 4.2.2 sans que je sois obligé d'ajouter des règles spécifiques à chacune des bibliothèques tierces que j'utilise (Jackson) ou des règles spécifiques à l'utilisation des composants Android comme les fragments ?
Merci d'avance pour votre aide !