使用Android Gradle插件生成JavaDocs

Mat*_*ola 47 android javadoc gradle android-gradle-plugin

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

这是我提出的,但它不起作用.

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

主要问题是我没有在类路径上获得相应的android.jar,因此JavaDocs中的某些链接无法解析.我必须找到一种方法来获取类路径上所有必需的jar.

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

Fli*_*bor 38

对于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
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1绝对天才!!! 我所看到的每个方法(示例都在这个SO q上)用于为aars创建javadocs使用`.all`方法,这种方法很冗长,无法从其他消费任务中调用.这种方法非常清洁和可用. (2认同)

小智 24

Gradle 1.11 - Gradle Plugin 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然我会使用``生成$ {variant.name.capitalize()} Javadoc"`来获得更好的格式化任务名称(例如,`generateReleaseJavadoc`与`generatereleaseJavadoc`). (8认同)

Mat*_*ola 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

Xavier Ducrohet证实这是adt-dev小组的做法(有警告),https: //groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ .

  • 如果你不推荐'variant.getJavaCompiler()',请使用`variant.javaCompileProvider.get().source`和`variant.javaCompileProvider.get().classpath` (5认同)

Jul*_*les 9

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

android.sdkDirectory 
Run Code Online (Sandbox Code Playgroud)

代替

android.plugin.sdkDirectory
Run Code Online (Sandbox Code Playgroud)

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

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'
    }
}
Run Code Online (Sandbox Code Playgroud)


tha*_*ing 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

task javadoc(dependsOn: javadocDebug)
Run Code Online (Sandbox Code Playgroud)