API 19运行时出现java.util.zip.ZipException重复条目n.class问题求助
解决API 19环境下Jar合并重复类的问题
首先,你遇到的这个ZipException: duplicate entry: n.class错误,本质是多个依赖包中包含了完全相同的类文件——API 21环境下可能因为构建工具或Multidex的处理逻辑不同没触发,但API 19对类合并的校验更严格,所以暴露了问题。下面是一步步的排查和解决方法:
一、先定位重复类的来源
要解决重复类问题,首先得知道这个n.class到底来自哪两个Jar包。运行以下Gradle命令获取详细的构建日志:
./gradlew app:transformClassesWithJarMergingForDebug --info
在输出日志里搜索duplicate entry: n.class,旁边会明确标注这个类来自哪两个文件,比如类似这样的内容:
duplicate entry: n.class来自 [jar1路径] 和 [jar2路径]
这一步是关键,能帮你精准定位冲突的依赖。
二、根据定位结果处理重复依赖
常见的重复场景和处理方式:
- 本地Jar和远程/项目依赖重复:你配置里同时有
compile project(':Library_MobilePaymentSDK')和compile files('libs/mpaysdk-sandbox-1.0.28.jar'),这两个很可能是同一个支付SDK的不同形式(项目依赖和本地Jar),保留其中一个即可。比如如果项目依赖已经包含了SDK的全部内容,就删掉本地Jar的依赖行。 - 两个远程依赖重复:如果是两个第三方库包含了相同的类,就用
exclude语法排除其中一个的冲突模块。比如假设冲突来自某两个库,就修改依赖:compile('冲突的库坐标') { exclude group: '冲突的组名', module: '冲突的模块名' }
三、检查API 19的Multidex适配
API 19及以下版本对Multidex的支持需要额外的代码配置,只在build.gradle里开multiDexEnabled true是不够的:
- 修改你的Application类:
- 要么让它继承
MultiDexApplication:public class YourApp extends MultiDexApplication { // 你的应用逻辑 } - 如果你已经继承了其他Application类,就在
attachBaseContext方法里手动安装Multidex:@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
- 要么让它继承
- 确认
build.gradle里已经引入Multidex依赖:compile 'com.android.support:multidex:1.0.1'
四、尝试更新老旧依赖和构建工具
你当前用的buildToolsVersion "25.0.0"以及Firebase/Play Services 10.0.0版本都比较旧,可能存在API 19的兼容性问题:
- 把
buildToolsVersion更新到28.0.3(这是和compileSdkVersion 24兼容的稳定版本) - 将Firebase/Play Services版本更新到对应compileSdk的版本,比如
11.0.4(适配SDK 24)
五、清理缓存重建项目
每次修改依赖或配置后,记得执行以下命令清理缓存并重新构建,避免旧缓存影响结果:
./gradlew clean ./gradlew assembleDebug
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

