提问人:pei wang 提问时间:8/7/2023 更新时间:8/7/2023 访问量:49
使用 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?
问:
我正在尝试升级 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)
不知道有没有问题。属性过滤器?还是别的什么?如果您需要我的插件源代码或演示应用程序,请告诉我。
答: 暂无答案
评论