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
Change Background of Edittext's Error Message
How to Make an Android View That Flips Between Views on Swipe/Fling
Error: Error Parsing Xml: Not Well-Formed (Invalid Token) ...
Imageview Adjustviewbounds Not Working
Changing Values from Cursor Using Simplecursoradapter
Showing The Current Selection in a Listview
Uninstall App Silently with System Privileges
Android Studio and Android.Support.V4.App.Fragment: Cannot Resolve Symbol
Notification Passes Old Intent Extras
Set Visibility of Progress Bar Gone on Completion of Image Loading Using Glide Library
How to Change System Navigation Bar Color
Easier Way to Get View's Id (String) by Its Id (Int)
How to Remove White Underline in a Searchview Widget in Toolbar Android
How to Add Cardview in Layout Xml in Androidx