44 votes

Xamarin.Android Proguard - Numéro de version de classe non pris en charge 52.0

Je suis en train d'utiliser Proguard dans mon Xamarin.Projet Android, mais la compilation échoue avec l'erreur" Unsupported class version number [52.0] (maximum 51.0, Java 1.7)

J'ai vu à partir de ces deux questions qu'il peut être une incompatibilité entre Java 7 et Java 8, plus précisément certaines versions de proguard ne prennent pas en charge Java 8. Toutefois, dans Xamarin Préférences -> Emplacement du SDK, Java SDK points de JDK 7 : /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home

Est-il un endroit où proguard peut être configuré de manière plus précisément ? Une autre idée ?

Voici l'échec du journal :

java.io.IOException: ne Peut pas lire [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar] (Ne peut pas traiter de la classe [android/app/ActivityTracker.class] (non pris en charge classe numéro de version [52.0] (maximum 51.0, Java 1.7))) au proguard.InputReader.readInput(InputReader.java:230) à proguard.InputReader.readInput(InputReader.java:200) à proguard.InputReader.readInput(InputReader.java:178) à proguard.InputReader.execute(InputReader.java:78) à proguard.ProGuard.readInput(ProGuard.java:196) à proguard.ProGuard.execute(ProGuard.java:78) à proguard.ProGuard.principale(ProGuard.java:492) Causés par: java.io.IOException: ne Peut pas traiter de la classe [android/app/ActivityTracker.class] (non pris en charge classe de numéro de version [52.0] (maximum 51.0, Java 1.7)) à proguard.io.ClassReader.lire(ClassReader.java:112) à proguard.io.FilteredDataEntryReader.lire(FilteredDataEntryReader.java:87) au proguard.io.JarReader.lire(JarReader.java:65) à proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65) à proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53) au proguard.InputReader.readInput(InputReader.java:226) ... 6 plus Causés par: java.lang.UnsupportedOperationException: non prise en charge de la classe numéro de version [52.0] (maximum 51.0, Java 1.7) à proguard.classfile.util.ClassUtil.checkVersionNumbers(ClassUtil.java:140) au proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:88) au proguard.classfile.ProgramClass.accepter(ProgramClass.java:346) à proguard.io.ClassReader.lire(ClassReader.java:91) 11 ... plus

9 Avertissement(s) 1 Erreur(s)

115voto

Jon Douglas Points 770

Vous avez besoin de mettre à jour la valeur par défaut d'Android SDK proguard.jar avec la dernière version de Proguard trouvé ici:

https://sourceforge.net/projects/proguard/files/

Je vous recommande de l'installer sur le côté de la version par défaut que Android navires en android-sdk\tools\proguard. Il suffit de renommer le dossier existant à autre chose et ajouter la nouvelle version de l' proguard.

Ceci est indiqué dans les Xamarin.Android 7.0 notes de version:

https://developer.xamarin.com/releases/android/xamarin.android_7/xamarin.android_7.0/

Dans lequel le bug suivant a été enregistré ainsi:

https://bugzilla.xamarin.com/show_bug.cgi?id=44187

Qui est coordonné avec un Pull Request dans les Xamarin.Android référentiel:

https://github.com/xamarin/xamarin-android/pull/209

4voto

Brandon Minnick Points 5950

J'ai eu un problème lorsque Proguard supprimait les bibliothèques de services Google Play de mon application.

En plus de suivre la réponse de @Jon Douglas ci-dessus, j'ai dû ajouter les lignes de texte suivantes au fichier proguard-android.txt trouvé dans ce dossier:

/(Path to your Android SDK Folder)/tools/proguard

 -keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**
 

Compléter le fichier proguard-android.txt

 -keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep

-keep @android.support.annotation.Keep class * {*;}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <methods>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}
 

3voto

Mina Fawzy Points 13122

Réponse Simple

Selon la documentation, vous devez mettre à jour proguard version (à partir de la version 5 , il supporte Java 8 ) et assurez-vous que vous utilisez jdk1.8

JDK de 1,8 jusqu'à l'API 24+

JDK 1.7 - jusqu'à l'API 23

JDK 1.6 - jusqu'à API 20

comment mettre à jour le produit de l'emballage de la console d'écrire cette commande

PM> Install-Package name.atsushieno.proguard.facebook 

https://www.nuget.org/packages/name.atsushieno.proguard.facebook

ou télécharger proguard manuellement et la remplacer par la version actuelle

YOUR_SDK --> outils --> proguard --> (suppression de tous les anciens fichiers , décompressez nouvelle version )

Réponse détaillée si vous activer la cible android Nogut et vous activer le mode Multi-Dex ou ProGuard vous avez besoin d'utiliser la bonne ProGuard version (ToolMakerSteve dit qu'ils ont dépendance sur ProGuard) donc, assurez-vous de la cible java 8 outils ->options ->xamarin ->java et mise à jour de ProGuard version

Mise À Jour De Réponse

assurez-vous que votre bibliothèque de prise en charge de la version compatible avec la version cible , si vous ciblez

L'androïde 7 de l'api (24) de votre bibliothèque de prise en charge devrait être de 24

Android 7.1 de l'api (25 ) de votre bibliothèque de prise en charge devrait être de 25

pour tous bibliothèque de prise en charge et si vous utilisez google play services

2voto

Haider Minto Points 27

J'avais également le même problème sous Windows 10 x 64 et Visual Studio 2015. J'ai défini le chemin d'accès du JDK sur JDK 1.8 sous Paramètres Android dans les outils Visual Studio -> Options -> xamarin -> Emplacement du kit de développement Java. il pointait sur "C: \ Program Files (x86) \ Java \ jdk1.7.0_55" et je l'ai fait sur "C: \ Program Files \ Java \ jdk1.8.0_31" et le problème a été corrigé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X