You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:03