Подтвердить что ты не робот

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 Ошибка (ы)

4b9b3361

Ответ 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.