1. 程式人生 > >gradle新的依賴方式你真的瞭解嗎?

gradle新的依賴方式你真的瞭解嗎?

在 gradle3.0之前,gradle 依賴專案配置有 compile,apk,provided三種方式

  1. compile:指定編譯時依賴項。Gradle 將此配置的依賴項新增到類路徑和應用的 APK。這是預設配置。

  2. apk: 指定 Gradle 需要將其與應用的 APK 一起打包的僅執行時依賴項。您可以將此配置與 JAR 二進位制依賴項一起使用,而不能與其他庫模組依賴項或 AAR 二進位制依賴項一起使用。

  3. 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 層的原始碼了

以上如有錯誤,請多指教!