Android 工作室 / Gradle javadoc 任务

Android studio / Gradle javadoc task

我一直在努力设置一个 gradle 任务来为我的 Android 库生成 Javadoc,但是当存在对其他库的外部依赖时,文档生成失败。这似乎是一项常见的任务,但不知何故似乎没有一个简单的解决方案,例如 will reveal (re-generating exploded-aar manually is a bit absurd, and also, on Android Studio 3.0 even that doesn't work anymore 由于新的依赖指令)。

但是,我注意到通过 Android Studio GUI(工具菜单)生成 Javadoc 工作得很好 - 解决了对其他库的依赖等问题。那么这是如何工作的 - 这个菜单不使用gradle 生成 Javadoc 的任务?

因为我需要使用 gradle 生成 Javadoc 作为 CI 的一部分,我发现非常令人沮丧的是没有记录在案的方法让它工作,虽然有一种方法可以通过菜单。 Android Studio Tools -> Generate Javadoc 菜单不使用 gradle 任务吗?由于依赖项与 gradle 文件一起列出,并且 Javadoc 工具菜单显然能够解决这些依赖项 - 它是如何实现的?它如何获取嵌入在相关 aar 库等中的 jars?它如何独立使用而不是通过 Android Studio GUI 使用?

生成 java 样式文档的工具称为 javadoc,它安装在每个 JDK 中。您可以配置要包含哪些 类 或包,应排除哪些包以及许多其他选项。在 JDK 可用的终端中键入 javadoc,您就会明白。另见 https://docs.oracle.com/javase/9/javadoc/javadoc.htm#JSJAV-GUID-7A344353-3BBF-45C4-8B28-15025DDCC643

获得最佳配置后,您可以在 CI 中包含一个 javadoc 步骤。

也许你已经找到了解决办法。以防万一,下面是我如何为我的 Jenkins CI.

生成 API 文档
task generateApiDoc() {
    group "reporting"
    description "Generates Javadoc."
}

android.libraryVariants.all { variant ->
    // Only consider release 
    if (variant.buildType.name == "release") {
        def task = project.tasks.create("generate${variant.name.capitalize()}Javadoc", Javadoc) {
            group "ApiDoc"
            description "Generates Javadoc for $variant.name."

            // Source files from the variant
            source = variant.javaCompiler.source
            // Classpath from the variant + android.jar
            classpath = variant.javaCompiler.classpath + files(prj.android.getBootClasspath()) + files("$buildDir/intermediates/classes/release")

            /* add the excluded packages */
            exclude "**/R**"
            exclude "**/BuildConfig*"

            options.windowTitle = "My Library"
            options.memberLevel = JavadocMemberLevel.PROTECTED
            options.linkSource false
            options.author = true
            //options.links("http://docs.oracle.com/javase/7/docs/api/", "http://d.android.com/reference");

            failOnError false
        }

        task.dependsOn assemble

        generateApiDoc.dependsOn task
    }
}

然后 运行 下面的 gradle 命令让你的 api 文档代替 "$buildDir/docs"

./gradlew assembleRelease
./gradlew generateApiDoc

编辑 Gradle 插件 3.4.1

android.libraryVariants.all { variant ->

    def task = project.tasks.create("generate${variant.name.capitalize()}Javadoc", Javadoc) {
        title "API Documentation (${project.android.defaultConfig.versionName})"
        group "ApiDoc"
        description "Generates Javadoc for $variant.name."

        // Source files from the variant
        source = variant.sourceSets.collect { it.java.sourceFiles }.inject { m, i -> m + i }

        // To fix issue: Error: Can not create variant 'android-lint' after configuration ': library: debugRuntimeElements' has been resolved
        doFirst {
            classpath = project.files(variant.javaCompileProvider.get().classpath.files,
                    project.android.getBootClasspath())
        }

        if (JavaVersion.current().isJava8Compatible()) {
            options.addStringOption('Xdoclint:none', '-quiet')
        }

        exclude "**/R"
        exclude "**/R.**"
        exclude "**/R$**"
        exclude "**/BuildConfig*"

        if (JavaVersion.current().isJava8Compatible()) {
            options.addStringOption('Xdoclint:none', '-quiet')
        }

        options.windowTitle = "API Documentation (${project.android.defaultConfig.versionName})"
        options.memberLevel = JavadocMemberLevel.PROTECTED
        options.linkSource false
        options.author = false

        failOnError true
    }

    task.dependsOn "assemble${variant.name.capitalize()}"
    generateApiDoc.dependsOn task
}

我使用一个 gradle 任务,它只执行一个 bash 脚本文件,使用一个(相当长的)javadoc 命令。

您可以做的是 运行 从 Android Studio 生成 Javadoc 一次,然后从 Studio 日志中复制已执行的 javadoc 命令以及所有正确的参数,并自动执行gradle.

中的相同命令