เพิ่มตัวประมวลผลคำอธิบายประกอบ

หน้านี้มีคำแนะนำโดยละเอียดเกี่ยวกับวิธีเพิ่มและกำหนดค่าคำอธิบายประกอบ เป็นทรัพยากร Dependency ของโปรเจ็กต์ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับตัวประมวลผลคำอธิบายประกอบ ดูรายการใน กำหนดค่าทรัพยากร Dependency

หากคุณเพิ่มตัวประมวลผลคำอธิบายประกอบลงในคลาสพาธการคอมไพล์ คุณจะเห็น ข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความต่อไปนี้

Error: Annotation processors must be explicitly declared now.

หากต้องการแก้ไขข้อผิดพลาดนี้ ให้เพิ่มตัวประมวลผลคำอธิบายประกอบลงในโปรเจ็กต์โดยการกำหนดค่า ทรัพยากร Dependency ของคุณโดยใช้ annotationProcessor ดังที่แสดงด้านล่าง

Kotlin

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly("com.google.dagger:dagger:version-number")
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor("com.google.dagger:dagger-compiler:version-number")
}

ดึงดูด

dependencies {
    // Adds libraries defining annotations to only the compile classpath.
    compileOnly 'com.google.dagger:dagger:version-number'
    // Adds the annotation processor dependency to the annotation processor classpath.
    annotationProcessor 'com.google.dagger:dagger-compiler:version-number'
}

หมายเหตุ: ไม่มีปลั๊กอิน Android สำหรับ Gradle 3.0.0 ขึ้นไป สนับสนุน ปลั๊กอิน android-apt

ส่งอาร์กิวเมนต์ไปยังตัวประมวลผลคำอธิบายประกอบ

หากคุณจำเป็นต้องส่งอาร์กิวเมนต์ไปยังตัวประมวลผลคำอธิบายประกอบ คุณสามารถทำได้โดยใช้ AnnotationProcessorOptions ในการกำหนดค่าบิลด์ของโมดูล เช่น ถ้าต้องการส่งผ่าน ประเภทข้อมูลพื้นฐานเป็นคู่คีย์-ค่า คุณสามารถใช้พร็อพเพอร์ตี้ argument ดังที่แสดงด้านล่าง

Kotlin

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += mapOf("key1" to "value1",
                                   "key2" to "value2")
            }
        }
    }
}

ดึงดูด

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument 'key1', 'value1'
                argument 'key2', 'value2'
            }
        }
    }
}

อย่างไรก็ตาม เมื่อใช้ปลั๊กอิน Android Gradle 3.2.0 ขึ้นไป คุณจะต้องทำดังนี้ ส่งอาร์กิวเมนต์ตัวประมวลผลที่แสดงไฟล์หรือไดเรกทอรีโดยใช้ Gradle CommandLineArgumentProvider

การใช้ CommandLineArgumentProvider ช่วยให้คุณหรือ ผู้เขียนประมวลผลคำอธิบายประกอบ เพื่อปรับปรุงความถูกต้องและประสิทธิภาพของ ล้างบิลด์ที่เพิ่มขึ้นและแคชโดยใช้ประเภทพร็อพเพอร์ตี้ของบิลด์ที่เพิ่มขึ้น คำอธิบายประกอบ กับอาร์กิวเมนต์

ตัวอย่างเช่น คลาสด้านล่างใช้ CommandLineArgumentProvider และ จะอธิบายแต่ละอาร์กิวเมนต์สำหรับตัวประมวลผล

Kotlin

class MyArgsProvider(
    // Annotates each directory as either an input or output for the
    // annotation processor.
    @get:InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @get:PathSensitive(PathSensitivity.RELATIVE)
    val inputDir: FileCollection,

    @get:OutputDirectory
    val outputDir: File
) : CommandLineArgumentProvider {
    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.

    override fun asArguments(): Iterable<String> {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        return listOf("-AinputDir=${inputDir.singleFile.absolutePath}",
                      "-AoutputDir=${outputDir.absolutePath}")
    }
}

android {...}

ดึงดูด

class MyArgsProvider implements CommandLineArgumentProvider {

    // Annotates each directory as either an input or output for the
    // annotation processor.
    @InputFiles
    // Using this annotation helps Gradle determine which part of the file path
    // should be considered during up-to-date checks.
    @PathSensitive(PathSensitivity.RELATIVE)
    FileCollection inputDir

    @OutputDirectory
    File outputDir

    // The class constructor sets the paths for the input and output directories.
    MyArgsProvider(FileCollection input, File output) {
        inputDir = input
        outputDir = output
    }

    // Specifies each directory as a command line argument for the processor.
    // The Android plugin uses this method to pass the arguments to the
    // annotation processor.
    @Override
    Iterable<String> asArguments() {
        // Use the form '-Akey[=value]' to pass your options to the Java compiler.
        ["-AinputDir=${inputDir.singleFile.absolutePath}",
         "-AoutputDir=${outputDir.absolutePath}"]
    }
}

android {...}

หลังจากกำหนดคลาสที่ใช้งาน CommandLineArgumentProvider แล้ว คุณจะต้อง เพื่อสร้างอินสแตนซ์และส่งไปยังปลั๊กอิน Android โดยใช้ annotationProcessorOptions.compilerArgumentProvider ตามที่แสดงด้านล่าง

Kotlin

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider(MyArgsProvider(files("input/path"),
                                                          file("output/path")))
            }
        }
    }
}

ดึงดูด

// This is in your module's build.gradle file.
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                // Creates a new MyArgsProvider object, specifies the input and
                // output paths for the constructor, and passes the object
                // to the Android plugin.
                compilerArgumentProvider new MyArgsProvider(files("input/path"),
                                         new File("output/path"))
            }
        }
    }
}

หากต้องการดูข้อมูลเพิ่มเติมว่าการใช้งาน CommandLineArgumentProvider มีประโยชน์อย่างไร ปรับปรุงประสิทธิภาพของบิลด์, อ่าน โปรเจ็กต์การแคช Java

ปิดใช้การตรวจสอบข้อผิดพลาดของตัวประมวลผลคำอธิบายประกอบ

หากคุณมีทรัพยากร Dependency ในคลาสพาธคอมไพล์ที่มีคำอธิบายประกอบ ที่คุณไม่ต้องการ คุณสามารถปิดใช้งานการตรวจสอบข้อผิดพลาด ต่อไปนี้ลงในไฟล์ build.gradle.kts ของคุณ โปรดทราบว่าคำอธิบายประกอบ ตัวประมวลผลที่คุณเพิ่มลงในคลาสพาธการคอมไพล์จะยังคงไม่เพิ่มลงใน คลาสพาธของผู้ประมวลผลข้อมูล

Kotlin

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                argument("includeCompileClasspath", "false")
            }
        }
    }
}

ดึงดูด

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath false
            }
        }
    }
}

หากใช้ Kotlin และ kapt ให้ทำดังนี้

Kotlin

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath = false
        }
    }
}

ดึงดูด

android {
    ...
    defaultConfig {
        ...
        kapt {
            includeCompileClasspath false
        }
    }
}

หากคุณพบปัญหาหลังจากย้ายข้อมูลตัวประมวลผลคำอธิบายประกอบของโปรเจ็กต์ไปยัง คลาสพาธของตัวประมวลผล คุณสามารถอนุญาตตัวประมวลผลคำอธิบายประกอบในคอมไพล์ classpath มีค่าได้ โดยตั้งค่า includeCompileClasspath เป็น true แต่การตั้งค่า ไม่แนะนําให้ใช้พร็อพเพอร์ตี้ true และระบบจะนำตัวเลือกในการเชื่อมโยงออก เกี่ยวกับการอัปเดตปลั๊กอิน Android ในอนาคต