【问题标题】:Android studio / Gradle javadoc taskAndroid 工作室/Gradle javadoc 任务
【发布时间】:2018-04-03 10:04:13
【问题描述】:

我一直在努力设置一个 gradle 任务来为我的 Android 库生成 Javadocs,但是当其他库存在外部依赖项时,文档生成失败。这似乎是一个常见的任务,但不知何故似乎没有一个简单的解决方案,例如this answer 将揭示(手动重新生成爆炸aar 有点荒谬,而且,甚至在 Android Studio 3.0 上that doesn't work anymore 由于新的依赖指令)。

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

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

【问题讨论】:

    标签: android android-studio gradle android-gradle-plugin javadoc


    【解决方案1】:

    也许您已经找到了解决方案。以防万一,下面是我如何为我的 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
    }
    
    

    【讨论】:

    • 我终于开始尝试这个,它似乎工作得很好。非常感谢。
    • 很高兴听到它有帮助。
    • 在 2020 年再次感谢您在注意到原始答案被破坏后对 Gradle 3.4.1 的更新。 :)
    • if (JavaVersion.current().isJava8Compatible()) 块在此任务中重复。
    • 抱歉,目前还不清楚这些生成的文件放在哪里。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 作为一名 20 多年的 Java 程序员,我非常了解 javadoc 工具。如问题中所述,问题是通过 gradle 生成 javadoc 的脚本,这意味着应在生成期间解决 gradle 依赖项。仅求助于 javadoc 工具本身意味着必须手动从 gradle 的缓存中创建一个巨大的类路径列表。我只是想调用一个为我执行此操作的 gradle 任务,考虑到 gradle 具有大多数其他事情的任务,这似乎是一个合理的任务。
      • 明白了。祝你好运!
      • 以下是我为 jitpack 上的库生成 javadocs 的方式:github.com/jitpack/android-example/blob/master/library/…
      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 2021-03-25
      • 2016-11-04
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多