Kotlin注解處理(Kapt)


kapt 即 Kotlin annotation processing tool(Kotlin 注解處理工具)縮寫。

在 Kotlin 中通過 kapt 編譯器插件支持注解處理器(參見JSR 269)。

簡而言之,你可以在 Kotlin 項目中使用像 Dagger 或者 Data Binding 這樣的庫。

在 Gradle 中使用

應用 kotlin-kapt Gradle 插件:

使用  apply plugin 語法:
apply plugin: 'kotlin-kapt'

然后在 dependencies 塊中使用 kapt 配置添加相應的依賴項:

dependencies {
    kapt 'groupId:artifactId:版本'
}

如果你以前使用 Android 支持作為注解處理器,那么以 kapt 取代 annotationProcessor 配置的使用。如果你的項目包含 Java 類,kapt 也會顧全到它們。

如果為 androidTest 或 test 源代碼使用注解處理器,那么相應的 kapt 配置名為 kaptAndroidTest 和 kaptTest。請注意 kaptAndroidTest 和 kaptTest 擴展了 kapt,所以你可以只提供 kapt 依賴而它對生產和測試源代碼都可用。

注解處理器參數

使用 arguments {} 塊將參數傳給注解處理器:

kapt {
    arguments {
        arg("key", "value")
    }
} 

Gradle 構建緩存支持(自 1.2.20 起)

默認情況下,kapt 注解處理任務就會在 Gradle 中緩存。注解處理器所運行的任意代碼可能不一定將輸入轉換為輸出、可能訪問與修改 Gradle 未跟蹤的文件等。如果無法正確緩存在構建中使用的注解處理器,那么可以通過在構建腳本中添加以下幾行來完全禁用對 kapt 的緩存,以避免對 kapt 任務造成假陽性的緩存命中:

kapt {
    useBuildCache = false
}

並行運行 kapt 任務(自 1.2.60 起)

為了提高使用 kapt 的構建速度,可以為 kapt 任務啟用 Gradle Worker API。 使用 Worker API,Gradle 可以並行運行來自單個項目的獨立注解處理任務,這在某些情況下會大大減少執行時間。 但是,在啟用 Gradle Worker API 的情況下運行 kapt 會由於並行執行而導致內存消耗增加。

要使用 Gradle Worker API 並行執行 kapt 任務,請將此行添加到 gradle.properties 文件中:

kapt.use.worker.api=true

kapt 的避免編譯(自 1.3.20 起)

為了減少 kapt 增量構建的時間,可以使用 Gradle 避免編譯。 啟用避免編譯后,Gradle 可以在重新構建項目時跳過注解處理。特別是在以下情況下,將跳過注解處理:

  • 項目的源文件未更改。
  • 依賴項中的變更是 ABI 兼容的。例如,唯一的變化是方法主體。

但是,避免編譯不能用於在編譯類路徑中發現的注解處理器,因為它們中的任何更改都需要運行注解處理任務。

要在避免編譯的情況下運行 kapt:

  • 在 Gradle 中使用所述,將注解處理器依賴項手動添加到 kapt* 配置。
  • 通過在 gradle.properties 文件中添加以下行,在編譯類路徑中關閉對注解處理器的發現:
kapt.include.compile.classpath=false

增量注解處理(自 1.3.30 起)

從 1.3.30 版開始,kapt 作為實驗特性支持增量注解處理。 當前,僅當所使用的所有注解處理器均為增量式時,注解處理才可以是增量式的。

從 1.3.50 版開始,默認情況下啟用增量注解處理。 要禁用增量注解處理,請將以下行添加到 gradle.properties 文件中:

kapt.incremental.apt=false

請注意,增量注解處理也需要啟用增量編譯

Java 編譯器選項

Kapt 使用 Java 編譯器來運行注解處理器。 以下是將任意選項傳給 javac 的方式:

kapt {
    javacOptions {
        // 增加注解處理器的最大錯誤次數
        // 默認為 100。
        option("-Xmaxerrs", 500)
    }
}

非存在類型校正

一些注解處理器(如 AutoFactory)依賴於聲明簽名中的精確類型。默認情況下,Kapt 將每個未知類型(包括生成的類的類型)替換為 NonExistentClass,但你可以更改此行為。將額外標志添加到 build.gradle 文件以啟用在存根(stub)中推斷出的錯誤類型:

kapt {
    correctErrorTypes = true
}
 

Kapt 可生成 Kotlin 代碼。是將生成的 Kotlin 源文件寫入processingEnv.options["kapt.kotlin.generated"] 所指定的目錄,這些文件會與主源代碼一起編譯。

請注意,對於所生成 Kotlin 文件,Kapt 不支持多輪處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM