开启代码混淆的Release版本中Glide无法通过资源ID加载图片
解决Glide Release版本无法通过资源ID加载图片的问题
这个问题我之前帮不少开发者排查过,核心原因是Release打包时的ProGuard混淆/资源压缩操作破坏了Glide解析资源ID的逻辑——Debug版本没开启这些优化,R类里的资源ID能被正确识别,但Release版本就会出问题。下面给你具体的解决方案:
第一步:修正ProGuard配置
你现有的Glide ProGuard规则漏掉了关键的一项:保留R类的静态字段。资源ID都存在R$drawable这类内部类里,ProGuard在Release优化时会把未被“直接引用”的字段移除或重命名,导致Glide找不到对应的资源。
把你的ProGuard配置更新为:
# Glide 核心保留规则 -keep class com.bumptech.glide.** { *;} -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.GeneratedAppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # 关键补充:保留所有R类的静态字段,防止资源ID被混淆/移除 -keepclassmembers class **.R$* { public static <fields>; } # (可选)如果使用AndroidX AppCompat,额外保留其R类 -keep class androidx.appcompat.R$* { *; }
第二步:检查资源压缩设置
如果你的build.gradle里开启了shrinkResources true(资源压缩),即使ProGuard配置正确,也可能被Android的资源压缩工具误删Glide加载的图片——因为工具会认为这个资源只在代码里通过ID引用,没有在布局里显式使用,所以标记为“无用资源”删除。
解决方法是在res/raw/keep.xml(没有就新建这个文件)里添加规则保留目标图片:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/mydrawable" />
最后测试
更新配置后,clean项目再重新打包Release版本,应该就能正常通过资源ID加载图片了。另外提醒下:如果你有多个需要保留的图片,可以用逗号分隔,比如tools:keep="@drawable/mydrawable,@drawable/other_drawable"。
内容的提问来源于stack exchange,提问作者Akhil




