我从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);
}
答案 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" />
使用逗号添加更多文件,并使用星号字符作为通配符。
答案 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 之后,不要忘记重建项目