не удается найти символ EVP_cast5_cbc на Android

Недавно я создал libssh2 для Android, используя OpenSSL в качестве криптобэкенда, а также сам создал libcrypto.so и libssl.so, используя NDK. В процессе сборки я создаю окончательный libcustom.so, связанный с libssh2.a.

Google сказал: «Если вы пытались использовать свою собственную копию OpenSSL, но забыли связать ее с APK вашего приложения, приложение может нормально работать на версиях платформы Android, которые включают libcrypto.so. Однако приложение может аварийно завершать работу на более поздних версиях Android. которые не включают эту библиотеку (например, Android 6.0 и более поздние версии)». вот почему я упаковываю libcrypto.so, libssl.so и libcustom.so в свой APK.

При запуске приложения Android, которое загружает libcustom.so, мое приложение аварийно завершает работу со следующей ошибкой: сбой: ошибка dlopen: не удается найти символ "EVP_cast5_cbc", на который ссылается "libcustom.so"... ТОЛЬКО НА ANDROID 5. Он хорошо работает на Android 6 и выше.

Символ EVP_cast5_cbc не определен, но упоминается в libssh2.a, но хорошо определен в libcrypto.so.

Я не понимаю, почему он работает правильно на Android 6 и выше, а не на Android 5.

Я думал, что в Android 5 используется не тот libcrypto.so, который я встроил в APK, а тот, который находится в /system/lib ; поэтому я попытался переименовать libcrypto.so и собрать libssh2.a, используя переименованный libcrypto, но столкнулся с той же проблемой.

У кого-нибудь есть идея?

Заранее спасибо.


person gxela    schedule 06.11.2019    source источник


Ответы (1)


Google изменил использование частных библиотек для Marshmallow и выше; это может быть случай, который вы испытываете.

Начиная с Android 6.0, система предотвращает динамическое связывание приложений с библиотеками, отличными от NDK, что может привести к сбою вашего приложения.

Согласно этой таблице: https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk. Вы должны иметь возможность видеть предупреждения logcat, когда используете Lollipop с приватными библиотеками. Например:

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
person GensaGames    schedule 06.11.2019
comment
Спасибо за ваш ответ. Как сказал Google: если вы пытались использовать свою собственную копию OpenSSL, но забыли связать ее с APK вашего приложения, приложение может нормально работать на версиях платформы Android, которые включают libcrypto.so. Однако приложение может аварийно завершать работу в более поздних версиях Android, не включающих эту библиотеку (например, Android 6.0 и более поздние версии). вот почему я включаю свою версию openssl в свой APK. Когда я запускаю logcat, нет предупреждения о системной библиотеке, которую я не должен использовать. Вроде с этой стороны все нормально. - person gxela; 07.11.2019
comment
Хорошо, ребята, я нашел проблему... Используя readelf на моем libcrypto_custom.so, я обнаружил, что он все еще связан с libcrypto.so, так что мое предположение было верным, он все еще использовал libcrypto.so из системы. Что я сделал, так это исправил файл android.conf в системе сборки openssl, чтобы добавить вариант: mycustom-android-arm =› { inherit_from =› [android-arm], shlib_variant =› .custom, }, теперь библиотека в порядке. генерируется и не используется в системе! Спасибо - person gxela; 07.11.2019