簡體   English   中英

Android Studio項目運行正常,但由於“多個dex文件…”而導致構建APK失敗

[英]Android Studio project runs fine but build APK fails due to “multiple dex files…”

使用Android Studio 3.0,我有一個具有以下布局的Android應用程序項目:

app
 |
 - lib-foo
 - lib-bar

因此,我有一個應用程序模塊,使用兩個分別稱為lib-foolib-bar庫模塊。

現在,這是有趣的部分:

  • lib-foo模塊直接包含Java源文件com.foo.Foobar.java
  • lib-bar模塊包含一個內聯的.aar文件,該文件作為implementation files('libs/some-3rd-party-lib.aar') ,而該庫包含com.foo.Foobar.java

運行和調試該項目運行正常,生成了APK,並在手機上運行良好。 但是,當我嘗試執行“構建APK”時,它會失敗並顯示

Multiple dex files define Lcom/foo/Foobar;

是的,該文件確實存在於兩個地方,但是我不確定要怎么看。 我可以想象到,“運行”和“構建APK”之間的區別是使用proguard等,而是僅通過AS正常運行應用程序時“構建APK”失敗的原因,或者有什么區別? ?

是否不允許在兩個不同的庫模塊的兩個地方有相同的源文件,而該文件僅在模塊內部內部使用? 我知道最后,將整個類集合並到最終APK內的一個classes.jar ,但是對於完全相同的類的重復項肯定必須具有某種容忍度,否則每個人在事情上都會發生沖突像apache-commons等在很多庫中大量使用的?

還是實際上是在兩個不同的模塊內部允許重復的文件,但是.aar文件的靜態直接包含會弄亂事情?

我該如何解決這個問題? 如果我可以控制第三方庫,那么我想我可以將公共文件提取為另一個包含最小公分母的庫,並從需要它們的兩個模塊中將其作為gradle依賴來獲取,但是我無法控制第三方庫政黨圖書館。 如果這只是由此內聯.aar包含(大量推測)引起的一些錯誤,也許將第3方庫放在Maven上並以版本化依賴關系而不是靜態文件的形式來獲取它會成功嗎?

我想確切了解為什么會失敗,為什么直接從AS運行應用程序時它不會失敗以及如何解決它。 我寧願不將com.foo.Foobar.java重命名為com.foo.MyRenamedFooBar.java來消除沖突。

DEX文件中具有基於其完全限定的Java類名稱的類。 結果,當涉及到Java類時,引用舊的電影和電視節目 ,對於任何給定的標准Java類名稱,“只能有一個”。

對於來自工件存儲庫的依賴關系(您的apache-commons場景),Gradle可以將其排除,僅包含一次依賴關系。 但是,這在工件級別上有效。 因此,例如,如果您的應用程序依賴於apache-commons 在其源代碼中有一個來自apache-commons的Java類,則該類將有兩個副本(一個來自於依賴關系,一個來自於源代碼),並且Gradle無法執行關於那件事。

通常,如果您有2個以上的類具有相同的完全合格的類名稱,則將出現某種構建錯誤。 Android Studio 3.0大大改善了對這種情況的檢測,因為我們從Stack Overflow上報告的重復類中發現了許多新的構建錯誤。

顯然,您遇到了一個極端的情況,即至少在所有情況下,Android Studio均未檢測到它(例如,Instant Run缺少它)。 如果您可以創建可復制的測試用例,請提出問題,然后工具團隊可以解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM