Nous venons de changer notre application pour utiliser le appcompat-v7 support
bibliothèque afin de profiter de la barre d'actions de support et des thèmes de support. En utilisant v21.0.0 of appcompat-v7
(etv21.0.0 of support-v4)
, nous voyons maintenant des plantages dans Google Play
et Crashlytics uniquement à partir d'appareils Samsung running
Android v4.2.2. Here is the stack trace from Google Play and the app appears to crash as soon as the
actionbar` est affiché et/ou invalidé.
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)
Les autres périphériques et émulateurs exécutant la version 4.2.2 ne présentent pas ce comportement. Je crois comprendre que de nombreuses applications Google utilisent déjà cette nouvelle version de appcompat
pour afficher la barre d'action. Si ces applications ne signalent pas de plantages sur ces appareils, il serait utile de savoir comment cela est évité/corrigé.
J'ai signalé cela comme un bug à Google, mais il a été fermé avec la raison qu'il s'agit d'un problème de développement. Bien que je convienne que cela puisse être le cas, je me demande si/comment quelqu'un est actuellement en mesure d'utiliser appcompat-v7 v21.0.0
et ne pas tomber en panne sur Samsung 4.2.2 devices
.
Mise à jour: il semblerait que Google envisage au moins de contourner ce problème. Voir this pour plus de détails.
J'ai trouvé la bonne solution ici: https://stackoverflow.com/a/26641388/126612
En utilisant
-keep class !Android.support.v7.internal.view.menu.**,Android.support.v7.** {*;}
au lieu de
-keep class Android.support.v7.** {*;}
Comme n ° 150 de https://code.google.com/p/Android/issues/detail?id=78377 dit
Parce que faites attention avec la classe -keep! Android.support.v7.internal.view.menu. **. Il y a un certain nombre de classes référencées à partir des ressources de l'application compatible.
La meilleure solution consiste à 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.** { *; }
Puisque Appcompat 23.1.1
le .internal
le package du pot AppCompat a été supprimé.
Correction mise à jour à l'aide de proguard:
#FOR APPCOMPAT 23.1.1:
-keep class !Android.support.v7.view.menu.*MenuBuilder*, Android.support.v7.** { *; }
-keep interface Android.support.v7.* { *; }
Pour tous ceux qui ont ce problème, seule la solution de contournement semble utiliser proguard jusqu'à présent. Discussion sur le paiement à 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 souhaite utiliser une solution sans progaurd.
Lisez le lien j'ai essayé cela dans l'une de mes applications qui a donné l'exception sur setSupportActionBar (barre d'outils) dans onCreate ().
C'est assez simple, ajoutez simplement un bloc try catch 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é les outils de build 24 et pour ma bibliothèque de support j'ai utilisé 24.2.0, il a été corrigé.