我有一个关于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'
型
但据我所知,这只是告诉编译器,只需选择链接库时出现的第一个版本。如果它从另一个依赖项中选择了不正确的版本,并且缺少符号或不正确的函数签名,该怎么办?
只是想了解这里发生了什么,如果有任何方法来保证我的图书馆将正确链接。非常感谢!
1条答案
按热度按时间xxls0lw81#
这里似乎没有很好的答案,基本上Gradle提供的唯一策略是强制所有依赖项使用一个版本。
你可以在这里找到一个简短的战略简历:
https://ospfranco.com/how-to-resolve-duplicated-libraries-on-android/