android studio 代码混淆打包错误 The same input jar is specified twice

本文介绍了解决Android Studio中使用代码混淆时遇到的Thesameinputjarisspecifiedtwice错误的方法。通过调整proguard配置文件避免重复指定jar文件。
android studio 代码混淆打包错误 The same input jar is specified twice

使用android studio 以来,还没有使用过代码混淆打包,正好赶上项目马上要上线,所以使用代码混淆打包 发现android studio 跟eclipse还是有不同地方

为了方便 所以把之前eclipse中的proguard的文件直接copy过来  然后修改了一下进行打包 结果出现The same input jar is specified twice这个错误 然后也是非常困惑 ,所以只能在网上找答案了 其实主要原因就是我们在build.gradle文件中已经配置过jar文件了


所以在proguard文件中 以下内容可以删除或注释掉,我这里选择注释掉


然后再次进行打包 不会在出现The same input jar is specified twice这个问题了



文/CoderLeo(简书作者)
原文链接:http://www.jianshu.com/p/b39af6175b79
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
<think>嗯,用户现在遇到了ProGuard在处理JAR文件时出现的ava.io.IOException冲突问题,具体是相同的输入jar被指定了两次。根据用户提供的引用信息,特别是引用[1]和[3],错误信息显示同一个jar文件被重复引用了,比如rt.jar或者alipaySdk-20160825.jar。而引用[4]中提到解决办法是检查并删除proguard配置中的重复-libraryjars条目。 首先,我需要确认用户的问题是否与这些引用中的情况类似。用户提到使用的是ProGuard 7.4.0,但引用中的例子使用的是旧版本(如5.2、4.4),所以可能需要考虑版本差异带来的配置变化。不过,错误的核心原因应该是一致的:输入jar被多次指定。 接下来,用户可能是在Maven项目中配置了ProGuard插件,导致在打包时触发了这个错误。根据引用[1]中的错误信息,问题出现在执行Maven Install时,ProGuard的配置中重复引用了rt.jar。rt.jar是Java运行时库,可能在ProGuard配置中被默认包含,或者用户手动添加了-libraryjars指向它,导致冲突。 根据引用[4]的解决方案,用户需要检查proguard配置文件(如proguard.cfg或proguard.pro)中的-libraryjars或-injars指令,是否有重复的条目。比如,如果用户的项目已经通过Maven依赖引入了某个库,同时在proguard配置中又用-libraryjars libs/xxx.jar手动添加了一次,就会导致重复。 另外,用户可能没有注意到Maven的依赖管理会自动将依赖的jar包含到构建路径中,而ProGuard插件可能也会自动包含这些依赖,导致重复。这时候需要检查ProGuard插件的配置,看是否有排除重复的选项,或者手动调整配置文件。 还需要考虑ProGuard版本的问题,7.4.0可能有一些配置上的变化,需要确认是否有新的参数或配置方式。例如,是否某些旧的配置语法在新版本中不再适用,或者是否有自动处理重复的机制。 可能的解决步骤包括: 1. 检查ProGuard配置文件中的-libraryjars和-injars指令,删除重复的条目,特别是手动添加的与Maven依赖重复的部分。 2. 确认Maven的ProGuard插件配置是否正确,是否排除了系统库的重复引用。 3. 检查项目依赖,是否有多个地方引用了同一个jar包,比如在libs目录和Maven仓库中都有。 4. 使用Maven的依赖树分析工具(如mvn dependency:tree)查看是否有重复的依赖项,并进行排除。 5. 更新ProGuard插件到最新版本,确保已知的问题已被修复。 此外,用户可能在之前的步骤中配置了多个输入源,比如在插件配置中指定了输入jar,同时在proguard配置文件中又指定了相同的jar,导致冲突。需要统一配置,避免重复。 还需要注意,某些构建工具或IDE可能会自动添加默认的库路径,如rt.jar,这时候在ProGuard配置中显式引用就会导致重复。可以尝试注释掉这些显式引用,让ProGuard自动处理。 最后,建议用户清理构建目录并重新构建,确保没有旧的配置文件或缓存导致问题。</think>### ProGuard 7.4.0 中 `java.io.IOException: same input jar conflict` 的解决方案 #### 一、问题根源分析 错误 `java.io.IOException: The same input jar [...] is specified twice` 表示 **同一个 JAR 文件被多次声明为 ProGuard 的输入源**。常见原因包括: 1. **显式配置冲突**:在 ProGuard 规则文件(如 `proguard.pro`)中重复使用 `-libraryjars` 或 `-injars` 指令引用同一 JAR 文件[^1][^3]。 2. **构建工具自动引入**:Maven/Gradle 自动添加依赖项,与手动配置的 `-libraryjars` 产生重复[^4]。 3. **系统类库重复**:默认包含的 JRE 类库(如 `rt.jar`)被手动添加[^1]。 --- #### 二、分步解决方案 ##### 1. 检查 ProGuard 配置文件 - **定位重复条目** 在 ProGuard 规则文件(如 `proguard.pro`)中搜索以下内容: ```properties -libraryjars libs/xxx.jar # 手动添加的本地 JAR -injars libs/xxx.jar # 输入 JAR 声明 ``` 若发现如 `-libraryjars libs/alipaySdk-20160825.jar` 的重复项,**注释或删除重复行**: ```properties #-libraryjars libs/alipaySdk-20160825.jar # 注释掉重复项 ``` ##### 2. 处理 Maven 依赖冲突 - **检查 Maven 依赖树** 运行以下命令分析依赖关系: ```bash mvn dependency:tree -Dincludes=groupId:artifactId ``` 若发现同一 JAR 被多个依赖间接引入,**在 `pom.xml` 中排除重复项**: ```xml <dependency> <groupId>com.example</groupId> <artifactId>example-lib</artifactId> <exclusions> <exclusion> <groupId>conflicting-group</groupId> <artifactId>conflicting-artifact</artifactId> </exclusion> </exclusions> </dependency> ``` ##### 3. 避免系统类库重复 - **移除对 `rt.jar` 的显式引用** ProGuard 默认包含 JRE 类库,无需手动添加。检查并删除如下配置: ```properties #-libraryjars <java.home>/lib/rt.jar # 注释或删除此行 ``` ##### 4. 更新 ProGuard 配置语法(针对 7.x 版本) ProGuard 7.x 对插件化构建支持更完善,建议使用 **`-if` 条件语句** 或 **`-filter` 指令** 替代重复声明: ```properties # 示例:动态排除重复项 -if @{java.version} >= 9 -libraryjars ${jdk.home}/jmods/java.base.jmod(!**.jar;!module-info.class) -else -libraryjars ${java.home}/lib/rt.jar ``` ##### 5. 配置 Maven 插件(关键步骤) 在 `pom.xml` 中明确指定 ProGuard 输入输出范围,避免自动扫描导致冲突: ```xml <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.6.0</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <!-- 限制输入仅包含项目构建结果 --> <injar>${project.build.finalName}.jar</injar> <outjar>${project.build.finalName}-obfuscated.jar</outjar> <!-- 禁止自动添加依赖库 --> <addDependencies>false</addDependencies> </configuration> </plugin> ``` --- #### 三、验证与调试 1. **清理构建环境** 执行 `mvn clean install` 确保无残留文件干扰。 2. **启用 ProGuard 详细日志** 在 `proguard.pro` 中添加: ```properties -verbose -printconfiguration proguard-config.log ``` 检查生成的 `proguard-config.log` 确认输入项无重复。 --- #### 四、扩展优化建议 - **统一依赖管理**:优先使用 Maven/Gradle 管理 JAR 依赖,避免手动添加 `libs/` 目录文件[^4]。 - **条件化配置**:利用 `-if` 指令区分不同环境(如 JDK 8 与 JDK 11+)[^1]。 - **版本对齐**:升级 ProGuard 插件至最新版(如 `7.4.0`),修复已知兼容性问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值