Android 启用proguard时,滑动加载图像显示为黑色

Android 启用proguard时,滑动加载图像显示为黑色,android,android-glide,Android,Android Glide,我从drawable加载图像,如果启用proguard,它通常会显示黑色图像 如果我构建了debug disable proguard,一切看起来都很好 这是我在proguard中的配置: -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.module.AppGlideModule -keep public en

我从drawable加载图像,如果启用proguard,它通常会显示黑色图像 如果我构建了debug disable 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 *;
}
这是我的代码glide 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);
}

不要忘记在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);

不要忘记在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);

你为什么不这样使用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后重建项目。为什么不这样使用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后重建项目

我找到了此问题的原因:

我在构建版本中使用了sinkResource,这样android studio就无法在我的项目中检测到我按名称使用的一些图片


我需要删除proguard中的sinkresource或保留drawable文件夹我找到了此问题的原因:

我在构建版本中使用了sinkResource,这样android studio就无法在我的项目中检测到我按名称使用的一些图片


我需要删除proguard中的sinkresource或保留drawable文件夹,这不是因为你的proguard文件,而是当你提到 shrinkResources在release build类型中为true,而在release模式下生成应用程序时,它将收缩未使用的资源或表示java代码中未提及的资源

因此,将发布类型中的shrinkResources保持为false,如下所示:

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

这不是因为你的proguard文件,而是当你提到 shrinkResources在release build类型中为true,而在release模式下生成应用程序时,它将收缩未使用的资源或表示java代码中未提及的资源

因此,将发布类型中的shrinkResources保持为false,如下所示:

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

所以我一直试图在不使用shrinkResources false的情况下解决这个问题,因为我想使用它,但保留特定的文件

在我的例子中,我使用.json获取图像名称,并使用本地图像显示。但resource shrinker认为这些图像是未使用的,并删除了所有未使用的图像,即使我通过调用resources.getIdentifier来使用它们。说

使用resources.getIdentifier时,默认情况下资源收缩器的行为是防御性的,并使用匹配的名称格式将所有资源标记为可能已使用且不可删除

但我使用.json作为对象获取图像名称,所以没有任何类似img_1d的字符串。这就是为什么资源缩减者认为我的图片没有使用

要解决这个问题,您可以创建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" />
使用逗号添加更多文件,并使用星号字符作为通配符


所以我一直试图在不使用shrinkResources false的情况下解决这个问题,因为我想使用它,但保留特定的文件

在我的例子中,我使用.json获取图像名称,并使用本地图像显示。但resource shrinker认为这些图像是未使用的,并删除了所有未使用的图像,即使我通过调用resources.getIdentifier来使用它们。说

使用resources.getIdentifier时,默认情况下资源收缩器的行为是防御性的,并使用匹配的名称格式将所有资源标记为可能已使用且不可删除

但我使用.json作为对象获取图像名称,所以没有任何类似img_1d的字符串。这就是为什么资源缩减者认为我的图片没有使用

要解决这个问题,您可以创建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" />
使用逗号添加更多文件,并使用星号字符作为通配符


您好,请检查我的问题,我添加了这些行注意:我从http url获取图像是可以的,但从drawable获取,它显示为黑色。您必须在此处发布代码,然后我们才能了解是否存在任何问题hi,请检查我的问题,我添加了这些行注意:我从http url获取图像是可以的,但从drawable获取,它显示为黑色。您必须在此处发布您的代码,然后我们才能了解是否存在任何问题我只需使用-dontwarn glide.*@phongvani只需使用-dontwarn glide.*@phongvan