Генерация 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 не разрешаются. Я должен найти способ получить все необходимые банки на пути к классам.

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

9 ответов

Решение

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

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

}

Ксавье Дюкрохет подтвердил, что это способ сделать это (с оговорками) в группе adt-dev, https://groups.google.com/forum/#!searchin/adt-dev/javadoc/adt-dev/seRizEn8ICA/bafEvUl6mzsJ,

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

Gradle 1.11 - Gradle Plugin 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'
    }
}

С инструментами Android Gradle 1.10.+ Получение Android SDR Dir отличается от ранее. Вы должны изменить следующее:

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

Фляги андроида вроде бы в собственности 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 только для основной ветви, так как вы можете полагаться на некоторые вещи из ароматов продукта. Даже отладка против выпуска может иметь некоторые различия. Конечно, вы можете просто выбрать вариант по умолчанию для использования. Таким образом, вы могли бы сделать что-то вроде,

task javadoc(dependsOn: javadocDebug)

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

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

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/

Я обнаружил, что это решение работает на плагине 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    
        }
    }

    // ...

}

Еще один

android.libraryVariants.all {вариант ->
    если (variant.name.equals('освобождение'))
        task("generateJavadoc", тип: Javadoc) {
            описание "Генерация Javadoc"
            source = android.sourceSets.main.java.srcDirs
//            println '=== source ==='
//            source.collect {lativePath(it) }.sort().each { println it }
            ext.androidJar = "${android.sdkDirectory}/platform /${android.compileSdkVersion}/android.jar"
            classpath = файлы (option.javaCompile.classpath.files) + файлы (ext.androidJar)
//            println '=== classpath ==='
//            classpath.collect {lativePath(it) }.sort().each { println it }
        }
}

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

Gradle GenerateJavadoc

Другие вопросы по тегам