2016-09-15 23 views
38

Próbuję użyć PROGUARD w moim projekcie Xamarin.Android jeszcze kompilacja nie powiedzie się z powodu błędu Unsupported class version number [52.0] (maximum 51.0, Java 1.7)Xamarin.Android Proguard - numer wersji nieobsługiwany klasa 52,0

widziałem z tych twoquestions że może to być niedopasowanie między Java 7 i Java 8, a dokładniej niektóre wersje proguard nie obsługują języka Java 8. Jednak w preferencjach Xamarin -> Lokalizacja SDK, Java SDK wskazuje na JDK 7: /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home

Czy jest jakieś miejsce, w którym można wprowadzić proguard? skonfigurowane bardziej precyzyjnie? Każdy inny pomysł?

Oto dziennik awarii:

java.io.IOException: Nie można odczytać [/Library/Frameworks/Xamarin.Android.framework/Versions/7.0.0-18/lib/xbuild- frameworks/MonoAndroid/v7.0/mono.android.jar] (Nie można przetworzyć klasy [Android/app/ActivityTracker.class] (Nieobsługiwany numer wersji klasy [52.0] (maksymalnie 51,0, Java 1.7))) pod adresem proguard.InputReader.readInput (InputReader.java:230) pod adresem proguard.InputReader.readInput (InputReader.java:200) pod adresem proguard.InputReader.readInput (InputReader.java:178) pod adresem proguard.InputReader.execute (InputReader.java:78) pod adresem proguard.ProGuard.readInput (ProGuard.java:196) pod adresem proguard.ProGuard.execute (ProGuard.java:78) pod adresem proguard.ProGuard.main (ProGuard. java: 492) Spowodowane przez: java.io.IOException: Nie można przetworzyć klasy [Android/app/ActivityTracker.class] (nieobsługiwany numer wersji klasy [52,0] (maksymalnie 51,0, Java 1.7)) pod adresem proguard. io.ClassReader.read (ClassReader.java:112) w proguard.io.FilteredDataEntryReader.read (FilteredDataEntryReader.java:87) w proguard.io.JarReader.read (JarReader.java:65) w proguard.io. DirectoryPump.readFiles (DirectoryPump.java:65) pod adresem proguard.io.DirectoryPump.pumpDataEntries (DirectoryPum p.java:53) pod adresem proguard.InputReader.readInput (InputReader.java:226) ... 6 więcej Wywoływany przez: java.lang.UnsupportedOperationException: Nieobsługiwana klasa numer wersji [52.0] (maksymalnie 51,0, Java 1.7) w proguard.classfile.util.ClassUtil.checkVersionNumbers (ClassUtil.java:140) w proguard.classfile.io.ProgramClassReader.visitProgramClass (ProgramClassReader.java:88) w proguard.classfile.ProgramClass.accept (ProgramClass.java : 346) przy proguard.io.ClassReader.read (ClassReader.java:91) ... 11 więcej

9 ostrzegania (a) 1 błędu (y)

Odpowiedz

96

Musisz zaktualizować domyślne Android SDK proguard.jar z najnowszą wersją PROGUARD znaleźć tutaj:

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

Polecam zainstalowanie tego na stronie domyślnej wersji, że Android statków w android-sdk\tools\proguard. Po prostu zmień nazwę istniejącego folderu na coś innego i dodaj nową wersję proguard.

Jest to wymienione w Xamarin.Android 7.0 wydaniu:

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

, w których następujące bug był zalogowany, a także:

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

który jest skoordynowany z prośbą Pull w repozytorium Xamarin.Android:

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

+2

To działa dla mnie, dla szczegółów zamieniam folder ''/tools/proguard/lib' systemu Android przez folder 'lib' wewnątrz najnowsze wydanie Proguard ze środowiska sourceforge (obecnie 5.3.2). –

+7

Jeśli zastąpisz cały katalog proguard, upewnij się, że skopiowałeś pliki konfiguracyjne ze starego katalogu: proguard-android-optimize.txt, proguard-android.txt, proguard-project.txt. – rooby

+0

Najbardziej fantastyczną rzeczą jest to, że to naprawdę pomaga nawet 2 lata temu) Ten człowiek, uratowałeś mi dzień. – Darkmike

1

Miałem też do czynienia z tym samym problemem na moim Windows 10 x64 i studio wizualne 2015. Ustawiłem ścieżkę JDK do JDK 1.8 w ustawieniach Androida w narzędziach Visual Studio -> opcje -> xamarin -> lokalizacja zestawu rozwojowego java. wskazywało to "C: \ Program Files (x86) \ Java \ jdk1.7.0_55" i zrobiłem to "C: \ Program Files \ Java \ jdk1.8.0_31", a problem został naprawiony.

+0

Czy zmiana ścieżki rozwiązała ten problem? –

+0

Nie, to nie działa dla mnie, czy używam Java 7 lub Java 8 w VS/Xamarin Studio. Otrzymuję ten sam błąd. –

+0

To ** nie rozwiązuje ** problemu, jeśli używasz ** ProGuard lub Multi-Dex **, ponieważ te zależą od narzędzia wewnątrz androida sdk/tools/proguard, jak opisano w odpowiedzi Jon Douglas. Z drugiej strony, ** powinien naprawić ** problem dla każdego **, który nie używa ProGuarda lub Multi-Dex **, jeśli otrzymują ten błąd, próbując użyć Nougat [API 24] lub jakiegoś pakietu/biblioteki, która zależy od funkcji API 24. – ToolmakerSteve

2

prosta odpowiedź

Zgodnie z dokumentacją trzeba aktualizować wersję PROGUARD (począwszy od version 5 obsługiwać Java 8) i upewnij się, że używasz jdk1.8

JDK 1.8 - do API 24+

JDK 1,7 - do interfejsu API 23

JDK 1,6 - do interfejsu API 20

jak zaktualizować z konsolą pakietu napisać tę komendę

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

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

lub pobrać proguard ręcznie i zastąpić go z aktualnej wersji

YOUR_SDK -> Narzędzia -> PROGUARD -> (usuń wszystkie stare pliki, rozpakuj nową wersję)

Szczegółowa odpowiedź jeśli włączysz docelowy Android Nogut i włączysz Multi-Dex lub ProGuard potrzebujesz odpowiedniej wersji ProGuard (jak ToolMakerSteve powiedział, że masz zależność od ProGuarda) , więc upewnij się, że celujesz w java 8 z narzędzi -> opcje -> xamarin -> Java i aktualizacja ProGuard wersja

aktualizacja Odpowiedź

upewnić się, że wsparcie wersja biblioteki kompatybilny z wersją docelową, jeśli cel

Android 7 (API 24) oznaczają biblioteki wsparcie powinno być 24

Android 7.1 (API 25) oznaczają biblioteki wsparcie powinno być 25

do całej biblioteki wsparcia, a jeśli za pomocą usługi Google Play oraz

1

miałem problem gdzie Proguard było usunięcie Google Odtwórz biblioteki usług z mojej aplikacji.

Oprócz następujące @Jon Douglas "odpowiedzi powyżej, musiałem dodać następujące wiersze tekstu do pliku proguard-android.txt znaleziony w tym folderze:

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

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

Kompletna PROGUARD-android.txt pliku

-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>(...); 
}