Cómo generar javadoc para la biblioteca de Android cuando tiene dependencias que también son bibliotecas aar?

Tengo el proyecto de la biblioteca de androide que depende de otros proyectos de la biblioteca del androide. Necesito generar javadoc para la biblioteca, pero falla porque gradle pone a javadoc classpath ruta a ubicaciones .aar pero javadoc espera archivos .jar.

Archivo gradle simplificado:

android { compileSdkVersion 23 buildToolsVersion "23.0.2" configurations { javadocDeps } defaultConfig { minSdkVersion 7 targetSdkVersion 23 versionCode 1 versionName "0.1.0" } } dependencies { compile 'com.android.support:support-v4:23.2.0' compile 'com.android.support:appcompat-v7:23.2.0' compile 'com.nineoldandroids:library:2.4.0' compile 'com.annimon:stream:1.0.7' javadocDeps 'com.android.support:support-annotations:23.2.0' javadocDeps 'com.nineoldandroids:library:2.4.0' javadocDeps 'com.android.support:support-v4:23.2.0' } task sourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs classifier = 'sources' } task javadoc(type: Javadoc, dependsOn: explodeAars) { source = android.sourceSets.main.java.srcDirs classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) classpath += configurations.javadocDeps } task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' from javadoc.destinationDir } artifacts { archives javadocJar archives sourcesJar } 

3 posibles soluciones:

1) de alguna manera para agregar a la ruta de acceso de clase class.jar de cada biblioteca de aar que depende build / intermidiates / exploded-aar / library / version / jars / classes.jar No sé cómo incluir estas rutas en la tarea javadoc.

2) manualmente desempaquetar classes.jar desde el archivo aar y agregarlos a classpath de la tarea javadoc

3) muy sucio hack – hardcoded caminos a la biblioteca – pero creo que esto es tan mal.

¿Cómo lograr 1 o 2 con gradle dsl?

Para agregar los JARs de los AAR, puede agregar el siguiente doFirst a la tarea javadoc:

 task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs } .doFirst { classpath += fileTree(dir: "$buildDir/intermediates/exploded-aar/", include:"**/classes.jar") } 

Se agregará todos los archivos .jar de todos los AARs al classpath javadoc. (Opción 1 de las soluciones propuestas)

La solución de @rve ya está rota en Android Studio 2.3 / Gradle 3.3 ya que el exploded-aar ya no existe (sin alternativa dentro del directorio de compilación).

Si el aar en el que usted confía no es un módulo en su proyecto, primero necesitará extraer el archivo classes.jar antes de referenciarlo en el classpath (básicamente, volver a crear intermediates/exploded-aar manualmente).

Si el aar del que dependes es solo otro módulo en tu proyecto, también puedes hacer que tu tarea javadoc dependa de la tarea de compilación de ese módulo y hacer referencia a los intermediates/classes/release de ese módulo (si haces javadoc depende de assemblyRelease por ejemplo) . Un ejemplo de esa solución: https://github.com/Microsoft/mobile-center-sdk-android/pull/345/files

Realmente deseo alguien viene con una solución mejor sin embargo.

Me las arreglé para automatizar la solución de Guillaume Perrot extrayendo las classes.jar contenidas en cada archivo AAR, y añadiéndolas al classpath de la tarea javadoc.

Parece que funciona para AAR dependencias y módulos AAR en Android Studio 2.3 y Gradle 3.3

 import java.nio.file.Files import java.nio.file.Paths import java.io.FileOutputStream import java.util.zip.ZipFile task javadoc(type: Javadoc) { source = android.sourceSets.main.java.srcDirs classpath += configurations.compile classpath += configurations.provided afterEvaluate { // Wait after evaluation to add the android classpath // to avoid "buildToolsVersion is not specified" error classpath += files(android.getBootClasspath()) // Process AAR dependencies def aarDependencies = classpath.filter { it.name.endsWith('.aar') } classpath -= aarDependencies aarDependencies.each { aar -> // Extract classes.jar from the AAR dependency, and add it to the javadoc classpath def outputPath = "$buildDir/tmp/aarJar/${aar.name.replace('.aar', '.jar')}" classpath += files(outputPath) // Use a task so the actual extraction only happens before the javadoc task is run dependsOn task(name: "extract ${aar.name}").doLast { extractEntry(aar, 'classes.jar', outputPath) } } } } // Utility method to extract only one entry in a zip file private def extractEntry(archive, entryPath, outputPath) { if (!archive.exists()) { throw new GradleException("archive $archive not found") } def zip = new ZipFile(archive) zip.entries().each { if (it.name == entryPath) { def path = Paths.get(outputPath) if (!Files.exists(path)) { Files.createDirectories(path.getParent()) Files.copy(zip.getInputStream(it), path) } } } zip.close() } 
  • ¿Cómo utilizar Gradle para generar JavaDoc en Android Studio?
  • Cómo adjuntar javadoc o fuentes a jarras en la carpeta libs?
  • Cambiar plantilla de autor en Android Studio
  • Agregue el proyecto de Javadoc para Android con varios módulos de biblioteca
  • Error al generar el proyecto androide javadoc utilizando Doclava
  • Recursos de referencia en javadoc
  • Crear javadoc en eclipse
  • JavaDoc en un proyecto Eclipse Android
  • ¿Dónde puedo descargar los documentos de la API para Android?
  • ¿Cómo configuro Java Doc for google drive api para android en Eclipse
  • Generar JavaDocs Android Studio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.