【问题标题】:How to fix the libgnustl_shared.so file duplicated which in third party sdks?如何修复第三方 sdks 中重复的 libgnustl_shared.so 文件?
【发布时间】:2016-09-09 02:39:18
【问题描述】:

当我使用 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

【问题讨论】:

  • 我的一个模块具有相同的 libgnustl_shared.so 文件,当我将 ReactAndroid 添加到我的项目中时,我收到此错误提示..
  • 这是一个干净的、非黑客的解决方案:stackoverflow.com/a/35660513/2850807

标签: android java-native-interface duplicates android-gradle-plugin android-library


【解决方案1】:

更简洁的解决方案是明确告诉 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'
    }
}

【讨论】:

  • 没有 gradle 怎么办?
  • 问题以“当我使用 gradle 构建和运行 apk 时”开头... :) 你使用其他构建工具吗?
【解决方案2】:

我可以通过将以下代码添加到我的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 文件中包含 flatDir { dirs 'libs' } 也很重要(比您添加上述文件的级别高一级。)
【解决方案3】:

最后,我将其中一个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 错误,但效果不是很好。 如果有人得到更好的方法,请告诉我。 谢谢!^_^

【讨论】:

  • 您有没有找到比这更好的方法而无需重新打包其中一个 .so 文件?
  • 你能详细解释一下吗?我不明白您的意思是“我将其中一个 so 文件移动到资产”。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2016-05-10
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多