我正在为 Android 开发一个基于 Qt 的应用程序,它使用 QSslSocket 下载数据。由于依赖于 OpenSSL 库的 Marshmallow Qt 程序,Android 从 OpenSSL 转向 BoringSSL,因此在 Android 6+ 上会产生以下警告:
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 CRYPTO_free W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EVP_CipherFinal W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EVP_rc2_cbc W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 SSLv2_client_method W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 SSLv2_server_method W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 OPENSSL_add_all_algorithms_noconf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 OPENSSL_add_all_algorithms_conf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法解析 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 OPENSSL_add_all_algorithms_conf W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 EC_get_builtin_curves W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: 无法设置 SSL_CTRL_SET_TLSEXT_HOSTNAME,服务器名称指示已禁用 W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: 无法调用未解析的函数 CRYPTO_free
但是,套接字本身成功连接到远程主机并从那里读取数据,没有任何明显的问题。这让我想知道我是否需要自己构建 OpenSSL 库并将其打包,或者使用平台提供的 BoringSSL 是否可以。
我还注意到,Android 版本低于 6 的应用程序倾向于使用 OpenSSL 的系统版本,即使我提供了自己的版本。我尝试添加构建的 libssl.so 和 libcrypto.so(从 libssl.so.1.0.0 和 libcrypto.so.1.0.0 重命名)ANDROID_EXTRA_LIBS
(不确定是否LIBS+=
也需要使用),甚至静态链接 libssl.a 和libcrypto.a. 仍然 QSslSocket::sslLibraryVersionString() 返回平台上可用的版本。
我的问题是:
- 是需要自己搭建OpenSSL库并打包还是使用平台提供的库就可以了?
- 如果我这样做,如何让 Android 识别 libssl.so 和 libcrypto.so?