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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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) [...]
Pour cette erreur, la solution passée par l'utilisation de proguard et notamment via les règles suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.**, ** { *; }
Malheureusement, ça ne fonctionne pas. En creusant un peu, je me suis aperçu que les règles proguard suivantes fonctionnent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod -dontobfuscate -dontoptimize -keep class !android.support.design.internal.**, ** { *; }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.** { *; }
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 !
Partager