升级到 Gradle 7 后 Android Gradle Javadoc 损坏

Ori*_*rds 6 java android javadoc gradle

几天前,我升级到了新的 Android Studio Arctic Fox 版本,现在也需要 Gradle 7

在升级之前,我有以下 javadoc 任务,它运行得很好

def javaDocsAllowList = [
    "com/mycompany/SomeFile.java",
    "com/mycompany/OtherFile.java",
    ...
]

task javadocs(type: Javadoc) {
    source android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + configurations.compile
    include javaDocsAllowList
    destinationDir = file("./docs/javadoc")
}
Run Code Online (Sandbox Code Playgroud)

然而现在,一切都破碎了。

第一个错误是

Could not get unknown property 'compile' for configuration container of type org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer

所以我将类路径行更改为:

classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + configurations.implementation
Run Code Online (Sandbox Code Playgroud)

然后我得到

Resolving dependency configuration 'implementation' is not allowed as it is defined as 'canBeResolved=false'.

所以我添加

configurations.implementation.setCanBeResolved(true)
Run Code Online (Sandbox Code Playgroud)

然后我收到一堆错误,它找不到 @Nullable 和其他属性的符号。

其他 stackoverflow 答案建议添加此内容,我这样做:

afterEvaluate {
  javadocs.classpath += files(android.libraryVariants.collect { variant ->
    variant.javaCompileProvider.get().classpath.files
  })
}
Run Code Online (Sandbox Code Playgroud)

这修复了解析 @NonNull 等的错误,但现在我留下了一堆 JavaDoc 无法解析我自己的代码的错误,例如:

void addNotificationsListener(@NonNull NotificationsListener listener);(找不到符号NotificationsListener)

当我向允许列表中添加更多文件时,这些似乎会减少,但我明确不想为这些其他文件生成文档。帮助!

为什么 Gradle 7 破坏了所有 JavaDocs?我该如何修复它?

(回顾一下:这是我失败的任务:)

task javadocs(type: Javadoc) {
    source android.sourceSets.main.java.srcDirs
    configurations.implementation.setCanBeResolved(true)

    classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + configurations.implementation
    include javaDocsAllowList
    destinationDir = file("./docs/javadoc")

    afterEvaluate {
        javadocs.classpath += files(android.libraryVariants.collect { variant ->
            variant.javaCompileProvider.get().classpath.files
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:基于建议的要点https://gist.github.com/Robyer/a6578e60127418b380ca133a1291f017?,我将任务更改为以下内容:

task javadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    android.libraryVariants.all { variant ->
        if (variant.name == 'release') {
            owner.classpath += variant.javaCompileProvider.get().classpath
        }
    }
    include javaDocsAllowList
    destinationDir = file("./docs/javadoc")
}
Run Code Online (Sandbox Code Playgroud)

然而这没有什么区别;它仍然遇到相同的错误,无法解析我自己的代码

void addNotificationsListener(@NonNull NotificationsListener listener);(找不到符号NotificationsListener)`

小智 2

我目前使用的是 gradle 版本 7.0.2 和 Android Studio Arctic Fox | 2020.3.1补丁2,为了生成sourcesJar、javadocs和javadocJar,我使用:

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    archiveClassifier.set('sources')
    archivesBaseName ="singleAdapter-1.1.0"
}
task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.sourceFiles
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    android.libraryVariants.all { variant ->
        if (variant.name == 'release') {
            owner.classpath += variant.javaCompileProvider.get().classpath
        }
    }
    options.memberLevel = JavadocMemberLevel.PRIVATE
}
task javadocJar(type: Jar, dependsOn: javadoc) {
    archiveClassifier.set('javadoc')
    archivesBaseName = "singleAdapter-1.1.0"
    from javadoc.destinationDir
}
Run Code Online (Sandbox Code Playgroud)

最后,生成的文件可以在以下位置找到:

  1. 项目视图 -> myModule/build/docs/javadoc - 用于 javadoc
  2. 项目视图 -> myModule/build/docs/libs - 对于sourcesJar和javadocJar

我已将其发布在我的 Github Gist 上:这里

我希望在你的情况下我可以帮助你。