多项目、依赖项目在Build APK时出现duplicate entry错误

来源:互联网 发布:项目经理薪水知多少 编辑:程序博客网 时间:2024/06/05 17:54

环境:

  Android Studio Version: 2.3.1

  Compile Sdk Version: API 17: Android 4.2 (Jelly Bean)

  Build Tools Version: 25.0.2


  先说说起因吧。最近有个项目的方案商提供的SDK比较棘手,方案商不打包自己的方法,几乎所有的内部参数调用都暴露给开发者。更难以接受的是所有的JNI方法都依赖于包名、路径,就是说如果我想截取他们demo里面的代码放在自己的项目使用会出现JNI方法NoImplement的error,即使so和jar包齐全也没用。

  无奈之下我只能把整个demo当作lib,通过Import Module导入到我的项目中。即我现在新建的项目是project1,里面已有名为app1的module,方案商给的demo的module是app2,我要把demo通过Import Module加到我的项目project1,这样project1就有两个module:app1,app2(项目名还是project1)。

  于是问题就来了,我 ReBuild Project 和 Run 'app' 都不会有问题,但是 Build APK的时候却报错:

  com.Android.build.api.transform.TransformException:Java.util.zip.ZipException: duplicate entry: xxx/xxx/xxx.class.

  从报错的信息来看是“重复加载”,网上搜索一下问题也大多是说jar包重复加载。我看了一下项目文件,app1\libs和app2\libs下的确都有同名的jar包,只是一个有依赖,一个没依赖(在Dependencies和gradle文件能看到)。


我的解决过程:

  我是把app2导入到app1(即app2作为lib),这个jar包是app2要使用的。然而app\lib中的jar包反而被app1依赖,app2\lib中的jar包没被app2依赖。可能是之前的同事尝试把方案商demo的代码整合到项目的时候的遗留。

  我先打开app1的Project Structure,找到Dependencies,把jar包remove,然后打开app1的gradle,把这个jar包的compile语句删除。由于这个jar包是app2依赖的,删除jar包后项目就完全没有依赖这个jar包会报错app2\lib中的jar包只存在,没Add)。报错全都在app2(app1没方法依赖这个jar包,没报错)。接着我打开app2的Project Structure,add这个jar包(也可以在app2的gradle写compile)。Rebuild Project后不报错了,Build APK也不报错了。


疑问:

  为什么app2依赖的jar包不出现在app2的Dependencies,反而出现在app1的Dependencies?即在app1\lib的jar包Add as Library,而在app2\lib的jar包反而没有Add as Library。

  Run 'app' 的时候Android Studio其实已经产生一个APK了(在 project1\app\build\outputs\apk里),为什么Build APK的时候才报错duplicate entry。

0 0