J'essaie d'utiliser Proguard dans mon projet Xamarin.Android, mais la compilation échoue avec l'erreur Unsupported class version number [52.0] (maximum 51.0, Java 1.7)
.
J'ai vu de ces deuxquestions qu'il pourrait y avoir une discordance entre Java 7 et Java 8 , plus précisément certaines versions de proguard ne supportent pas Java 8. Cependant, dans les préférences Xamarin -> Emplacement du SDK, Java, SDK pointe vers JDK 7: /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
Existe-t-il un endroit où proguard peut être configuré plus précisément? Une autre idée?
Voici le journal des échecs:
Java.io.IOException: impossible de lire [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18-18/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.Android.jar] (peut ne traite pas la classe [Android/app/ActivityTracker.class] (numéro de version de la classe non prise en charge [52.0] (maximum 51.0, Java 1,7))) à 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.read.put (ProGuard. Java: 196) sur proguard.ProGuard.execute (ProGuard.Java:78) sur proguard.ProGuard.main (ProGuard.Java:492) Causée par: Java.io.IOException: Impossible de traiter la classe [Android/app/ActivityTracker .class] (Numéro de version de la classe non prise en charge [52.0] (51.0 maximum, Java 1,7))) dans proguard.io.ClassReader.read (ClassReader.Java:112) dans proguard.io.FilteredDataEntryReader. read (FilteredDataEntryReader.Java:87) à proguard.io.JarReader.read (JarReader.Java:65) à pr oguard.io.DirectoryPump.readFiles (DirectoryPump.Java:65) à proguard.io.DirectoryPump.pumpDataEntries (DirectoryPump.Java:53) à proguard.InputReader.readInput (InputReader.Java:226) ... 6 autres causés par: Java.lang.UnsupportedOperationException: numéro de version de classe non pris en charge [52.0] (51.0 maximum, Java 1,7)) dans proguard.classfile.util.ClassUtil.checkVersionNumbers (ClassUtil.Java:140) dans proguard.classfile. .io.ProgramClassReader.visitProgramClass (ProgramClassReader.Java:88) sur proguard.classfile.ProgramClass.accept (ProgramClass.Java:346) sur proguard.io.ClassReader.read (ClassReader.Java:91) ... 11 autres
9 avertissement (s) 1 erreur (s)
Vous devez mettre à jour le fichier par défaut Android SDK proguard.jar
avec la dernière version de Proguard disponible ici:
https://sourceforge.net/projects/proguard/files/
Je recommanderais que vous installiez ceci du côté de la version par défaut qui Android est livré dans Android-sdk\tools\proguard
. Renommez simplement le dossier existant en quelque chose d'autre et ajoutez la nouvelle version de proguard
.
Ceci est listé dans les notes de publication de Xamarin.Android 7.0:
https://developer.xamarin.com/releases/Android/xamarin.Android_7/xamarin.Android_7.0/
Dans lequel le bogue suivant a également été enregistré:
https://bugzilla.xamarin.com/show_bug.cgi?id=44187
Ce qui est coordonné avec une demande d'extraction dans le référentiel Xamarin.Android:
J'ai eu un problème lorsque Proguard supprimait les bibliothèques de services Google Play de mon application.
En plus de suivre @ Jon Douglas 'réponse ci-dessus, je devais ajouter les lignes de texte suivantes au fichier proguard-Android.txt
Se trouvant dans ce dossier:
/(Path to your Android SDK Folder)/tools/proguard
-keep public class com.google.Android.gms.* { public *; }
-dontwarn com.google.Android.gms.**
-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>(...);
}
Réponse simple
Selon la documentation, vous avez besoin de la version de mise à jour (à partir de version 5 il supporte Java 8) et assurez-vous que vous utilisez jdk1.8
JDK 1.8 - jusqu'à API 24+
JDK 1.7 - jusqu'à l'API 23
JDK 1.6 - jusqu'à l'API 20
comment mettre à jour à partir de la console du package, écrivez cette commande
PM> Install-Package name.atsushieno.proguard.facebook
https://www.nuget.org/packages/name.atsushieno.proguard.facebook
ou téléchargez proguard manuellement et remplacez-le par la version actuelle
YOUR_SDK -> outils -> proguard -> (effacez tous les anciens fichiers, décompressez la nouvelle version)
Réponse détaillée si vous activez la cible Android Nogut et vous activez Multi-Dex ou ProGuard, vous devez utiliser la version appropriée de ProGuard ( comme ToolMakerSteve a déclaré qu'ils dépendent de ProGuard), assurez-vous donc de cibler Java 8 à partir d'outils -> options -> xamarin -> Java et mettez à jour la version de ProGuard
Mise à jour de la réponse
assurez-vous que la version de votre bibliothèque de support est compatible avec la version cible, si vous ciblez
Android 7 (api 24) signifie que votre bibliothèque de support devrait être 24
Android 7.1 (api 25) signifie que votre bibliothèque de support doit être de 25
à toutes les bibliothèques de support et si vous utilisez les services de Google Play aussi
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 Android dans les outils Visual Studio -> options -> xamarin -> Emplacement du kit de développement Java: il pointait vers "C:\Program Files (x86)\Java\jdk1.7.0_55" et je l'avais mis dans "C:\Program Files\Java\jdk1.8.0_31" et le problème a été résolu. fixé.
tilisation de Visual Studio
Si vous utilisez Visual Studio 2017 ou 2019, veuillez noter que ces applications contiennent leur proguard. Pour 2019, version de proguard: 5.3.2. Pour moi, j'avais besoin de la version 6.0.3, j'ai donc fait une sauvegarde du fichier proguard.jar à:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Xamarin\Android\proguard\lib
Et copié le dernier de Zip à partir du site sourceforge.