android - 当它具有也是 aar 库的依赖项时,如何为 android 库生成 javadoc?

标签 android gradle android-gradle-plugin javadoc android-library

我有一个 android 库项目,它依赖于其他 android 库项目。我需要为库生成 javadoc,但它失败了,因为 gradle 将 javadoc 类路径路径放入 .aar 位置,但 javadoc 需要 .jar 文件。

简化的 gradle 文件:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    configurations {
        javadocDeps
    }

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 23
        versionCode 1
        versionName "0.1.0"
    }
}

dependencies {
    compile 'com.android.support:support-v4:23.2.0'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.annimon:stream:1.0.7'
    javadocDeps 'com.android.support:support-annotations:23.2.0'
    javadocDeps 'com.nineoldandroids:library:2.4.0'
    javadocDeps 'com.android.support:support-v4:23.2.0'
}

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}    

task javadoc(type: Javadoc, dependsOn: explodeAars) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    classpath += configurations.javadocDeps
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

3 种可能的解决方案:

1) 以某种方式从它依赖的每个 aar 库添加到类路径路径 classes.jar build/intermidiates/exploded-aar/library/version/jars/classes.jar 我不知道如何在 javadoc 任务中包含这些路径。

2) 从aar 文件中手动解压classes.jar 并将它们添加到javadoc 任务的类路径中

3) 非常肮脏的 hack - 库的硬编码路径 - 但我认为这是错误的。

如何用gradle dsl实现1或2?

最佳答案

我通过提取每个 AAR 文件中包含的 classes.jar 并将其添加到 javadoc 任务的类路径中,成功地自动化了 Guillaume Perrot 的解决方案。

它似乎适用于 Android Studio 2.3 和 Gradle 3.3 上的 AAR 依赖项和 AAR 模块

import java.nio.file.Files
import java.nio.file.Paths
import java.io.FileOutputStream
import java.util.zip.ZipFile

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += configurations.compile
    classpath += configurations.provided

    afterEvaluate {
        // Wait after evaluation to add the android classpath
        // to avoid "buildToolsVersion is not specified" error
        classpath += files(android.getBootClasspath())

        // Process AAR dependencies
        def aarDependencies = classpath.filter { it.name.endsWith('.aar') }
        classpath -= aarDependencies
        aarDependencies.each { aar ->
            // Extract classes.jar from the AAR dependency, and add it to the javadoc classpath
            def outputPath = "$buildDir/tmp/aarJar/${aar.name.replace('.aar', '.jar')}"
            classpath += files(outputPath)

            // Use a task so the actual extraction only happens before the javadoc task is run
            dependsOn task(name: "extract ${aar.name}").doLast {
                extractEntry(aar, 'classes.jar', outputPath)
            }
        }
    }
}

// Utility method to extract only one entry in a zip file
private def extractEntry(archive, entryPath, outputPath) {
    if (!archive.exists()) {
        throw new GradleException("archive $archive not found")
    }

    def zip = new ZipFile(archive)
    zip.entries().each {
        if (it.name == entryPath) {
            def path = Paths.get(outputPath)
            if (!Files.exists(path)) {
                Files.createDirectories(path.getParent())
                Files.copy(zip.getInputStream(it), path)
            }
        }
    }
    zip.close()
}

关于android - 当它具有也是 aar 库的依赖项时,如何为 android 库生成 javadoc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35853906/

相关文章:

android - 我怎么知道特定协程调度程序使用的线程数是多少?

android - 如何修复 Lollipop 前设备上的复选框文本间距?

java - 如何停止 Gradle 将依赖项扩展为 ExpandedArchives?

android - 如何在每个构建中随机化 ProGuard 字典?

android - Crashlytics 发现无效的 API key

android - 错误 :(6, 0) 未找到 Gradle DSL 方法: 'google()'

android - annotationProcessor + androidTest + dagger2

android - 使用 HttpPost 发送的文件已损坏和/或被截断

尽管 api 级别错误,Android Studio gradle 构建成功

android - 应用程序未打开 LAUNCHER Activity