写点什么

解决 QT 编译 Android 程序不支持 openssl 问题

作者:DS小龙哥
  • 2022 年 3 月 27 日
  • 本文字数:2666 字

    阅读完需:约 9 分钟

1. 问题

使用 QT 编译 Android 程序时,由于需要使用 HTTPS 的请求,打包的 apk 里需要附带 openssl 相关的库,不然无法使用 https 请求。


QT 官方对 openssl 支持的说明,以及提供的解决办法:https://doc.qt.io/qt-5/android-openssl-support.html


Qt 安装包附带 OpenSSL 支持,但由于某些国家/地区的法律限制,OpenSSL 库不是该包的一部分。如果你的应用程序依赖于 OpenSSL,请考虑将 SSL 库与你的应用程序包 (APK) 一起打包,因为目标设备可能有也可能没有。


你可以使用 QSslSocket::supportsSsl()静态函数来检查目标设备上的 SSL 支持。首先包括头文件:


#include < QSslSocket > 
复制代码


然后使用以下行检查是否支持 SSL:


qDebug () << "设备支持OpenSSL:" << QSslSocket :: supportsSsl ();  
复制代码


Android7.0 更新的说明:


如果您的应用依赖平台库,则请参见 NDK 文档,了解使用公开 API 等效项替换普通私有 API 的典型修复。 您还可以链接至平台库,而无需实现此应用,如果应用使用的库是平台的一部分(例如 libpng),但不属于 NDK,则更可如此。 此情况下,请确保您的 APK 包含您打算链接到的所有 .so 文件。

注意:有些第三方库可能会链接至非公开 API。 如果您的应用使用这些库,那么当您的应用在下一个官方发布的 Android 版本上运行时可能会出现崩溃现象。

Android7.0 开始,应用不应依赖或使用不属于 NDK 的原生库,因为这些库可能会发生更改或从一个 Android 版本迁移至另一版本。 例如,从 OpenSSL 切换至 BoringSSL 即属于此类更改。 此外,不同的设备可能提供不同级别的兼容性,因为不属于 NDK 中的平台库没有兼容性要求。 如果你必须在较旧设备上访问非 NDK 库,则请依据 Android API 级别进行加载。

2. 解决办法

去这里下载 QT 的 openssl 工程: https://github.com/KDAB/android_openssl


CSDN 上的下载地址: https://download.csdn.net/download/xiaolong1126626497/82644274


下载之后,将压缩包解压,放到自己现在的工程目录下,然后修改现在工程的 pro 文件,将刚才解压的工程添加到自己的工程里即可解决。


android: include($$PWD/android_openssl-master/openssl.pri)
复制代码


openssl.pr 里包含的代码:


!contains(QT.network_private.enabled_features, openssl-linked) {    CONFIG(release, debug|release): SSL_PATH = $$PWD                            else: SSL_PATH = $$PWD/no-asm
if (!versionAtLeast(QT_VERSION, 5.12.4)) { contains(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/arm/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/arm/libssl.so }
contains(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/arm64/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/arm64/libssl.so }
contains(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/x86/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/x86/libssl.so } } else { if (equals(QT_VERSION, 5.12.4) || equals(QT_VERSION, 5.13.0)) { contains(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm/libssl.so }
contains(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm64/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm64/libssl.so }
contains(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86/libssl.so }
contains(ANDROID_TARGET_ARCH, x86_64) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86_64/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86_64/libssl.so } } else { versionAtLeast(QT_VERSION, "5.14.0") { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm/libcrypto_1_1.so \ $$SSL_PATH/latest/arm/libssl_1_1.so \ $$SSL_PATH/latest/arm64/libcrypto_1_1.so \ $$SSL_PATH/latest/arm64/libssl_1_1.so \ $$SSL_PATH/latest/x86/libcrypto_1_1.so \ $$SSL_PATH/latest/x86/libssl_1_1.so \ $$SSL_PATH/latest/x86_64/libcrypto_1_1.so \ $$SSL_PATH/latest/x86_64/libssl_1_1.so } else { equals(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm/libcrypto_1_1.so \ $$SSL_PATH/latest/arm/libssl_1_1.so }
equals(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm64/libcrypto_1_1.so \ $$SSL_PATH/latest/arm64/libssl_1_1.so }
equals(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/x86/libcrypto_1_1.so \ $$SSL_PATH/latest/x86/libssl_1_1.so }
equals(ANDROID_TARGET_ARCH, x86_64) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/x86_64/libcrypto_1_1.so \ $$SSL_PATH/latest/x86_64/libssl_1_1.so } } } }}
复制代码



(1)在 ubuntu18.04 环境下,编译 Android 工程测试通过。





(2)在 win10 下编译 Android 工程测试通过



发布于: 2022 年 03 月 27 日阅读数: 3
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
解决QT编译Android程序不支持openssl问题_3月月更_DS小龙哥_InfoQ写作平台