gradle新的依賴方式你真的瞭解嗎?
在 gradle3.0之前,gradle 依賴專案配置有 compile,apk,provided三種方式
compile:指定編譯時依賴項。Gradle 將此配置的依賴項新增到類路徑和應用的 APK。這是預設配置。
apk: 指定 Gradle 需要將其與應用的 APK 一起打包的僅執行時依賴項。您可以將此配置與 JAR 二進位制依賴項一起使用,而不能與其他庫模組依賴項或 AAR 二進位制依賴項一起使用。
provided:指定 Gradle 不與應用的 APK 一起打包的編譯時依賴項。如果執行時無需此依賴項,這將有助於縮減 APK 的大小。您可以將此配置與 JAR 二進位制依賴項一起使用,而不能與其他庫模組依賴項或 AAR 二進位制依賴項一起使用。
從上面截圖可以看到,在AS 的 project structure的新增 dependency 介面,你會看到每個 dependency 後面可以致命 scope, 因為我的 gradle 是3.0版本,compile,apk,provided 這三種依賴方式已經 deprecated. 取而代之的implementation, api, compileOnly, and runtimeOnly幾種方式
那新舊之間有什麼不同呢?
gradle3.0之前的 build.gradle 檔案是這樣的,依賴專案預設都是通過compile
而gradle3.0後,module 下的build.gradle 專案依賴可以是這樣子
gradle3.0或者以上版本 | 3.0之前(deprecated) | 說明 | 作用 |
---|---|---|---|
implementation | compile | gradle升級到3.0之後,新增了 implementation, 而compile 方式被標記為了deprecated, compile 在3.0之後仍然可以使用,但是 gradle 官方說會在 gradle 後續的某次重要升級後變為不可用. | 如果我們使用了implementation方式來依賴專案的話,那麼這個庫就在編譯時期,只對當前的module可見,對其他的module不可見,但是在執行使其是可見的,這種方式的好處是可以顯著減少 build專案的時間,因為假如該依賴庫有介面或者程式碼變動,那麼Gradle只會去重新編譯和它有直接依賴關係的module,也就是該庫不存在傳遞性 |
api | compile | 同上 | 使用api方式來依賴專案或者庫的話,那麼這個庫,在編譯時期和執行時期都可以對其他module可見 |
compileOnly | provided | 3.0之後版本,使用compileOnly來替代provided | 假如在專案中,對某些庫你只是想要在編譯時期使用,而在執行時期並不需要這個庫,你可以使用這種方式! |
runtimeOnly | apk | 3.0之後,使用 runtinmeOnly來替代apk | Gradle 在執行時會將該庫新增到 build 的 output 中去 |
也許到此刻,有些同學還是處於懵懵懂懂的狀態,下面讓我以幾個例子來詳細說明他們的作用
在我的專案裡共有 app,common,factory,lang這4個module
他們的依賴關係是 [app->factory->common->lang]
那麼此時如果我的 common這個 module中使用 implementation 來引入 gson 庫,那麼在 factory 和 app 這兩個 module中,你是無法是用Gson 的,編譯時期是無法找到這個類的,implementation 不具有傳遞性,如果使用 api 或者 compile 來引入 gson 庫,便可以在 app 和 factory 中直接使用 gson 庫,而不必再次引入.
什麼時候用到 compileOnly呢?
我們在開發的時候,如果想要檢視 PhoneWindow ,WindowManager 這些 framework 層的程式碼,可以將 sdk 中的 platforms中的 android.jar 放入 lib 資料夾中,然後add as Library,此時會在 build.gradle 檔案中生成一句
implementation files('libs/android.jar')
我們可以將 implementation替換為 compileOnly,此時就可以檢視 PhoneWindow 這些 framework 層的原始碼了
以上如有錯誤,請多指教!