50

如何使用新的 Gradle 构建系统为 Android 项目生成 JavaDocs?

这是我想出的,但它不起作用。

task generateJavadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    ext.cp = android.libraryVariants.collect { variant ->
        variant.javaCompile.classpath.files
    }
    classpath = files(ext.cp) 
}

主要问题是我没有在类路径上获得适当的 android.jar,因此 JavaDocs 中的一些链接没有得到解决。我必须找到一种方法来获取类路径上所有必要的 jar。

我采用的方法的另一个问题是它收集了所有构建变体的类路径,而不是选择一个。

4

9 回答 9

41

对于 Android gradle 插件 1.1.2+ (com.android.tools.build:gradle:1.1.2+)

libraryVariants - 不再工作

采用:

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    destinationDir = file("../javadoc/")
    failOnError false
}

destinationDir = file("../javadoc/") - 将 javadocs 定位在项目目录的根目录(这样 jenkins javadoc 插件可以找到它并显示在特殊的文档面板中)

failOnError false - 用于抑制可能导致 jenkins 构建失败的警告

于 2015-04-01T16:44:29.470 回答
24

Gradle 1.11 - Gradle 插件0.10.0

替换android.plugin.sdkDirectoryandroid.sdkDirectory

android.libraryVariants.all { variant ->
    task("generate${variant.name}Javadoc", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://d.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }
}
于 2014-05-15T08:15:39.127 回答
11

我最终解决的解决方案如下:

android.libraryVariants.all { variant ->

    task("generate${variant.name}Javadoc", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
    }

}

Xavier Ducrohet 证实这是在 adt-dev 组上执行此操作的方法(带有警告),https: //groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ .

于 2013-10-09T15:01:32.620 回答
9

使用 android gradle tools 1.10.+ 获取 android SDK 目录与以前不同。您必须更改以下内容:

android.sdkDirectory 

代替

android.plugin.sdkDirectory

这是问题的完整解决方案:

android.applicationVariants.all { variant ->

    task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
        title = "Documentation for Android $android.defaultConfig.versionName b$android.defaultConfig.versionCode"
        destinationDir = new File("${project.getProjectDir()}/doc/compiled/", variant.baseName)
        source = variant.javaCompile.source

        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)

        description "Generates Javadoc for $variant.name."

        options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PRIVATE
        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://developer.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }
}
于 2014-05-12T08:27:00.190 回答
8

android jar 似乎在属性中android.plugin.runtimeJarList。虽然它没有记录在任何地方,所以它可能随时中断。

我已经改进了您的解决方案以跨构建变体工作:

android.applicationVariants.all { variant ->
    def name = variant.name
    task "javadoc$name"(type: Javadoc) {
        description = "Generates javadoc for build $name"
        destinationDir = new File(destinationDir, variant.baseName)
        source = files(variant.javaCompile.source)
        classpath = files(android.plugin.runtimeJarList, variant.javaCompile.classpath)
        exclude '**/R.html', '**/R.*.html'
    }
}

通常只在主分支上做一个 javadoc 是没有意义的,因为你可能依赖于产品风格中的一些东西。即使是调试与发布也可能存在一些差异。您当然可以选择使用默认变体。所以你可以做类似的事情,

task javadoc(dependsOn: javadocDebug)
于 2013-08-21T17:02:25.117 回答
4

这是 2014 年使用的更新版本:

android.libraryVariants.all { variant ->
    def name = variant.buildType.name

    if (name.equalsIgnoreCase("debug")) {
        return; // Skip debug builds.
    }
    task("javadoc${variant.name.capitalize()}", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = files(plugins.findPlugin("com.android.library").getBootClasspath())
        classpath = files(variant.javaCompile.classpath.files) + ext.androidJar
        exclude '**/internal/**'
        failOnError false
    }

    task("bundleJavadoc${variant.name.capitalize()}", type: Jar) {
        description "Bundles Javadoc into zip for $variant.name."
        classifier = "javadoc"
        from tasks["javadoc${variant.name.capitalize()}"]
    }
}
于 2014-08-12T13:32:25.130 回答
3

我为此制作了一个开源插件。GitHub 存储库

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "gradle.plugin.com.vanniktech:gradle-android-javadoc-plugin:0.2.1"
    }
}

将此行添加到您的build.gradle

apply plugin: "com.vanniktech.android.javadoc"

然后只需执行以下操作之一:

./gradlew generateDebugJavadoc
./gradlew generateReleaseJavadoc

Java 文档可以在module/javaDoc/

于 2015-10-04T16:03:47.567 回答
2

如果您有不同的产品风格,我发现此解决方案适用于 Gradle 插件 1.3.1。

这将创建 Gradle 任务来为每种产品风格和构建类型生成 Javadoc。例如,如果模块名称是并且app你有一个产品风格production和构建类型,你将有以下 Gradle 任务:devdebugrelease

  • :app:generateDevDebugJavadoc
  • :app:generateDevReleaseJavadoc
  • :app:generateProductionDebugJavadoc
  • :app:generateProductionReleaseJavadoc

app/build.gradle

android {

    // ...

    applicationVariants.all { variant ->
        // create tasks to generate Javadocs
        task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
            source = variant.javaCompile.source
            classpath += project.files(android.getBootClasspath().join(File.pathSeparator))

            // choose the destination that works best for you here
            // I chose this particular directory because Jenkins pulls reports 
            // from this directory already if you need to have the output 
            // folder be parameterized for the build variant, use
            // "build/outputs/docs/javadoc-${variant.name}/" instead and it'll 
            // be in `javadoc-productionRelease` for example
            destinationDir = file("build/outputs/docs/javadoc/")

            // the name that will appear in the docs
            title = rootProject.name

            // you will probably get errors from using the @annotations and 
            // the support library, so just turn off failing for errors
            failOnError false    
        }
    }

    // ...

}
于 2015-09-15T20:29:34.910 回答
0

多一个

android.libraryVariants.all { 变体 ->
    if(variant.name.equals('release'))
        任务(“生成Javadoc”,类型:Javadoc){
            描述“生成 Javadoc”
            源 = android.sourceSets.main.java.srcDirs
// println '=== source ==='
// source.collect { relativePath(it) }.sort().each { println it }
            ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
            类路径 = 文件(variant.javaCompile.classpath.files)+ 文件(ext.androidJar)
// println '=== 类路径 ==='
// classpath.collect { relativePath(it) }.sort().each { println it }
        }
}

采用:

gradle 生成Javadoc

于 2015-12-15T23:49:07.230 回答