为Android添加OpenSSL支持

Qt安装包附带OpenSSL支持,但由于某些国家的法律限制,OpenSSL库不属于该包。如果您的应用程序依赖于OpenSSL,请考虑将SSL库打包到您的应用程序包(APK或AAB)中,因为目标设备可能或可能没有它们。

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

#include <QSslSocket>

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

qDebug() << "Device supports OpenSSL: " << QSslSocket::supportsSsl();

检查Qt Creator的应用程序输出部分或Android的logcat以查找该日志消息。

添加OpenSSL库

使用便利的OpenSSL for Android存储库,您可以直接将OpenSSL库包含到您自己的项目中。

使用CMake,将以下内容添加到您的CMakeLists.txt

if (ANDROID)
    include(FetchContent)
    FetchContent_Declare(
        android_openssl
        DOWNLOAD_EXTRACT_TIMESTAMP true
        URL https://github.com/KDAB/android_openssl/archive/refs/heads/master.zip
    )
    FetchContent_MakeAvailable(android_openssl)
    include(${android_openssl_SOURCE_DIR}/android_openssl.cmake)
endif()

或者如果您已将存储库克隆到子目录中

include(<path/to/android_openssl>/android_openssl.cmake)

然后,将库添加到您的目标中

qt_add_executable(your_target_name ..)
qt_add_executable(your_second_target_name ..)

if (ANDROID)
    add_android_openssl_libraries(your_target_name your_second_target_name)
endif()

对于qmake,将以下内容添加到您的.pro文件中

android: include(<path/to/android_openssl/openssl.pri)

或者,为了添加额外的库,如libcryptolibssl。对于CMake,使用

set_target_properties(<target_name> PROPERTIES
    QT_ANDROID_EXTRA_LIBS "<path_to_libs_dir>/libcrypto_3.so" "<path_to_libs_dir>/libssl_3.so"
)

或者对于qmake使用

ANDROID_EXTRA_LIBS += \
    <path_to_libs_dir>/libcrypto_3.so \
    <path_to_libs_dir>/libssl_3.so

注意:针对多个架构时,请包含所有目标架构的OpenSSL库。

使用Qt Creator,您可以添加额外的库。有关更多信息,请参阅Qt Creator:向项目中添加库

为Android构建OpenSSL

以下说明指导您手动构建OpenSSL库

  1. 下载OpenSSL源代码。
  2. 将源代码提取到一个文件夹中,然后使用CLI导航到该文件夹。

    注意:如果您的开发平台是Windows,则需要具有Perl 5.14或更高版本的msys才能构建OpenSSL。

  3. 将Android LLVM工具链添加到您的路径中,例如,对于Linux,使用
    export PATH=~/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/<host>/bin:$PATH

    Android SDK通常由Qt Creator或Android Studio安装在以下位置

    • Linux:~/Android/Sdk/
    • macOS:~/Library/Android/sdk/
    • Windows:C:\Users\<USER>\AppData\Local\Android\Sdk\
  4. 使用以下命令配置OpenSSL源代码以用于Android构建,其中<arch>可以是以下之一:armarm64x86x86_64
    ./Configure shared android-<arch> -D__ANDROID_API__=26

    注意: 您必须考虑根据您应用程序可用的地区的法律法规来启用或禁用SSL功能。有关可配置功能的更多信息,请参阅OpenSSL配置选项

  5. 没有后缀名,Android会加载系统库libcrypto.solibssl.so。这些版本可能与您的库或Qt期望的版本不同。为确保Qt应用程序可以加载手动构建的OpenSSL库,请运行以下命令
    make -j$(nproc) SHLIB_VERSION_NUMBER= build_libs
    
    mkdir -p ${out_path}
    cp libcrypto.so ${out_path}/libcrypto_3.so
    cp libssl.so ${out_path}/libssl_3.so
    
    cd ${out_path}
    patchelf --set-soname libcrypto_3.so libcrypto_3.so
    patchelf --set-soname libssl_3.so libssl_3.so
    patchelf --replace-needed libcrypto.so libcrypto_3.so libssl_3.so

    注意: 尽管libcryptolibssl共享库没有版本号,但它们将具有_3后缀。

    然后设置您的main.cpp文件中的环境变量

    qputenv("ANDROID_OPENSSL_SUFFIX", "<custom_suffix>");

    注意: Android不会加载已标记版本的库。

© 2024 Qt公司。此处包含的文档贡献权归其各自所有者所有。此处提供的文档根据自由软件基金会发布的《GNU自由文档许可证》第1.3版授予许可。Qt以及相关的标志是Qt公司在芬兰以及其他国家和地区的商标。所有其他商标是其各自所有者的财产。