Android项目使用Rome库发布构建报ClassNotFoundException是否为Proguard导致?
问题原因
Rome库的RSS/Atom解析能力依赖SPI(服务发现接口)机制动态加载各个格式对应的Converter、解析器实现类,这些类不会被你的业务代码显式引用,所以当构建开启R8/ProGuard混淆收缩、资源收缩时,这些没有被显式引用的类和对应的SPI配置文件会被误移除,最终触发动态加载时的ClassNotFoundException。
解决方案
1. 加入Rome专属混淆规则
打开你的项目proguard-rules.pro文件,添加如下规则:
# 保留Rome库所有核心类和接口 -keep class com.rometools.** { *; } -keep interface com.rometools.** { *; } # 保留Rome的SPI服务实现类 -keep class * implements com.rometools.rome.feed.synd.Converter -keep class * implements com.rometools.rome.io.WireFeedParser -keep class * implements com.rometools.rome.io.WireFeedGenerator # 避免混淆注解和反射相关的类 -keepattributes *Annotation*,Signature,InnerClasses
2. 保留SPI配置文件避免被收缩移除
你开启了shrinkResources true,需要在项目的app/src/main/res/raw/keep.xml文件(如果没有就新建一个)中添加如下配置,避免Rome依赖的服务配置文件被误删:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="META-INF/services/com.rometools.*" />
3. 排查Multidex问题
如果你的项目minSdk低于21,且方法数超过64k,请确认你已经正确配置Multidex:
- 在build.gradle的dependencies中添加Multidex依赖
- 你的Application类继承
MultiDexApplication,或者在attachBaseContext方法中调用MultiDex.install(this)
4. 快速验证方法
如果要快速确认问题是否由混淆/资源收缩导致,可以临时将release构建配置修改为:
release { minifyEnabled false shrinkResources false // 其余配置保持不变 }
重新构建运行如果没有报错,就说明前面的混淆和资源保留规则即可解决问题。
内容的提问来源于stack exchange,提问作者Bobabooy114
相关产品推荐
相关产品推荐

