为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)
或者,为了添加额外的库,如libcrypto
和libssl
。对于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库
- 下载OpenSSL源代码。
- 将源代码提取到一个文件夹中,然后使用CLI导航到该文件夹。
注意:如果您的开发平台是Windows,则需要具有Perl 5.14或更高版本的msys才能构建OpenSSL。
- 将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\
- 使用以下命令配置OpenSSL源代码以用于Android构建,其中<arch>可以是以下之一:
arm
、arm64
、x86
或x86_64
./Configure shared android-<arch> -D__ANDROID_API__=26
注意: 您必须考虑根据您应用程序可用的地区的法律法规来启用或禁用SSL功能。有关可配置功能的更多信息,请参阅OpenSSL配置选项。
- 没有后缀名,Android会加载系统库
libcrypto.so
和libssl.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
注意: 尽管
libcrypto
和libssl
共享库没有版本号,但它们将具有_3后缀。然后设置您的main.cpp文件中的环境变量
qputenv("ANDROID_OPENSSL_SUFFIX", "<custom_suffix>");
注意: Android不会加载已标记版本的库。
© 2024 Qt公司。此处包含的文档贡献权归其各自所有者所有。此处提供的文档根据自由软件基金会发布的《GNU自由文档许可证》第1.3版授予许可。Qt以及相关的标志是Qt公司在芬兰以及其他国家和地区的商标。所有其他商标是其各自所有者的财产。