Generate Javadocs with Android Gradle Plugin

Generate JavaDocs with Android Gradle plugin

The solution I ended up settling on is as follows:

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 confirmed this is the way to do it (with caveats) on the adt-dev group, https://groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ.

Android studio / Gradle javadoc task

Maybe you have got the solution to this. Just in case not, below is how I generate API doc for my Jenkins CI.

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

Then run below gradle commands to get your api doc in place of "$buildDir/docs".

./gradlew assembleRelease
./gradlew generateApiDoc

Edit for Gradle Plugin 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
}

How to use Gradle to generate JavaDoc in Android Studio?

In our projects we added the following to the app's build.gradle:

android.applicationVariants.all { variant ->
task("generate${variant.name.capitalize()}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/");
}
}

This will add tasks to the build of the form generate<build_variant>Javadoc. So let's say you have a free and a pro version of your app, this would add tasks like:

generateFreeDebugJavadoc
generateFreeReleaseJavadoc
generateProDebugJavadoc
generateProReleaseJavadoc

Hope this helps

How to generate javadoc for android library when it has dependencies which are also aar libraries?

The solution from @rve is now broken on Android Studio 2.3 / Gradle 3.3 as the exploded-aar no longer exists (with no alternative inside the build directory).

If the aar you depend on is not a module in your project, you will need first to extract the classes.jar before referencing it in the classpath (basically re-create intermediates/exploded-aar manually).

If the aar you depend on is just another module in your project you can also make your javadoc task depends on the compile task of that module and reference the intermediates/classes/release of that module (if you make javadoc depends on assembleRelease for example). An example of that workaround: https://github.com/Microsoft/mobile-center-sdk-android/pull/345/files

I really wish someone comes up with a better solution though.

How to add a javadoc task to Android Gradle subprojects from the root build.gradle file?

Indead, I succeeded in using subprojects {} directive.

The key is to use afterEvaluate {}, so I can use android property added by android gradle plugin.

Here is the code I ended with :

subprojects{
afterEvaluate { project ->
if(project.hasProperty('android')){
if(project.android.hasProperty('libraryVariants')) {
project.android.libraryVariants.all { variant ->
println variant
task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
description "Generates Javadoc for $variant.name."
source = variant.javaCompile.source
ext.androidJar = "${project.android.sdkDirectory}/platforms/${project.android.compileSdkVersion}/android.jar"
classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
options.links("http://docs.oracle.com/javase/7/docs/api/");
options.linksOffline("http://d.android.com/reference", "${project.android.sdkDirectory}/docs/reference");
exclude '** /BuildConfig.java'
exclude '** /R.java'
}
}
}
else if (project.android.hasProperty('applicationVariants')){
project.android.applicationVariants.all { variant ->
println variant
task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
description "Generates Javadoc for $variant.name."
source = variant.javaCompile.source
ext.androidJar = "${project.android.sdkDirectory}/platforms/${project.android.compileSdkVersion}/android.jar"
classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
options.links("http://docs.oracle.com/javase/7/docs/api/");
options.linksOffline("http://d.android.com/reference", "${project.android.sdkDirectory}/docs/reference");
exclude '** /BuildConfig.java'
exclude '** /R.java'
}
}
}
}
}
}

Android Studio - Gradle generate specific javadoc files

It looks like you can do it the following way

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


Related Topics



Leave a reply



Submit