還再用compile依賴?那你就落後啦

技術特工隊發表於2017-11-14

想第一時間獲取我的最新文章,請關注公眾號: 技術特工隊

在上上一篇文章《Android Studio 3.0版本正式釋出啦》 中說到AS 3.0 正式版已經出來了,講到新版本支援的一些新特性,那麼今天就來說說新版本中 Moudle 中 build.gradle 檔案中的變化。

我們來看看新建一個專案在 Moudle 中的 dependencies 中的變化。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}複製程式碼

發現我們經常新增依賴使用的 compile不見了,而現在改變為 implementation了,那麼就來看看這個到底是有什麼新的意思呢。

其實在新版本 Android Gradle plugin 3.0 中 已經將 compile 標記為過時了,而取而代之的是 implementationapi 兩個關鍵字。那麼它們有什麼區別呢?

api 關鍵字 其實等同於 compile 。但為什麼要換個名字呢,目前還沒有查到相關的資訊,如有大神知道,請留言告知。

implementation : 使用了該命令編譯的依賴,它僅僅對當前的 Moudle 提供介面。例如我們當前專案結構如下:

專案結構
專案結構

LibraryA 中引用了 LibraryC 的庫,如果對 LibraryC 的依賴用的是 implementation 關鍵字。 如下:

dependencies {
    . . . . 
    implementation project(path:':libraryC')
}複製程式碼

那麼 LibraryC 中的介面,僅僅只能給 LibraryA 使用,而我們的 App Moudle 是無法訪問到 LibraryC 提供的介面的,也就是將該依賴隱藏在內部,而不對外部公開。這就是 implementation 關鍵字的作用。

那為什麼要這麼做呢?
答案是: 1. 加快編譯速度。2. 隱藏對外不必要的介面。

為什麼能加快編譯速度呢?
這對於大型專案含有多個 Moudle 模組的, 以上圖為例,比如我們改動 LibraryC 介面的相關程式碼,這時候編譯只需要單獨編譯 LibraryA 模組就行, 如果使用的是 api 或者舊時代的 compile,由於App Moudle 也可以訪問到 LibraryC ,所以 App Moudle 部分也需要重新編譯。當然這是在全編的情況下。

至於編譯速度的對比,國外有個小哥已經做了簡單的對比,效果還是不錯。地址可點選原文跳轉過去檢視。

那麼我們現有專案中的依賴如何修改呢? 答案是:將 compile 都修改為 implementation 然後嘗試進行專案構建,如果構建成功那麼恭喜你,如果構建不成功,則檢視相關的依賴項,並將其修改為 api 關鍵字依賴。

好了,今天就介紹這一個知識點,如果你有收穫就關注我們吧,或者給我點個贊吧。

相關文章