我正在尝试构建包含两个库的 Android 应用程序。在一个库中,正在使用较新版本的 ffmpeg。在另一个库中,该库的依赖项正在使用旧版本的 ffmpeg。尝试在包选项中使用 pickFirst 会选择错误的库。有没有可能的方法来解决这个问题,或者这只是 Gradle 的限制?
这是我遇到的错误
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeNativeLibsTask$MergeNativeLibsTaskWorkAction
> 2 files found with path 'lib/arm64-v8a/libavcodec.so' from inputs:
我实际上能够自己解决这个问题。
本质上,我需要做的就是向我的 gradle 文件添加一个任务,该任务将在运行之前拦截合并库任务并删除不需要的库:
tasks.whenTaskAdded((tas -> {
if (tas.name.contains("mergeDebugNativeLibs")) {
tasks.named("mergeDebugNativeLibs") {it
doFirst {
java.nio.file.Path notNeededDirectory = it.externalLibNativeLibs
.getFiles()
.stream()
.filter(file -> file.toString().contains("Metadata"))
.findAny()
.orElse(null)
.toPath();
Files.walk(notNeededDirectory).forEach(file -> {
if (file.toString().contains("libav") || file.toString().contains("libsw")) {
Files.delete(file);
}
});
}
}
}
if (tas.name.contains("mergeReleaseNativeLibs")) {
tasks.named("mergeReleaseNativeLibs") {it
doFirst {
java.nio.file.Path notNeededDirectory = it.externalLibNativeLibs
.getFiles()
.stream()
.filter(file -> file.toString().contains("Metadata"))
.findAny()
.orElse(null)
.toPath();
Files.walk(notNeededDirectory).forEach(file -> {
if (file.toString().contains("libav") || file.toString().contains("libsw")) {
Files.delete(file);
}
});
}
}
}
}))
在这种情况下,不需要的库位于 FFmpegMetadataMediaRetriever 文件夹/库中。
您可以从具有“错误”版本的依赖项中排除该库。
dependencies {
implementation("some-library") {
exclude(group = "com.example.imgtools", module = "native")
}
}
更新 kotlin gradle dsl
tasks.withType<MergeNativeLibsTask> {
doFirst {
inputs.files
.filter {
it.canonicalPath.contains("<your pattern here>")
}
.forEach {
it.delete()
}
}
}