在日常的Android開(kāi)發(fā)過(guò)程抢埋,我們不可避免地會(huì)在項(xiàng)目中引入一些第三方庫(kù)张惹,以引入Butterknife為例:
dependencies {
implementation 'com.jakewharton:butterknife:9.0.0-rc1'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
}
之前在使用時(shí)我只是把上邊的代碼從文檔里復(fù)制粘貼到build.gradle文件里疯兼,但是對(duì)于annotationProcessor 和implementation具體有什么區(qū)別并不了解
1.什么是annotationProcessor
annotationProcessor是APT(Annotation Processing Tool)工具中的一種教馆,隨著Android Gradle 插件 2.2 版本的發(fā)布,Android Gradle 插件提供了名為 annotationProcessor 的功能來(lái)完全代替 android-apt扒腕,不需要引入淤齐,可以直接在build.gradle文件中使用。
2.工作內(nèi)容
annotationProcessor顧名思義是注解處理器的意思袜匿。它對(duì)源代碼文件進(jìn)行檢測(cè)找出其中的Annotation更啄,根據(jù)注解自動(dòng)生成代碼。 Annotation處理器在處理Annotation時(shí)可以根據(jù)源文件中的Annotation生成額外的源文件和其它的文件居灯,之后將編譯生成的源文件和原來(lái)的源文件一起生成class文件
3.使用影響
annotationProcessor生成額外文件的規(guī)則是在依賴庫(kù)里定義的祭务,只在編譯的時(shí)候執(zhí)行,但是庫(kù)最終不打包到apk中怪嫌,所以使用Butterknife這類編譯注解框架并不會(huì)增加apk的大小
4.kapt
Butterknife的文檔里還有這么一句話:
If you are using Kotlin, replace annotationProcessor with kapt.
理解annotationProcessor的原理之后很容易就能猜到kapt也是APT工具的一種义锥,使用 Kotlin 開(kāi)發(fā) Android 應(yīng)用時(shí),要在預(yù)編譯階段處理注解必須使用kotlin-kapt
而不能使用annotationProcessor,kotlin-kapt不是Android Gradle 內(nèi)置插件需要額外引入
apply plugin: 'kotlin-kapt'
......
kapt "com.android.databinding:compiler:$android_plugin_version"
特別注意將 annotaionProcessor換成kapt時(shí)如果之前編譯過(guò)岩灭,必須要先執(zhí)行clean project再編譯拌倍,才能讓注解被正常處理!
5.總結(jié)運(yùn)用
了解了annotationProcessor和kapt后在去看一些第三方庫(kù)時(shí),從庫(kù)的引用方式就可以簡(jiǎn)單地看出它有沒(méi)有使用編譯期注解的技術(shù)了柱恤,比如:
compile 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
從上邊就可以看出Arouter使用了編譯注解而retrofit并沒(méi)有使用編譯注解