Xamarin.Android Proguard - Неподдерживаемая версия класса версии 52.0
Я пытаюсь использовать Proguard в моем проекте Xamarin.Android, но компиляция не выполняется с ошибкой Unsupported class version number [52.0] (maximum 51.0, Java 1.7)
Я видел из этих двух questions, что это может быть несоответствие между Java 7 и Java 8, точнее некоторые версии proguard не поддерживают Java 8. Однако в настройках Xamarin → SDK Location, SDK Java указывает на JDK 7: /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
Есть ли место, где proguard можно настроить более точно? Любая другая идея?
Здесь журнал сбоев:
java.io.IOException: не удается прочитать [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18/lib/xbuild-frameworks/MonoAndroid/v7.0/mono.android.jar] (Невозможно обработать класс [android/app/ActivityTracker.class] (Неподдерживаемый номер версии класса [52.0] (максимум 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.readInput(ProGuard.java:196) в proguard.ProGuard.execute(ProGuard.java:78) в proguard.ProGuard.main(ProGuard.java:492) Вызвано: java.io.IOException: невозможно обработать класс [android/app/ActivityTracker.class] (Номер версии неподдерживаемого класса [52.0] (максимум 51.0, Java 1.7)) на proguard.io.ClassReader.read(ClassReader.java:112) в proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87) в proguard.io.JarReader.read(JarReader.java:65) в proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65) в proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53) в proguard.InputReader.readInput(InputReader.java:226)... еще 6 Вызвано: java.lang.UnsupportedOperationException: неподдерживаемый класс номер версии [52.0] (максимум 51.0, Java 1.7) на proguard.classfile.util.ClassUtil.checkVersionNumbers(ClassUtil.java:140) в proguard.classfile.io.ProgramClassReader.visitProgramClass(ProgramClassReader.java:88) в proguard.classfile.ProgramClass.accept(ProgramClass.java:346) в proguard.io.ClassReader.read(ClassReader.java:91)... еще 11
9 Предупреждение 1 Ошибка (ы)
Ответы
Ответ 1
Вам необходимо обновить Android SDK по умолчанию proguard.jar
с помощью последней версии Proguard, найденной здесь:
https://sourceforge.net/projects/proguard/files/
Я бы порекомендовал вам установить это на стороне версии по умолчанию, которую Android отправляет в android-sdk\tools\proguard
. Просто переименуйте существующую папку в другое и добавьте новую версию proguard
.
Это указано в примечаниях к выпуску Xamarin.Android 7.0:
https://developer.xamarin.com/releases/android/xamarin.android_7/xamarin.android_7.0/
В том числе была зарегистрирована следующая ошибка:
https://bugzilla.xamarin.com/show_bug.cgi?id=44187
Координируется с запросом Pull в репозитории Xamarin.Android:
https://github.com/xamarin/xamarin-android/pull/209
Ответ 2
Простой ответ
В соответствии с документацией вам необходимо обновить версию proguard (начиная с версия 5, она поддерживает Java 8) и убедитесь, что вы используете jdk1.8
JDK 1.8 - до API 24 +
JDK 1.7 - до API 23
JDK 1.6 - до API 20
как обновить из консоли пакета, напишите эту команду
PM> Install-Package name.atsushieno.proguard.facebook
https://www.nuget.org/packages/name.atsushieno.proguard.facebook
или загрузите proguard вручную и замените его на текущую версию
YOUR_SDK → tools → proguard → (удалить все старые файлы, распаковать новую версию)
Подробный ответ, если вы включите целевую андроидную версию Nogut и включите Multi-Dex или ProGuard, вам нужно использовать правильную версию ProGuard (поскольку ToolMakerSteve заявляет, что они зависят от ProGuard)
поэтому убедитесь, что вы нацеливаете java 8 из инструментов → options → xamarin → java и обновите версию ProGuard
Обновить ответ
убедитесь, что версия поддерживаемой библиотеки совместима с целевой версией, если вы нацеливаете
Android 7 (api 24) означает, что ваша библиотека поддержки должна быть 24
Android 7.1 (api 25) означает, что ваша библиотека поддержки должна быть 25
для всей библиотеки поддержки, а также при использовании сервисов google play
Ответ 3
У меня возникла проблема, когда Proguard удалял библиотеки Google Play Services из моего приложения.
В дополнение к следующему @Jon Douglas 'ответ выше, мне пришлось добавить следующие строки текста в файл proguard-android.txt
, найденный в этой папке:
/(Path to your Android SDK Folder)/tools/proguard
-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**
Полный файл 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>(...);
}
Ответ 4
У меня также была такая же проблема на моей Windows 10 x64 и visual studio 2015. Я установил путь JDK к JDK 1.8 под настройками Android в Visual studio
инструменты → опции → xamarin → расположение разработки java. он указывал на "C:\Program Files (x86)\Java\jdk1.7.0_55", и я перешел к "C:\Program Files\Java\jdk1.8.0_31", и проблема была исправлена.
Ответ 5
Использование Visual Studio
Если вы используете Visual Studio 2017 или 2019, обратите внимание, что эти приложения упаковывают свои продукты. Для 2019 года, версия Proguard: 5.3.2. Мне нужна была версия 6.0.3, поэтому я сделал резервную копию файла proguard.jar по адресу:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Xamarin\Android\proguard\lib
И скопировал последний из zip с сайта sourceforge.