0

我最近使用OpenSSL作为加密后端为 Android构建了 libssh2 ,我还使用 NDK 自己构建了 libcrypto.so 和 libssl.so。在我的构建过程中,我生成了一个与 libssh2.a 链接的最终 libcustom.so。

谷歌表示:“如果您尝试使用自己的 OpenSSL 副本但忘记将其与应用的 APK 捆绑在一起,则该应用可能会在包含 libcrypto.so 的 Android 平台版本上正常运行。但是,该应用可能会在更高版本的 Android 上崩溃不包含此库的(例如,Android 6.0 及更高版本)。” 这就是我将 libcrypto.so、libssl.so 和 libcustom.so 打包到我的 APK 中的原因。

运行加载 libcustom.so 的 Android 应用程序时,我的应用程序崩溃并出现以下错误: 失败:dlopen 失败:无法找到“libcustom.so”引用的符号“EVP_cast5_cbc”... ONLY ON ANDROID 5。它适用于 Android 6 及更高版本。

符号EVP_cast5_cbc未定义,但在 libssh2.a 中被引用,但在 libcrypto.so 中定义良好。

我不明白为什么它可以在 Android 6 及更高版本而不是 Android 5 上正确运行。

我认为在 Android 5 上,使用的 libcrypto.so 不是我嵌入 APK 的那个,而是来自 /system/lib 的那个;所以我尝试重命名 libcrypto.so 并使用重命名的 libcrypto 构建 libssh2.a,但我面临同样的问题。

有人有想法吗?

提前致谢。

4

1 回答 1

0

Google 已更改 Marshmallow 及更高版本的私有库的使用;这可能是您正在经历的情况。

从 Android 6.0 开始,系统会阻止应用动态链接非 NDK 库,这可能会导致您的应用崩溃。

根据这张表:https ://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk 。当您使用私有库运行 Lollipop 时,您应该能够看到 logcat 警告。例如:

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120
于 2019-11-06T17:42:29.187 回答