应用程序在启用minifyEnabled的情况下,使用Picasso时崩溃。

20
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Call
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Call
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.OkHttpClient
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.CacheControl
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Request$Builder
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Response
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.ResponseBody
Warning:com.squareup.picasso.OkHttpDownloader: can't find referenced class com.squareup.okhttp.Cache
Warning:there were 52 unresolved references to classes or interfaces.
Warning:Exception while processing task java.io.IOException: Please correct the above warnings first.
Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
Job failed, see logs for details

这是我在构建release.apk时遇到的错误。
我尝试通过添加以下内容来修复它:
-dontwarn com.squareup.picasso.**

在我的pro guard-rules.pro文件中。

发布版.apk现在可以正确构建,至少表面上是这样的。

但是当我在手机上安装应用程序(或任何手机上),它在启动时崩溃,我认为是在使用Picasso加载图像时发生的。

请帮我解决这个问题。

我已经尝试了一些在互联网上找到的解决方案,并且从您那里提出的建议,它们似乎都可以正确构建,但是应用程序仍然会崩溃。除了pro guard规则之外,它可能取决于其他东西吗?

这是我的gradle的外观:

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

1
https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-picasso.pro - OneCricketeer
@cricket_007 谢谢,我也试过这个了,还是没有成功 :( - Daniele
1
那至少可以修复 Picasso,但不适用于其他库。 - OneCricketeer
@cricket_007,没有其他库发出任何警告。而且代码肯定没问题,因为在调试模式下构建apk时它是可以工作的。 - Daniele
@cricket_007 也没有运气 - Daniele
显示剩余2条评论
5个回答

41

你似乎仍在缩小OkHTTP

无法找到引用的类 com.squareup.okhttp

前往Picasso的Github页面

-dontwarn com.squareup.okhttp.**

1
谢谢您的回答。我也尝试使用了这个方法,但是没有成功。虽然它确实修复了问题,因为apk可以正常生成。但是当我安装应用程序时,一旦需要使用Picasso加载图像,应用程序就会在启动时崩溃。 - Daniele
你能过滤 logcat 中的错误而不是警告吗? - OneCricketeer
1
你确定在Gradle中加载了正确的Proguard文件吗? - OneCricketeer
2
这实际上修复了Picasso错误。应用程序崩溃是因为SearchView无法加载。我在我的混淆规则中添加了-keep class android.support.v7.widget.SearchView { *; },现在应用程序运行得非常完美。 - Daniele
1
这不是关于“压缩OkHTTP”还是不压缩的问题。那应该是-keep。在这里我们有-dontwarn文档中说:“指定完全不警告未解决的引用和其他重要问题。[...]忽略警告可能是危险的。例如,如果确实需要处理未解析的类或类成员,则处理后的代码将无法正常运行。”但是根据此问题,可以安全地忽略这些警告。 - caw
显示剩余3条评论

13

尝试将以下内容添加到您的 proguard.cfg 文件中:

#### -- Picasso --
 -dontwarn com.squareup.picasso.**

 #### -- OkHttp --

 -dontwarn com.squareup.okhttp.internal.**

 #### -- Apache Commons --

 -dontwarn org.apache.commons.logging.** 

谢谢回答,我会尝试一下。 - Daniele
我认为你想要使用 keep 而不是 dontwarn - OneCricketeer
1
没有任何问题,它能够成功构建,但在启动时一直崩溃。 - Daniele
@cricket_007 我应该“保留”什么? - Daniele
@Daniele,这个答案只是消除了警告。它并不能解决类无法解析的问题。 - OneCricketeer
显示剩余4条评论

2
proguard-rules.pro 中添加以下行即可解决问题:
-dontwarn com.squareup.okhttp.**

0

在您的应用 gradle 中尝试以下内容

minifyEnabled false shrinkResources false


这个想法不好,你正在尝试禁用Proguard。 - Kneelon

0

我的问题是我无法使用 minifyEnabled true 生成已签名的 APK,我通过将以下内容添加到 proguard-rules.pro 文件中解决了这个问题:

#for Picasso library
-dontwarn okio.
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform

如果上述方法仍然存在问题,您可以尝试使用以下方法:

#for Picasso library
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.* { *;}
-dontwarn okio.
-dontwarn okhttp3.internal.platform.ConscryptPlatform
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.ParametersAreNonnullByDefault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接