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

举报
DS小龙哥 发表于 2022/02/28 00:26:22 2022/02/28
【摘要】 使用QT编译Android程序时,由于需要使用HTTPS的请求,打包的apk里需要附带openssl相关的库,不然无法使用https请求。

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
                }
            }
        }
    }
}

image-20220227234536700

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

image-20220227234717516

image-20220227234800402

image-20220227234823605

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

image-20220228000238319

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。