【问题标题】:Qt for Android and OpenSSLQt for Android 和 OpenSSL
【发布时间】:2015-02-19 17:15:37
【问题描述】:

Qt 安装为 Android 提供了预构建的二进制文件。从http://doc.qt.io/qt-5/opensslsupport.html 来看,这些二进制文件似乎是在 OpenSSL 支持下构建的,但由于法律限制,OpenSSL 库不是包的一部分。建议是自己构建和打包库。两个问题:

  1. 我的应用程序支持 Android 4.1 及更高版本。我可以简单地依赖/system/lib/libssl.so/system/lib/libcrypto.so 而不是打包我自己的OpenSSL 库吗?换句话说,这些库是否可能在任何运行 OS 4.1 及更高版本的设备上都不可用?

  2. 如果我必须打包我自己的库,use libcryto.so and libssl.so in an android project? 建议这些库应该以不同的方式命名,例如 libPrivateSsl.solibPrivateCrypto.so。但是,如果我这样做,Qt 二进制文件将无法识别它们,因为它们被硬编码以动态查找标准名称。我该怎么办?问候。

【问题讨论】:

    标签: android qt


    【解决方案1】:

    Qt 默认使用系统 openssl,所以是的,你可以依赖它。如果您自己打包,那么您应该使用 -openssl-linked 选项构建 Qt,这将允许您使用重命名的 libcrypto 和 libssl 版本。

    【讨论】:

    • 在 Android >= 6.0 上,您的 Qt Android 应用程序必须包含您自己的 libssl.so 和 libcrypto.so。虽然 Android 系统包含这些库,但您的应用程序无法使用它们。要在 macOS 主机上构建 arm、armv7 和 x86 OpenSSL,此脚本有效,请参阅 fork 并在 README 中添加注释:github.com/esutton/android-openssl
    【解决方案2】:
    • 在 Android 5.0 及更低版本上,QSslSocket 将使用 Android 系统的 libssl.so 和 libcrypto.ssl
    • 在 Android >= 6.0 上,您的应用必须包含它自己的 libssl.so 和 libcrypto.ssl
    • 由于某些国家/地区的法律限制,OpenSSL 不是 Qt 安装的一部分。
    • 您必须考虑根据您的应用程序可用地区的法律限制启用/禁用 SSL 功能。
    • See the SSL configure options for details about the configurable features
    • 不要使用您在 Internet 上发现的预构建 OpenSSL 库。

    1) 如何在 macOS 上构建 OpenSSL:

    要使用 ma​​cOS 主机为 arm、arm-v7a 和 x86 构建 OpenSSL Android 库,如果您使用 Android NDK r10e,此脚本非常有用:

    ** 将库复制到 Qt 应用的项目文件夹:**

    平台/ └── 安卓 └── 库 └── openssl ├── README.md ├── android-openssl-vsts.webloc ├── arch-armeabi-v7a │   ├── libcrypto.a │   ├── libcrypto.so │   ├── libssl.a │   └── libssl.so └── arch-x86 ├── libcrypto.a ├── libcrypto.so ├── libssl.a └── libssl.so

    2) 添加到您的 Qt yourapp.pro 项目文件中:

    安卓 { # Android >= 6.0 要求应用安装自己的 libcrypto.so 和 libssl.so # https://subsite.visualstudio.com/DefaultCollection/android-openssl 等于(ANDROID_TARGET_ARCH,armeabi-v7a){ ANDROID_EXTRA_LIBS += $$files($${PWD}/platform/android/lib/openssl/arch-armeabi-v7a/*.so) } 等于(ANDROID_TARGET_ARCH,x86){ ANDROID_EXTRA_LIBS += $$files($${PWD}/platform/android/lib/openssl/arch-x86/*.so) } }

    我花了很多时间尝试在 Linux 和 macOS 上构建 OpenSLL,直到我找到了该脚本,并发现我需要使用 Android NDK r10e 或更早版本进行构建。

    Qt Adding OpenSSL Support for Android 指南对我不起作用。但是,如果我恢复到 NDK r10e,它可能会起作用。

    我希望这可以节省一些时间。

    【讨论】:

    • 对于github.com/ekke/android-openssl-qt sript 和android-ndk-r10e-linux-x86_64.zip - 为armeabi-v7ax86 构建良好。如何为arm64-v8a 构建?那里的最大 Android API 也是android-21。是否可以或需要稍后更新此脚本以获得更大的版本?
    • 带有任何 NDK 版本的工作脚本的分叉 repo:github.com/akontsevich/openssl-android-build - 工作脚本将在那里(至少对于 Linux 和 Mac)。
    【解决方案3】:

    构建适用于 Android 的 Qt 移动应用程序如果应用程序应该在 Android 7+ 上运行存在问题,因为 Google 删除了 openssl。您必须自己构建 openssl .so 库。 Qt HowTo add openssl 中有一个文档:http://doc.qt.io/qt-5/opensslsupport.html 不幸的是,这在 Linux 或 MacOS 上失败,错误未知参数:-mandroid 另见QTBUG-59375

    可在此处找到主要用于 Android 和其他操作系统的 OpenSSL libcryptolibsssl 静态和动态库的工作构建脚本: https://github.com/akontsevich/openssl-android-build

    这个 repo 从 ekke/android-openssl-qtcouchbaselabs/couchbase-lite-libcrypto repos 中汲取了最佳可行的想法 - 非常感谢他们的作者!可以在此处找到有关创建这些脚本的更多想法。生成的脚本成功为您完成了所有工作,包括下载和提取 openssl 以及为 x86armeabi-v7aarm64-v8a 架构生成库。

    默认 OpenSSL 版本是 1.0.2o,目前在 Qt Creator 中使用。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 2017-07-15
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多