天天看點

android aar中的gradle依賴,Android gradle aar不能傳遞依賴

先來看下gradle依賴的幾種常見的關鍵詞

新配置 已棄用配置 行為 本Module 上層Module

implementation compile implementationapi/compile顯著縮短建構時間,因為它可以減少建構系統需要重新編譯的項目量。 大多數應用和測試子產品都應使用此配置。 編譯&運作 運作

api compile compileimplementation,除非您想要将其 API 公開給單獨的測試子產品。 編譯&運作 編譯&運作

compileOnly provided provided(現在已棄用)。 編譯 -

runtimeOnly apk apk(現在已棄用)。 運作 運作

上表中,“編譯”表示在本Module中編譯過程時可以使用lib,"運作"表示在本Module在運作時可以使用lib。舉例,A依賴B,B依賴C,在B中使用“implementation”依賴時“implementation 'com.google.code.gson:gson:2.6.2'”,B可以在編譯和運作時都可以使用gson庫中代碼。但是,A隻能在運作時才能使用gson庫中的代碼,編譯時,也就是寫代碼的時候,是無法引用到gson庫中的代碼的。

上述的依賴傳遞僅适用于遠端依賴,例如“implementation 'com.example.android:app-magic:12.3'”。但是對于本地aar依賴,比如“implementation files('libs/foo.jar', 'libs/bar.jar')”是不一樣的。

在Module中使用了implementation關鍵詞依賴了遠端庫,比如“implementation 'com.google.code.gson:gson:2.6.2'”,然後我把Module打包成aar,依賴到其他的Module中,運作的時候會出現"java.lang.NoClassDefFoundError:gson"的異常。這是不是很奇怪,我明明已經把庫依賴進去了,但是打成aar之後,就報錯。在目前Module運作時沒有這個報錯。原因是,遠端依賴是存放在xxx.pom檔案中的,而打包成aar後已經不帶有這些特性。是以當然是無法傳遞這個依賴了。但是如果是jar/aar本地依賴進來的,那是被打進aar内部的,是以還是可以使用的。