Appcompat-v7 v21.0.0 provoquant un crash sur les appareils Samsung avec Android v4.2.2

Nous avons simplement changé notre application pour utiliser la bibliothèque de appcompat-v7 support afin de profiter de la barre d'action de support et de soutenir les thèmes du matériel. En utilisant v21.0.0 of appcompat-v7 (et v21.0.0 of support-v4) , nous voyons des crashs dans Google Play et Crashlytics uniquement à partir de périphériques Samsung running Android v4.2.2 . Here is the stack trace from Google Play and the app appears to crash as soon as the . Here is the stack trace from Google Play and the app appears to crash as soon as the barre d'action 'est affichée et / ou invalidée.

 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) 

D'autres périphériques et émulateurs exécutant v4.2.2 ne présentent pas ce comportement. Je crois comprendre que de nombreuses applications Google utilisent déjà cette nouvelle version d' appcompat pour afficher la barre d'action. Si ces applications ne signalent pas de pannes sur ces périphériques, il serait utile de savoir comment cela est évité / corrigé.

  • NullPointerException dans Google Play Services lors de l'appel de play () sur RemotePlaybackClient
  • Edittext Android onchange listenener
  • Gradle script to autoversion et inclure le commit hash dans Android
  • Est-il possible d'obtenir des données de formulaires HTML dans Android tout en utilisant WebView?
  • Comment puis-je activer les options de développeur et ADB sur Fire Phone?
  • Cette application ne fonctionnera que si vous mettez à jour Google Play Services (via Bazaar)
  • J'ai signalé cela comme un bug pour Google, mais il a été fermé avec la raison pour laquelle il s'agit d'un problème de développement. Même si je suis d'accord, cela peut être le cas, je me demande si / comment n'importe qui peut actuellement utiliser appcompat-v7 v21.0.0 et ne pas avoir de pannes sur Samsung 4.2.2 devices .

    Mise à jour: Il semble que Google envisage au moins des solutions de contournement possibles. Voir ceci pour plus de détails.

  • Android: setActionView (null) ne supprime pas les problèmes de vue et de largeur sur MenuItem avec ActionView
  • Play Store ayant une nouvelle version de l'application, mais pas la mise à jour
  • Puis-je éviter le lecteur vidéo natif avec HTML5 sur iPhone ou Android?
  • Android Google Auth Sign In handleSignInResult: false
  • Changer l'élévation de l'actionBar par thème
  • Proguard-project.txt non trouvé dans studio Android
  • 9 Solutions collect form web for “Appcompat-v7 v21.0.0 provoquant un crash sur les appareils Samsung avec Android v4.2.2”

    J'ai trouvé la solution appropriée ici: https://stackoverflow.com/a/26641388/1266123

    En utilisant

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

    au lieu de

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

    Comme le # 150 de https://code.google.com/p/android/issues/detail?id=78377 a déclaré

    Parce que prudent avec -keep class! Android.support.v7.internal.view.menu. **. Il existe un certain nombre de classes qui sont référencées à partir des ressources d'Appcompat.

    La meilleure solution est d'ajouter les lignes suivantes à la place:

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

    Depuis Appcompat 23.1.1 le package .internal dans le bocal AppCompat a été supprimé.

    Correction mise à jour en utilisant proguard:

     #FOR APPCOMPAT 23.1.1: -keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; } -keep interface android.support.v7.* { *; } 

    Pour tous ces problèmes, seule une solution de contournement semble utiliser le protocole proguard. Consultez la discussion à l' adresse https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377

    Si quelqu'un est intéressé à utiliser une solution sans progaurd.

    Lisez le lien que j'ai essayé dans une de mes applications qui a donné l'exception sur setSupportActionBar (barre d'outils) dans onCreate ().

    C'est assez simple, ajoutez simplement essayer catch block autour de l'appel

     try { setSupportActionBar(toolbar); } catch (Throwable t) { // WTF SAMSUNG! } 

    J'ai rencontré le même problème sur Tecno P9, mais après avoir utilisé des outils de construction 24 et pour ma bibliothèque de support, j'ai utilisé 24.2.0, il a été corrigé.

    Modifiez la version Compile Sdk de votre projet à "API 18: (JellyBean)"

    La valeur par défaut est "Lollipop"

    Jusqu'à présent, j'ai résolu mon problème sur Qmobile i9

    PAS

    1. Cliquez avec le bouton droit de la souris sur votre projet et sélectionnez Ouvrir les paramètres du module (ou appuyez sur F4)
    2. Dans l'onglet des propriétés Version Compilée Sdk

    Remplacez AppCompatActivity par une activité

    Cela m'a aidé.

    Remplacer

     public class class_name extends AppCompatActivity { ......... } 

    Avec

     public class class_name extends Activity { ......... } 

    Cela m'a aidé.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.