【问题标题】:Xamarin.Android Proguard - Unsupported class version number 52.0Xamarin.Android Proguard - 不支持的类版本号 52.0
【发布时间】:2017-01-23 16:20:50
【问题描述】:

我正在尝试在我的 Xamarin.Android 项目中使用 Proguard,但编译失败并出现错误 Unsupported class version number [52.0] (maximum 51.0, Java 1.7)

我从那些twoquestions 看到它可能是Java 7 和Java 8 之间的不匹配,更准确地说是某些版本的proguard 不支持Java 8。但是在Xamarin Preferences -> SDK Location, Java SDK指向 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 个错误

【问题讨论】:

    标签: xamarin xamarin.android android-proguard


    【解决方案1】:

    您需要使用此处找到的最新版本的 Proguard 更新默认的 Android SDK proguard.jar

    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

    这与 Xamarin.Android 存储库中的拉取请求相协调:

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

    【讨论】:

    • 这对我有用,关于详细信息,我将 Android tools/proguard/lib 文件夹替换为 sourceforge 的最新 Proguard 版本(此时为 5.3.2)中的 lib 文件夹。
    • 如果替换整个 proguard 目录,请确保从旧目录复制配置文件:proguard-android-optimize.txt、proguard-android.txt、proguard-project.txt。跨度>
    • 最棒的事情是它甚至在 2 年前真的很有帮助)谢谢伙计,你拯救了我的一天。
    • 谢谢你拯救了我的一天。我希望我能给你 100 票,
    • 即使您拥有最新版本,此解决方案也有效。有时您可能会遇到错误,只需重新下载并替换为现有的即可。我不知道为什么,但它的工作原理是这样的
    【解决方案2】:

    Proguard 从我的应用程序中删除 Google Play 服务库时遇到问题。

    除了遵循上述@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>(...);
    }
    

    【讨论】:

      【解决方案3】:

      简单回答

      根据文档,您需要更新 proguard 版本(从 version 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 --> 工具 --> proguard --> (删除所有旧文件,解压新版本)

      详细解答如果您启用目标 android Nogut 并启用 Multi-Dex 或 ProGuard,您需要使用正确的 ProGuard 版本(正如 ToolMakerSteve 所说,他们依赖于 ProGuard) 因此,请确保您从工具 -> 选项 ->xamarin ->java 定位 java 8 并更新 ProGuard 版本

      更新答案

      确保你的支持库版本与目标版本兼容,如果你的目标是

      Android 7(api 24)意味着您的支持库应该是 24

      Android 7.1 (api 25 ) 意味着你的支持库应该是 25

      所有支持库,如果你也使用谷歌播放服务

      【讨论】:

        【解决方案4】:

        我在 Windows 10 x64 和 Visual Studio 2015 上也遇到了同样的问题。我在 Visual Studio 的 android 设置下将 JDK 路径设置为 JDK 1.8 工具 -> 选项 ->xamarin ->java 开发工具包位置。它指向“C:\Program Files (x86)\Java\jdk1.7.0_55”,我将它指向“C:\Program Files\Java\jdk1.8.0_31”,问题已得到修复。

        【讨论】:

        • 更改路径能解决这个问题吗??
        • 不,它对我不起作用,无论我在 VS/Xamarin Studio 中使用 Java 7 还是 Java 8,我都会遇到同样的错误。
        • 如果使用 ProGuard 或 Multi-Dex,这不能解决问题,因为它们依赖于 android sdk/tools/proguard 中的工具,如乔恩·道格拉斯的回答中所述。另一方面,如果他们在尝试使用 Nougat [API 24] 时遇到此错误,它应该解决任何不使用 ProGuard 或 Multi-Dex 的人的问题,或一些依赖于 API 24 功能的包/库。
        【解决方案5】:

        使用 Visual Studio

        如果您使用的是 Visual Studio 2017 或 2019,请注意这些应用程序会打包它们的 proguard。对于 2019,proguard 版本:5.3.2。对我来说,我需要 6.0.3 版本,所以我在以下位置备份了 proguard.jar 文件:

        C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Xamarin\Android\proguard\lib
        

        并从 sourceforge 站点的 zip 中复制了最新的一个。

        【讨论】:

          【解决方案6】:

          要让 ProGuard 工作,您必须遵循几个步骤

          • 首先从here 下载最新的ProGuard 文件,解压缩并粘贴到您的android-sdk\tools\proguard 文件夹中
          • 首先您需要将 proguard.cfg 添加到您的 android 项目级别。
          • 将 proguard.cfg 文件构建操作更改为 ProguardConfiguration 更改
          • proguard.cfg 文件使用 Notepad++ 编码为 UTF-8

          如果您收到警告,则需要使用 -dontwarn 属性,如下所示

          -dontwarn com.symbol.emdk.**
          -dontwarn org.apache.http.**
          -dontwarn com.appdynamics.eumagent.runtime.**
          

          您必须需要删除/解决警告,因为这会导致错误。以上代码将删除您的所有警告。

          如果您在执行应用程序后遇到异常,您需要使用 -keep 属性。如下所示为必修课

          -keep public class android.support.v7.widget.** { *; }
          

          【讨论】:

            猜你喜欢
            • 2014-05-05
            • 1970-01-01
            • 1970-01-01
            • 2018-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-23
            • 2017-06-13
            相关资源
            最近更新 更多