Android Fresco仅部分设备报ClassNotFoundException: androidx.exifinterface.media.ExifInterface
解决Fresco初始化阶段找不到androidx.exifinterface.media.ExifInterface的问题
针对你遇到的仅部分设备出现的ClassNotFoundException/NoClassDefFoundError问题,可按以下步骤排查解决:
1. 确保依赖正确引入到App模块
仅在库项目中添加依赖可能导致App模块未打包该类,需确认:
- 在
libs.versions.toml中配置正确的版本:[versions] exifinterface = "1.3.7" [libraries] exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" } - 在App模块的
build.gradle中显式引入依赖:dependencies { implementation libs.exifinterface }
若存在依赖冲突,可强制引入指定版本:
implementation libs.exifinterface { force = true }
2. 配置正确的R8/ProGuard规则
将以下规则添加到App模块的proguard-rules.pro或r8-rules.pro中,避免类或方法被移除:
# 保留ExifInterface核心类及所有成员 -keep class androidx.exifinterface.media.ExifInterface { *; } # 保留相关内部类(若有) -keep class androidx.exifinterface.media.** { *; } # 保留Fresco可能反射调用的构造方法和核心方法 -keepclassmembers class androidx.exifinterface.media.ExifInterface { public <init>(android.content.ContentResolver, android.net.Uri); public <init>(java.io.File); public <init>(java.io.InputStream); public java.lang.String getAttribute(java.lang.String); public void setAttribute(java.lang.String, java.lang.String); }
3. 排查依赖传递问题
执行./gradlew app:dependencies命令查看App模块的依赖树,确认androidx.exifinterface:exifinterface是否被正确引入,若发现某个依赖主动排除了该库,需针对性调整(例如移除对应依赖的exclude配置)。
4. 适配Fresco与ExifInterface版本兼容性
尝试升级ExifInterface到最新稳定版(如1.4.0),同时确认Fresco版本是否与该版本兼容——部分旧版Fresco可能对高版本ExifInterface存在适配问题,或反之。
附报错堆栈信息:
java.lang.ClassNotFoundException: androidx.exifinterface.media.ExifInterface [wrapped] java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/exifinterface/media/ExifInterface; at c6.b.a(b.java:8) at v5.f.l(f.java:482) at com.facebook.imagepipeline.producers.LocalFetchProducer.d(LocalFetchProducer.java:162) at com.facebook.imagepipeline.producers.SwallowResultProducer.run(SwallowResultProducer.java:12) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at com.google.android.material.datepicker.DateFormatTextWatcher.lambda$new$0(DateFormatTextWatcher.java:72) at androidx.activity.ComponentActivity$onBackPressedDispatcher$2$$ExternalSyntheticLambda1.run(ComponentActivity.java:0) at java.lang.Thread.run(Thread.java:919)
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

