使用 Gradle 8+ 和 Android Gradle 插件 8.0.0,如何获取项目中所有依赖 JAR 和 AAR 的 GAV 信息?

With Gradle 8+ and Android Gradle Plugin 8.0.0, how to obtain the GAV information for all the dependent JAR and AAR in project?

提问人:pei wang 提问时间:8/7/2023 更新时间:8/7/2023 访问量:49

问:

我正在尝试升级 Gradle 8 和 AGP 8 下的 Gradle 插件。该插件最初是使用 AGP 3.5.4 编译的,其 registerTransform API 在新环境中无法再使用。在尝试将插件改编为 AGP 8 时,我发现在以前的版本中可以使用以下方法获取 JAR 包的 GAV 信息。

 inputs.each {
            it.jarInputs.each {
                def jarName = it.name
                def src = it.getFile()
                def dest = outputProvider.getContentLocation(jarName, it.contentTypes, it.scopes, Format.JAR);
           //...
            }
}

通过 ,插件会获取一个字符串,例如“com.androidx.constriantlayout:constraintlayout:2.1.4”(仅示例样式)。它代表 JAR 的 GAV 信息。def jarName = it.name

但是,在 AGP 8 环境下,该方法不能再用于获取 JAR 包的 GAV 信息。“input”不再具有“name”属性。这是由于整个转换 API 已弃用,该 API 已被“androidExtensionComponent”的“toTransform”API 取代。新的“toTransform”API 不提供从输入 JAR 包获取 GAV 信息的方法。

有人建议我在 Gradle 的依赖解析阶段使用 TransformAction,将 JAR 包的 GAV 信息保存在工件中,并写入一个文件,以便后续插件查询。

有人遇到过这样的问题吗?请帮帮我,非常感谢!

我确实遵循了这种方法。在阅读了官方文档后,gradle 官网的文档,我在 build.gradle(:app) 文件中添加了以下两段核心代码。

abstract class VersionInfoEncompassTransformAction implements TransformAction<TransformParameters.None> {
    @InputArtifact
    abstract Provider<FileSystemLocation> getInputArtifact()


    @Override
    void transform(TransformOutputs outputs) {
        def input = inputArtifact.get().asFile
        // todo nameWithoutExtension extension属性缺失
        def output = outputs.file(input.nameWithoutExtension + " -versioned" + input.extension)
        addVersionInformation(input, output)
    }

    private void addVersionInformation(File input, File output) {
        println("addVersionInfomation:" + output.absoluteFile)
        Files.copy(input, output)
        def jarFileOs = new JarOutputStream(new FileOutputStream(output))

        def versionFile = new File("version-info.prop")
        writeFirstTestLine(versionFile)

        def versionEntry = new JarEntry(versionFile.name)

        versionFile.withInputStream {
            BufferedInputStream bufferedInputStream = new BufferedInputStream(it)
            try {
                jarFileOs.putNextEntry(versionEntry)
                byte[] buffer = new byte[1024]
                int length
                while ((length = bufferedInputStream.read(buffer)) != -1) {
                    jarFileOs.write(buffer, 0, length);
                }
                jarFileOs.closeEntry()
            } catch (IOException e) {
                e.printStackTrace()
            } finally {
                bufferedInputStream.close()
                jarFileOs.close()
            }
        }

    }

    private void writeFirstTestLine(File outputFile) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))
            writer.write("1.0")
            writer.close()
        } catch (IOException e) {
            e.printStackTrace()
        }
    }
}
dependencies {
    def artifactType = Attribute.of('artifactType', String)
    registerTransform(VersionInfoEncompassTransformAction.class) {
        from.attribute(artifactType, "jar")
        to.attribute(artifactType, "jar")
    }
}

但是,在实践中,当我尝试运行构建命令时,带有上述代码的脚本似乎没有执行转换任务。我的命令是:

./gradlew assembleDebug --refresh-dependencies 在输出中,我无法在这里找到我的鳕鱼日志println("addVersionInfomation:" + output.absoluteFile)

不知道有没有问题。属性过滤器?还是别的什么?如果您需要我的插件源代码或演示应用程序,请告诉我。

gradle android-gradle-plugin android-build

评论


答: 暂无答案