如何修复第三方 sdks 中重复的 libgnustl_shared.so 文件?

How to fix the libgnustl_shared.so file duplicated which in third party sdks?

当我使用 gradle 构建和 运行 apk 时,出现以下错误:::::

Error:Execution failed for task ':app:transformNative_libsWithMergeJniLibsForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK lib/armeabi-v7a/libgnustl_shared.so
    File1:  
app/build/intermediates/exploded-aar/com.facebook.react/react-native/0.20.1/jni
    File2:  
app/build/intermediates/exploded-aar/app/videosdk/unspecified/jni

最后,我将其中一个so文件移动到assets中,使用前手动加载

 String path = getApplication().getFilesDir().toString() + "/armeabi-v7a/libgnustl_shared.so";
 if (!FileUtils.isFileExit(path))  //move so from assets to another dir
       FileUtils.initSOFileFromAssetsFile(getApplication()); 
 System.load(path);

虽然修复了 DuplicateFileException 错误,但效果不是很好。 如果有人得到更好的方法请告诉我。 谢谢!^_^

我可以通过将下面的代码添加到我的 build.gradle 来解决这个问题。这有点像黑客;应该有一个更优雅的修复,比如不必包含 React Native 版本。理想情况下,React Native 会解决这个问题。我开了一个问题:https://github.com/facebook/react-native/issues/9454

import com.android.build.gradle.internal.pipeline.TransformTask

def deleteDuplicateJniFiles() {
    def files = fileTree("${buildDir}/intermediates/exploded-aar/com.facebook.react/react-native/0.31.0/jni/") {
        include "**/libgnustl_shared.so"
    }
    files.each { it.delete() }
}

tasks.withType(TransformTask) { pkgTask ->
    pkgTask.doFirst { deleteDuplicateJniFiles() }
}

更简洁的解决方案是明确告诉 Gradle 您知道该问题并接受这些文件中的任何一个。根据您支持的体系结构,您可能只需要其中的一些。您可以找到详细信息 in documentation

android {

 // some stuff
 packagingOptions {
        pickFirst 'lib/armeabi-v7a/libgnustl_shared.so'
        pickFirst 'lib/arm64-v8a/libgnustl_shared.so'
        pickFirst 'lib/x86_64/libgnustl_shared.so'
        pickFirst 'lib/x86/libgnustl_shared.so'
    }
}