Genera JavaDocs con Android Gradle plugin

¿Cómo puedo generar JavaDocs para un proyecto de Android usando el nuevo sistema de comstackción Gradle?

Esto es lo que se me ocurrió pero no funciona.

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

El problema principal es que no obtengo el android.jar apropiado en el classpath, así que algunos de los enlaces en los JavaDocs no se resuelven. Tengo que encontrar la forma de obtener todos los archivos jar necesarios en la ruta de clases.

Otro problema con el enfoque que tomé es que recoge los classpaths para todas las variantes de comstackción, en lugar de seleccionar uno.

Para Android, el complemento de gradle 1.1.2+ (com.android.tools.build:gradle:1.1.2+)

libraryVariants – ya no funciona

utilizar:

 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 /”) – ubique javadocs en la raíz del directorio del proyecto (de esta manera, el complemento jenkins javadoc podría encontrarlo y mostrarlo en el panel especial de Documentos)

failOnError false – para suprimir las advertencias que pueden causar errores de comstackción en jenkins

Gradle 1.11 – Gradle Plugin 0.10.0

Reemplace android.plugin.sdkDirectory por android.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' } } 

La solución en la que terminé quedándome es la siguiente:

 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 confirmó que esta es la manera de hacerlo (con advertencias) en el grupo adt-dev, https://groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ .

Con android gradle tools 1.10. + Obtener el android SDK dir es diferente que antes. Tienes que cambiar lo siguiente:

 android.sdkDirectory 

en lugar de

 android.plugin.sdkDirectory 

Esta es la solución completa al problema:

 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' } } 

Los flasks de Android parecen estar en la propiedad android.plugin.runtimeJarList . Sin embargo, no está documentado en ningún lugar, por lo que podría romperse en cualquier momento.

He refinado tu solución para trabajar en las variantes de comstackción:

 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' } } 

Por lo general, no tiene sentido hacer un javadoc solo en la twig principal ya que puede confiar en algunas cosas de los sabores del producto. Incluso la depuración frente a la versión podría tener algunas diferencias. Por supuesto, puedes elegir una variante predeterminada para usar. Entonces podrías hacer algo como,

 task javadoc(dependsOn: javadocDebug) 

Aquí hay una versión actualizada que solía funcionar en 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()}"] } } 

Hice un complemento de código abierto para eso. Repositorio GitHub

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

Agregue esta línea a su build.gradle

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

Entonces solo ejecuta uno de los siguientes:

 ./gradlew generateDebugJavadoc ./gradlew generateReleaseJavadoc 

La documentación de Java se puede encontrar en el module/javaDoc/

Descubrí que esta solución funciona con el plugin 1.3.1 de Gradle si tiene diferentes sabores de producto.

Esto creará tareas de Gradle para generar Javadoc para cada sabor de producto y tipo de construcción. Por ejemplo, si el nombre del módulo es una app y tiene un sabor de producto de production y desarrollo y tipos de comstackción de debug y release , tendrá las siguientes tareas de Gradle:

  • : aplicación: generateDevDebugJavadoc
  • : aplicación: generateDevReleaseJavadoc
  • : aplicación: generateProductionDebugJavadoc
  • : aplicación: 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 } } // ... } 

Uno mas

 android.libraryVariants.all {variant ->
     if (variant.name.equals ('release'))
         tarea ("generateJavadoc", tipo: Javadoc) {
             descripción "Generate Javadoc"
             source = android.sourceSets.main.java.srcDirs
 // println '=== source ==='
 // source.collect {relativePath (it)} .sort (). each {println it}
             ext.androidJar = "$ {android.sdkDirectory} / platforms / $ {android.compileSdkVersion} /android.jar"
             classpath = files (variant.javaCompile.classpath.files) + archivos (ext.androidJar)
 // println '=== classpath ==='
 // classpath.collect {relativePath (it)} .sort (). each {println it}
         }
 }

Utilizar:

gradle generateJavadoc