android 如何定义要在gradle打包选项中使用的so文件

carvr3hs  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(139)

我正在尝试构建包含两个库的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:
gkl3eglg

gkl3eglg1#

您可以从相依性中排除具有“错误”版本的程式库。

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

qlzsbp2j2#

其实我自己就能解决这个问题。
本质上,我需要做的是在我的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文件夹/库中。

相关问题