【问题标题】:Android signed APK generation : Proguard exception for referenced class / method not foundAndroid 签名的 APK 生成:未找到引用的类/方法的 Proguard 异常
【发布时间】:2015-08-22 13:30:52
【问题描述】:

我需要为 Play 商店生成一个签名的 APK。 (使用安卓工作室) 如果我在没有 proguard 的情况下这样做( build.gradle 中的 minifyEnabled false )一切正常!

如果我用默认参数激活它

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

我收到这些警告

:app:proguardRelease
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find superclass or interface com.google.gson.reflect.TypeToken
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced method 'java.lang.reflect.Type getType()' in program class com.android.volley.error.VolleyErrorHelper$1
Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken
Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson
Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException
Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getContentLengthLong()' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl
Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getHeaderFieldLong(java.lang.String,long)' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl
Warning: okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okio.Okio: can't find referenced class java.nio.file.Files
Warning: okio.Okio: can't find referenced class java.nio.file.Files
Warning: okio.Okio: can't find referenced class java.nio.file.Files
Warning: okio.Okio: can't find referenced class java.nio.file.Path
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption
Warning: okio.Okio: can't find referenced class java.nio.file.Path
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption
Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okio.Okio: can't find referenced class java.nio.file.Path
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption
Warning: okio.Okio: can't find referenced class java.nio.file.Path
Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption
Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: there were 28 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning: there were 3 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile the code.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
Exception while processing task 
java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:473)
    at proguard.ProGuard.initialize(ProGuard.java:233)
    at proguard.ProGuard.execute(ProGuard.java:98)
    at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
    at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:137)
    at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:113)
    at com.android.builder.tasks.Job.runTask(Job.java:48)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227)
    at java.lang.Thread.run(Thread.java:745)
:app:dexRelease UP-TO-DATE
:app:validateExternalOverrideSigning
:app:packageRelease

并且构建过程停止并显示此消息:

Error:Execution failed for task ':app:packageRelease'.
> Unable to compute hash of ...\app\build\intermediates\classes-proguard\release\classes.jar

经过几次尝试后,我找到了一种方法,可以在“proguard-rules.pro”中删除带有此行的警告:

-dontwarn com.android.volley.**
-dontwarn com.squareup.okhttp.**
-dontwarn okio.**

但是构建过程仍然出错! 有人有解决此问题的方法吗?

谢谢! 大卫

【问题讨论】:

    标签: android apk android-build android-proguard


    【解决方案1】:

    经过几次尝试......这里的解决方案:

    首先按照 Raymond 的建议配置 dontwarn(也许这不是必需的,但我离开了):

    -dontwarn com.google.gson.**
    -dontwarn java.nio.file.**
    -dontwarn org.codehaus.mojo.animal_sniffer.**
    -dontwarn com.squareup.okhttp.internal.huc.**
    -dontwarn com.android.volley.error.**
    

    然后配置 Proguard 跳过我的库:

    -keep class com.android.volley.error.** { *; }
    -keep class com.squareup.okhttp.internal.huc.** { *; }
    -keep class okio.** { *; }
    

    编译正常,但在运行时应用程序崩溃了。 所以,为了避免这个问题,我添加了这些行:

    -keep class android.support.design.widget.** { *; }
    -keep interface android.support.design.widget.** { *; }
    -dontwarn android.support.design.**
    

    基于从该线程中找到的一些信息:

    java.lang.RuntimeException: Could not inflate Behavior subclass

    通过此设置,我可以为我的应用生成签名的 APK。

    【讨论】:

      【解决方案2】:

      您必须改为将dontwarn 应用于引用的类。

      例如:

      -dontwarn com.google.gson.**
      -dontwarn java.nio.file.**
      

      【讨论】:

      • 嗨,雷蒙德。你是对的......你写的时候不要警告。但这还不足以使用 Proguard 生成 APK。感谢您的支持!
      猜你喜欢
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多