Создание JavaDocs с Android Gradle плагином

Как я могу сгенерировать JavaDocs для проекта Android с помощью новой системы сборки Gradle?

Вот что я придумал, но он не работает.

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

Основная проблема заключается в том, что я не получаю соответствующий файл android.jar в пути к классам, поэтому некоторые из ссылок в JavaDocs не разрешены. Я должен найти способ получить все необходимые банки на пути к классам.

Другая проблема с подходом, который я взял, - это собирать пути к классам для всех вариантов сборки, а не выбирать один.

Ответ 1

Решение, о котором я закончил, выглядит следующим образом:

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 подтвердил, что это способ сделать это (с оговорками) в группе adt-dev, https://groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ.

Ответ 2

Для 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
}

destinationDir = file ( "../javadoc/" ) - найдите javadocs в корне каталога проекта (таким образом, jenkins javadoc плагин мог найти его и показать на специальной панели документов)

failOnError false - для подавления предупреждений, которые могут привести к сбою сборки на jenkins

Ответ 3

Gradle 1.11 - Gradle Плагин 0.10.0

Заменить android.plugin.sdkDirectory на 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'
    }
}

Ответ 4

С инструментами android gradle 1.10. + получение файла SDK android отличается от предыдущего. Вы должны изменить следующее:

android.sdkDirectory 

вместо

android.plugin.sdkDirectory

Это полное решение проблемы:

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

Ответ 5

Андроидные банки, кажется, находятся в свойстве 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'
    }
}

Как правило, не имеет смысла делать javadoc только на основной ветке, поскольку вы можете полагаться на некоторые вещи из продуктов. Даже debug vs release может иметь некоторые отличия. Конечно, вы можете выбрать вариант по умолчанию. Таким образом, вы можете сделать что-то вроде

task javadoc(dependsOn: javadocDebug)

Ответ 6

Вот обновленная версия, которая работала в 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()}"]
    }
}

Ответ 7

Я создал для этого плагин с открытым исходным кодом. Репозиторий GitHub

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

Добавьте эту строку в свой build.gradle

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

Затем просто выполните одно из следующих действий:

./gradlew generateDebugJavadoc
./gradlew generateReleaseJavadoc

Документацию по java можно найти в module/javaDoc/

Ответ 8

Я обнаружил, что это решение работает на Gradle плагине 1.3.1, если у вас разные вкусы продукта.

Это создаст задачи Gradle для генерации Javadoc для каждого типа продукта и типа сборки. Например, если имя модуля app и у вас есть атрибуты production и dev продукта и debug и release, у вас будут следующие задачи Gradle:

  • : приложение: generateDevDebugJavadoc
  • : приложение: generateDevReleaseJavadoc
  • : приложение: generateProductionDebugJavadoc
  • : приложение: 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    
        }
    }

    // ...

}

Ответ 9

Еще один

android.libraryVariants.all { variant ->
    if(variant.name.equals('release'))
        task("generateJavadoc", type: Javadoc) {
            description "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) + files(ext.androidJar)
//            println '=== classpath ==='
//            classpath.collect { relativePath(it) }.sort().each { println it }
        }
}

Использование:

gradle generateJavadoc