IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

NoClassDefFoundError: android.support.design.internal.NavigationMenu sur Android 4.2.2 (wiko)


Sujet :

Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 86
    Points
    86
    Par défaut 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 : 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)
    [...]
    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
     
    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 : 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.**, ** { *; }
    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.design.internal.**, ** { *; }
    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.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 !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 86
    Points
    86
    Par défaut
    Voici un fichier proguard qui au premier abord semble fonctionner correctement chez moi :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
     
    -dontobfuscate
    -dontoptimize
    -allowaccessmodification
    -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.* { *; }

  3. #3
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Je rencontre moi aussi le pb, mais la solution ne fonctionne pas.
    La différence c'est que dans l'erreur il n'y a pas marqué "internal" mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    E/AndroidRuntime: FATAL EXCEPTION: main
                                                     java.lang.NoClassDefFoundError: android.support.v7.view.menu.MenuBuilder
                                                         at android.support.v7.app.AppCompatDelegateImplV7.initializePanelMenu(AppCompatDelegateImplV7.java:1233)
                                                         at android.support.v7.app.AppCompatDelegateImplV7.preparePanel(AppCompatDelegateImplV7.java:1297)
    J'ai beau chercher, modifier etc ... toujours ce crash au démarrage pour le Wiko Rainbow 4.2.2

    Eclairez-moi? Le proguard est là pour ne pas obfusquer une partie du code. Or, même en mode débug, où il n'y a pas d'Obfuscation j'ai ce crash.
    N'y aurait -il pas autre chose à faire ?

    Merci

    Bomatch

  4. #4
    Membre du Club
    Homme Profil pro
    Developpeur Android
    Inscrit en
    Février 2015
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 104
    Points : 68
    Points
    68
    Par défaut

    Alors voici ma solution !

    En fait dans mon cas, il ne faut pas toucher au Proguard, mais simplement updater le support V7 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compile 'com.android.support:appcompat-v7:24.2.0'
    Le wiko démarre parfaitement. Maintenant, faut que je fasse des tests afin de voir s'il n'y a pas d'effet de bord ou des régressions !

    Merci et bonne journée.

    Bomatch

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/01/2015, 20h10
  2. Réponses: 0
    Dernier message: 19/03/2013, 16h33
  3. Pb d'affichage de bouton dans fenêtre interne sur Android
    Par TREMOUSA dans le forum Windev Mobile
    Réponses: 4
    Dernier message: 11/06/2012, 12h35
  4. Réponses: 0
    Dernier message: 11/06/2012, 10h24
  5. Google ajoute le support des APK multiples sur l'Android Market
    Par Hinault Romaric dans le forum Android
    Réponses: 2
    Dernier message: 29/07/2011, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo