Android Gradle,重复数据删除共享库libcrypto.so

oxosxuxt  于 11个月前  发布在  Android
关注(0)|答案(1)|浏览(118)

我有一个关于gradle构建系统的问题。我有一个依赖于OpenSSL的库(用于React Native),我已经声明了我的依赖关系:

dependencies {
  //noinspection GradleDynamicVersion
  implementation 'com.facebook.react:react-android:+'
  implementation 'com.android.ndk.thirdparty:openssl:1.1.1q-beta-1'
}

字符串
如果我的库是构建过程中唯一一个使用此依赖项的库,那么一切都编译正常。然而,如果另一个库也依赖于openssl,它也会生成自己的libcrypto.so,然后构建过程会因重复的符号而失败:

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/libcrypto.so' from inputs:
- D:\Project\sqlst\node_modules@op-engineering\op-sqlcipher\android\build\intermediates\library_jni\debug\jni\arm64-v8a\libcrypto.so
- C:\Users\shiroze\.gradle\caches\transforms-3\e13f88164840fe641a466d05cd8edac7\transformed\jetified-flipper-0.182.0\jni\arm64-v8a\libcrypto.so
If you are using jniLibs and CMake IMPORTED targets, see
developer.android.com/r/tools/jniLibs-vs-imported-targets


一个解决方案是将libcrypto.so从我的库添加到排除列表中,但这意味着如果没有其他库生成.so,那么它将从运行时中丢失,应用程序将崩溃。

packagingOptions {
        doNotStrip resolveBuildType() == 'debug' ? "**/**/*.so" : ''
        excludes = [
                "META-INF",
                "META-INF/**",
                "**/libjsi.so",
                "**/libreact_nativemodule_core.so",
                "**/libturbomodulejsijni.so",
                "**/libc++_shared.so",
                "**/libfbjni.so",
                "**/libcrypto.so"
        ]
}


另一个选项是使用pickFirst函数:

pickFirst '**/x86/libcrypto.so'
pickFirst '**/x86_64/libcrypto.so'
pickFirst '**/armeabi-v7a/libcrypto.so'
pickFirst '**/arm64-v8a/libcrypto.so'


但据我所知,这只是告诉编译器,只需选择链接库时出现的第一个版本。如果它从另一个依赖项中选择了不正确的版本,并且缺少符号或不正确的函数签名,该怎么办?
只是想了解这里发生了什么,如果有任何方法来保证我的图书馆将正确链接。非常感谢!

xxls0lw8

xxls0lw81#

这里似乎没有很好的答案,基本上Gradle提供的唯一策略是强制所有依赖项使用一个版本。
你可以在这里找到一个简短的战略简历:
https://ospfranco.com/how-to-resolve-duplicated-libraries-on-android/

相关问题