启用程序时,滑行加载图像显示黑色

时间:2018-03-17 10:13:35

标签: android android-glide

我从drawable加载图像,如果启用proguard,它通常会显示黑色图像 如果我构建调试(禁用proguard),一切看起来都不错。

这是我在proguard中的配置:

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

这是我的代码(滑翔4.6.1):

加载图片:

 Apploader.load("",holder.imageView,MyUtils.getDrawableRessourceID(item.getFlag().toLowerCase(Locale.ENGLISH).substring(0, 2)));

public static void load(Object uri, ImageView img, int drawable) {
    RequestOptions options = RequestOptions.centerInsideTransform().placeholder(new ColorDrawable(ContextCompat.getColor(context, R.color.gray))).error(drawable).diskCacheStrategy(DiskCacheStrategy.RESOURCE);
    Glide.with(context).load(uri)
            .apply(options)
            .thumbnail(0.5f)
            .into(img);
}

5 个答案:

答案 0 :(得分:1)

不要忘记在proguard规则中包含滑行依赖

在proguard-rules.pro文件中添加以下代码行

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
 **[] $VALUES;
 public *;
 }
 # Uncomment for DexGuard only
 #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

它毫无疑问地运作,或者你试试这个

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

在代码中

  GlideApp
.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.into(myImageView);

答案 1 :(得分:1)

我找到了这个问题的原因:

我在构建版本中使用了sinkResource,因此android studio无法检测到我在项目中按名称使用的某些图片。

我需要删除sinkresource或在proguard中保留drawable文件夹

答案 2 :(得分:1)

这不是因为你的proguard文件,而是你提到的时候 在发布版本类型中shrinkResources true,与在发布模式下生成应用程序时相比,它会缩小未使用的资源(或者说在java代码中没有提到的资源)。

所以,请将发布类型中的shrinkResources false保留为:

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

答案 3 :(得分:1)

因此,我一直尝试不使用shrinkResources false来解决此问题,因为我想使用它,但保留特定文件。

就我而言,我使用.json来获取图像名称,并使用本地图像来显示。但是resource shrinker认为这些图像是未使用的,即使我通过调用resources.getIdentifier()来使用它们也删除了所有未使用的图像。 Doc表示

使用resources.getIdentifier()时,资源收缩器默认情况下具有防御性,并会将所有具有匹配名称格式的资源标记为潜在使用且不可删除。

但是我使用.json来获取图像名称作为对象,因此没有像String这样的"img_%1d"。这就是resource shrinker认为我的图像未使用的原因。

要解决此问题,您可以创建keep.xml并定义要保留的资源,如下所示;

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2" />

使用逗号添加更多文件,并使用星号字符作为通配符。

Detailed info

答案 4 :(得分:0)

为什么你不能像这样使用GlideApp

public static void load(Object uri, ImageView img, int drawable) {

GlideApp.with(context)
        .load(uri)
        .placeholder(drawable)
        .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
        .into(img);
 }

只需要为AppGlideModule添加新类,如下所示:

import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.module.AppGlideModule

@GlideModule
class AppGlideModule : AppGlideModule()
在创建AppGlideModule

之后,不要忘记重建项目