1. 程式人生 > 實用技巧 >uni-app打包報錯Caused by: com.android.tools.r8.errors.CompilationError: Program type already present:

uni-app打包報錯Caused by: com.android.tools.r8.errors.CompilationError: Program type already present:

uni-app打包Android外掛報錯Caused by: com.android.builder.multidex.D8MainDexList$MainDexListException: com.android.tools.r8.errors.CompilationError: Program type already present: ...

1.前言

  • 最近在做uni-app打包整合android外掛總是報上面的錯誤,在Android studio上執行就是可以的。這裡做一個總結避免再次掉坑。也希望能幫到在看的你。

2.問題描述點

  • 從編譯上就可以看出,很明顯是編譯時某一個檔案衝突了,衝突的地方就是省略號類的路徑。這裡描述出現的幾種情況。

    2.1.和前端程式碼類名重合

    • 之前對一個類名叫App.java,我自己打包測試是正常的,但整合到前端做外掛報錯提示這個類有誤,原因是前端也有起相同的名字,結果衝突了。

    2.2.外掛前端替換有誤

    路徑
    • Android提供外掛給前端aar包是不可少的,放在什麼路徑就不多說了,截圖如上,之前給前端的aar名字不叫plugin-release,前端是採用替換的方法,名字不一樣自然不會替換,而是有兩個aar檔案,雖然名字不同但內容大部分是一樣的,這就導致了兩個aar內部的有檔名稱相同起了衝突。前端在替換的時候最好是將nativeplugins下的相關外掛包內容全部刪掉再拷貝進來

    2.3.專案依賴問題(最易發生)

    • 先上幾張圖,後面解釋:
      在這裡插入圖片描述
      在這裡插入圖片描述
      在這裡插入圖片描述
      AndroidStudio的module下的build.gradle檔案內dependencies節點下的依賴方式有compileOnly,implementation,api三種,解釋如下:

      compileOnly:只在編譯時有效,不會參與打包
      implementation:所依賴的庫不會傳遞,只會在當前module中生效。
      api:該依賴方式會傳遞所依賴的庫,當其他module依賴了該module時,可以使用該module下使用api依賴的庫。

    • 1.uni-app的package.json資料夾內的dependencies需要新增Android的build.gradle指定的依賴,不指定好像也行,不過官方文件上說需要,但像v4,v7包的這些預設已經整合,所以不用寫。

    • 2.如果用到了ndk,也需要在package.json內指定一下abis節點

    • 3.在AndroidManifest.xml下用到的許可權也需要在package.json的permissions節點下指定

    • 4.所有的aar檔案都必須放到Android目錄下,如果在Android studio的libs目錄下有aar檔案,注意移出來。

    • package.json內配置不太清楚的,這裡附上uni-app官方package.json配置詳解

最後

  • 這個出現這個錯誤通常都是依賴重複了,報的錯誤提示也比較詳細。但你知道,uni-app打包次數每天是有限制的,而且打包也比較耗時。所以最好還是在一開始就注意一下各個依賴的問題。
  • 如果有什麼疑問,下面留言。或有不足的也歡迎指正~