1. 程式人生 > >多專案、依賴專案在Build APK時出現duplicate entry錯誤

多專案、依賴專案在Build APK時出現duplicate entry錯誤

環境:

  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。