Gradle

宋寶康發表於2018-04-23

api和implement

在3.0版本中,compile指令被標註為過時方法,而新增了兩個依賴指令,一個是implement 和api,這兩個都可以進行依賴新增,但是有什麼區別呢?
api 指令
完全等同於compile指令,沒區別,你將所有的compile改成api,完全沒有錯。
implement指令
這個指令的特點就是,對於使用了該命令編譯的依賴,對該專案有依賴的專案將無法訪問到使用該命令編譯的依賴中的任何程式,也就是將該依賴隱藏在內部,而不對外部公開。

在Google IO 相關話題的中提到了一個建議,就是依賴首先應該設定為implement的,如果沒有錯,那就用implement,如果有錯,那麼使用api指令,這樣會使編譯速度有所增快。

Provided

Provided 是編譯時執行,最終不會打包到apk中。

A 、B、C都是Library。 
A依賴了C,B也依賴了C 
App需要同時使用A和B 
那麼其中A(或者B)可以修改與C的依賴關係為Provided
複製程式碼

A這個Library實際上還是要用到C的,只不過它知道B那裡也有一個C,自己再帶一個就顯得多餘了,等app開始執行的時候,A就可以通過B得到C,也就是兩人公用這個C。所以自己就在和B匯合之前,假設自己有C。如果執行的時候沒有C,肯定就要崩潰了。

總結一下,Provided是間接的得到了依賴的Library,執行的時候必須要保證這個Library的存在,否則就會崩潰,起到了避免依賴重複資源的作用。

annotationProcessor 和android-apt

APT(Annotation Processing Tool)是一種處理註釋的工具,它對原始碼檔案進行檢測找出其中的Annotation,根據註解自動生成程式碼。 Annotation處理器在處理Annotation時可以根據原始檔中的Annotation生成額外的原始檔和其它的檔案(檔案具體內容由Annotation處理器的編寫者決定),APT還會編譯生成的原始檔和原來的原始檔,將它們一起生成class檔案。

APT的處理要素

  註解處理器(AbstractProcess)+程式碼處理(javaPoet)+處理器註冊(AutoService)+apt

使用APT來處理annotation的流程

  1. 定義註解(如@automain)
  2. 定義註解處理器,自定義需要生成程式碼
  3.使用處理器
  4.APT自動完成如下工作。

annotationProcessor

annotationProcessor是APT工具中的一種,他是google開發的內建框架,不需要引入,可以直接在build.gradle檔案中使用,如下

dependencies {
     annotationProcessor project(':xx')
     annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
複製程式碼

android-apt

android-apt是由一位開發者自己開發的apt框架,隨著Android Gradle 外掛 2.2 版本的釋出,Android Gradle 外掛提供了名為 annotationProcessor 的功能來完全代替 android-apt ,自此android-apt 作者在官網發表宣告最新的Android Gradle外掛現在已經支援annotationProcessor,並警告和或阻止android-apt ,並推薦大家使用 Android 官方外掛annotationProcessor。

參考:
你必須知道的APT、annotationProcessor、android-apt、Provided、自定義註解

相關文章