Android 启用proguard时,滑动加载图像显示为黑色
我从drawable加载图像,如果启用proguard,它通常会显示黑色图像 如果我构建了debug disable proguard,一切看起来都很好 这是我在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
-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