天天看點

gradle implementation、compileOnly、api

最近在做項目的時候,由于使用了3.x的gradle,在制作完成sdk後使用到宿主工程後發現原本可用的string資源找不到了,原因是對于新版本的依賴還沒有完整的看過,隻是知道使用implementation代替了compile,api的使用等,這裡寫一篇做一個備注。

Android Studio3.x 相比 2.x的版本,gradle版本相應的要求更新為了3.x了,更新後,預設的依賴compile變更為implementation,

但是并非僅僅是這個變更,會有提示:

Configuration 'compile' is obsolete and has been replaced with 'implementation'.
It will be removed at the end of 2018      

其實除此外還有api和compileOnly,是以需要了解他們的機制,官網上有介紹

也就是現在

compile拆分成了api和implementation兩個,分工更加細緻了,

implementation:讓依賴僅僅使用在自己的子產品中,在編譯的時候依賴項不會被他子產品使用,但是在運作時可以被其他子產品使用。這樣

可以顯着縮短建構時間,因為它減少了建構系統需要重新編譯的子產品數量。

api:當子產品包含api依賴項時,子產品的依賴項傳遞到其他子產品,在運作時和編譯時其他子產品都可以使用它,如果api依賴的項更改了,Gradle将重新編譯在編譯時有權通路該依賴項的所有子產品,是以,api依賴項會增加建構時間。

compileOnly:

如果使用此配置,則庫子產品必須包含運作時條件以檢查依賴項是否可用,然後正常更改其行為,以便在未提供時仍可正常運作。 這有助于通過不添加不重要的瞬态依賴項來減小最終APK的大小。 此配置的行為與provided的一樣(現已棄用)。

下面時對官網介紹的翻譯:

implementation

compile

Gradle将依賴項添加到編譯類路徑,并将依賴項打包到建構輸出。 但是,當您的子產品配置一個implementation依賴項時,它讓Gradle知道您不希望子產品在編譯時将依賴項洩漏給其他子產品。 也就是說,依賴性僅在運作時可用于其他子產品。使用此依賴項配置而不是api或compile(不建議使用)可以顯着縮短建構時間,因為它減少了建構系統需要重新編譯的子產品數量。 例如,如果實作依賴項更改其API,則Gradle僅重新編譯該依賴項以及直接依賴于它的子產品。 大多數應用和測試子產品都應使用此配置。

api

compile

Gradle将依賴項添加到編譯類路徑并建構輸出。 當子產品包含api依賴項時,它讓Gradle知道子產品想要将該依賴項傳遞到其他子產品,以便在運作時和編譯時都可以使用它。

此配置的行為與compile(現在已棄用)類似,但您應謹慎使用它,并且隻能将您需要的依賴項傳遞給其他上遊使用者。 這是因為,如果api依賴項更改其外部API,Gradle将重新編譯在編譯時有權通路該依賴項的所有子產品。 是以,擁有大量的api依賴項可以顯着增加建構時間。 除非您希望将依賴項的API公開給單獨的子產品,否則庫子產品應該使用implementation依賴項。

compileOnly

provided

Gradle僅将依賴項添加到編譯類路徑(即,它不會添加到建構輸出中)。 這在建立Android子產品時非常有用,并且在編譯期間需要依賴項,但在運作時是可選的。

如果使用此配置,則庫子產品必須包含運作時條件以檢查依賴項是否可用,然後正常更改其行為,以便在未提供時仍可正常運作。 這有助于通過不添加不重要的瞬态依賴項來減小最終APK的大小。 此配置的行為與provided的一樣(現已棄用)。

runtimeOnly

apk

Gradle僅将依賴項添加到建構輸出,以便在運作時使用。 也就是說,它不會添加到編譯類路徑中。 此配置的行為與apk(現已棄用)相同。

annotationProcessor

compile

要添加對作為注釋處理器的庫的依賴關系,必須使用annotationProcessor配置将其添加到注釋處理器類路徑。 這是因為使用此配置可以通過将編譯類路徑與注釋處理器類路徑分開來提高建構性能。 如果Gradle在編譯類路徑上找到注釋處理器,它會停用編譯避免,這會對建構時間産生負面影響(Gradle 5.0及更高版本忽略在編譯類路徑中找到的注釋處理器).Android Gradle Plugin假定依賴是一個注釋處理器,如果它的JAR檔案 包含以下檔案:META-INF / services / javax.annotation.processing.Processor。 如果插件檢測到編譯類路徑上的注釋處理器,則會産生建構錯誤。

繼續閱讀