web-dev-qa-db-fra.com

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

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 runningAndroid v4.2.2. Here is the stack trace from Google Play and the app appears to crash as soon as theactionbar` 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.

78
Erik Pedersen

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.** {*;}
15
robUx4

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.** { *; }
7
Pongpat

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.* { *; }
6
RWIL

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

2
vandzi

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!

}
1
Ravi

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é.

0
Ikechukwu Kalu