Студия Android/Gradle javadoc

Я изо всех сил пытался настроить задачу gradle для генерации Javadocs для моей библиотеки Android, но когда есть внешние зависимости от других библиотек, генерация документов не удается. Похоже, что это обычная задача, но почему-то это не кажется простым решением, как, например, этот ответ покажет (повторная генерация разнесенного вручную немного абсурдна, а также, в Android Studio 3.0 даже это больше не работает из-за новых директив зависимости).

Тем не менее, я заметил, что создание Javadoc с помощью графического интерфейса Android Studio (меню "Инструменты") работает просто отлично - разрешаются зависимости от других библиотек и т.д. Так как же это работает - не использует ли это меню задачу gradle для создания Javadoc?

Поскольку мне нужно сгенерировать Javadoc, используя gradle как часть CI, я очень расстраиваюсь из-за того, что нет документированного способа заставить его работать, в то время как есть способ, который работает через меню. Разве инструменты Android Studio → Создать Javadoc, в свою очередь, не используют задачу gradle? Поскольку зависимости перечислены в файлах Gradle, и меню инструментов Javadoc, по-видимому, способно разрешить эти зависимости - как это реализовано? Как получить jar файлы, встроенные в зависимые библиотеки aar и т.д.? Как его можно использовать автономно, а не через графический интерфейс Android Studio?

Ответ 1

Может быть, у вас есть решение этого. На всякий случай, ниже, как я генерирую документацию API для моего 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
    }
}

Затем запустите команды gradle, чтобы получить ваш api doc вместо "$buildDir/docs".

./gradlew assembleRelease
./gradlew generateApiDoc

Редактировать для 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()}"
}

Ответ 2

Я использую задачу gradle, которая просто выполняет файл сценария bash с одной (довольно длинной) командой javadoc.

Что вы можете сделать, так это запустить генерацию Javadoc из Android Studio один раз, а затем скопировать исполняемую команду javadoc из журнала Studio со всеми правильными параметрами и автоматизировать выполнение одной и той же команды в вашем градиенте.

Ответ 3

Инструмент для создания документации в стиле Java называется javadoc и он устанавливается в каждом JDK. Вы можете настроить, какие классы или пакеты вы хотите включить, какие из них следует исключить и многие другие варианты. Введите javadoc в терминал, где доступен JDK, и вы получите представление. См. Также https://docs.oracle.com/javase/9/javadoc/javadoc.htm#JSJAV-GUID-7A344353-3BBF-45C4-8B28-15025DDCC643

После того, как вы достигнете оптимальной конфигурации, вы можете включить в свой CI шаг javadoc.