如何定义gradle打包选项中使用哪个so文件

问题描述 投票:0回答:3

我正在尝试构建包含两个库的 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:
android gradle android-gradle-plugin
3个回答
4
投票

我实际上能够自己解决这个问题。

本质上,我需要做的就是向我的 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 文件夹/库中。


0
投票

您可以从具有“错误”版本的依赖项中排除该库。

dependencies {
    implementation("some-library") {
        exclude(group = "com.example.imgtools", module = "native")
    }
}

0
投票

更新 kotlin gradle dsl

tasks.withType<MergeNativeLibsTask> {
    doFirst {
        inputs.files
            .filter { 
                it.canonicalPath.contains("<your pattern here>")
            }
            .forEach {
                it.delete()
            }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.