Android 版 Qt 和 BoringSSL

2024-05-26

我正在开发一个基于 Qt 的 Android 应用程序,它使用 QSslSocket 下载数据。由于 Android 从 OpenSSL 转向 BoringSSL,因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 Android 6+ 上会产生以下警告:



W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve CRYPTO_free
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve EVP_CipherFinal
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve EVP_rc2_cbc
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_noconf
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve OPENSSL_add_all_algorithms_conf
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot resolve EC_get_builtin_curves
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot call unresolved function OPENSSL_add_all_algorithms_conf
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot call unresolved function EC_get_builtin_curves
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot call unresolved function EC_get_builtin_curves
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: could not set SSL_CTRL_SET_TLSEXT_HOSTNAME, Server Name Indication disabled
W libtestopenssl.so: (null):0 ((null)): qt.network.ssl: QSslSocket: cannot call unresolved function CRYPTO_free
  

但是,套接字本身成功连接到远程主机并从那里读取数据,没有任何明显的问题。这让我想知道是否需要自己构建OpenSSL库并将其打包,或者使用平台提供的BoringSSL也可以。

我还注意到,Android 6 版本以下的应用程序倾向于使用系统版本的 OpenSSL,即使我提供了自己的版本。我尝试添加构建的 libssl.so 和 libcrypto.so (从 libssl.so.1.0.0 和 libcrypto.so.1.0.0 重命名)ANDROID_EXTRA_LIBS(不确定是否LIBS+=也需要使用)甚至静态链接 libssl.a 和 libcrypto.a。 QSslSocket::sslLibraryVersionString() 仍然返回平台上可用的版本。

我的问题是:

  1. 我需要自己构建OpenSSL库并将其打包还是使用平台提供的库就可以?
  2. 如果我这样做,如何让Android识别libssl.so和libcrypto.so?

1. 需要自己构建OpenSSL库并打包还是使用平台提供的库也可以?

  • 是的 - 您应该构建 OpenSSL 并将其打包。

https://developer.android.com/about/versions/nougat/android-7.0-changes.html https://developer.android.com/about/versions/nougat/android-7.0-changes.html

从 Android 7.0 开始,系统会阻止应用程序动态链接非 NDK 库,这可能会导致应用程序崩溃。这种行为变化旨在跨平台更新和不同设备创建一致的应用程序体验。

  • 使用已安装的 BoringSSL 目前可能可行,但建议应用程序自带自己的 OpenSSL 库。
  • 否则,您的用户将看到弹出警告消息,并且该应用程序可能无法在更高版本的 Android 上运行。

为了减少此限制可能对当前发布的应用程序产生的影响,在 Android 7.0 上可以暂时访问一组重要用途的库(例如 libandroid_runtime.so、libcutils.so、libcrypto.so 和 libssl.so) (API 级别 24)适用于面向 API 级别 23 或更低级别的应用。如果您的应用程序加载这些库之一,logcat 会生成一条警告,并且目标设备上会出现一个 toast 来通知您。如果您看到这些警告,您应该更新您的应用程序以包含这些库自己的副本或仅使用公共 NDK API。 Android 平台的未来版本可能会完全限制私有库的使用,并导致您的应用程序崩溃。

2. 如果我这样做,如何让Android识别libssl.so和libcrypto.so?

  • 我主要是按照此处概述的步骤成功的:http://doc.qt.io/qt-5/opensslsupport.html http://doc.qt.io/qt-5/opensslsupport.html

  • 但请确保您获得正确的版本:openssl-1.1.0f.tar.gz 似乎与 Qt 5.9 不兼容,并且我的应用程序未加载库。

  • 为桌面进行编译并调用 QSslSocket::sslLibraryVersionString() 以查看您的 Qt 使用哪个 OpenSSL 版本。对我来说,它显示“OpenSSL 1.0.1t 2016 年 5 月 3 日”
  • git 存储库中的标签“OpenSSL_1_0_1t”对我来说适用于 Qt 5.9.1
  • 来自 openssl.org 的 openssl-1.0.2l.tar.gz 也适用于 Qt 5.9.1

我使用 API 级别 19。一旦我使用 API 级别 23 或 25 进行测试,我将更新此答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 版 Qt 和 BoringSSL 的相关文章

  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • Foreach Parallel - 多个输出的组合功能

    我有一组 45000 个用户和 40 多部电影的评分 我需要根据每个用户与其他用户的皮尔逊相关性来预测每个用户的新评分 我还需要存储相似用户的集合以及每个用户 电影组合的相似性 我使用 foreach 包并行执行循环 我设法编写的代码是这样
  • 将对象拖到可排序列表中 - AngularJS

    Problem 我正在尝试从 jQuery 重新创建 Draggable Sortable 功能 但无法将删除的元素放入我的对象数组中 我想拖一个 draggable 按钮进入 sortable 列表 我希望按钮代表一个具有属性的对象 可以
  • 从普通电话拨打时如何将分机自动传递到 Twilio 号码?

    我们有一个付费 Twilio 帐户 例如 对于荷兰 我们有一个唯一的号码 用户可以通过手机拨打该号码 这一切都好 现在 我们希望扩展我们的服务 并向该单一 Twilio 电话号码添加 附加许多分机 对于每个分机 我们希望分配 转发 我们代理
  • NHibernate 按 id 逐出

    大家都知道session中有缓存 这个缓存一般可以通过2种方法来清除 会话 驱逐 会话 清除 第二种方法不仅删除单个条目的所有缓存 我有商业方法 它接收大对象的 id 来自 aspx 站点 或有时接收多个 id 并在数据库中进行原生sql操
  • 在 BASH 脚本中使用字符串作为变量名

    我有以下内容 bin sh n fred bob f n echo f 我需要在替换后执行底线 echo n 有办法做到这一点吗 我刚刚得到 test sh line 8 f bad substitution 在我这边 您可以像这样使用数组
  • 如何将查找结果传递给 CP,以便带空格的文件名起作用 [重复]

    这个问题在这里已经有答案了 我正在尝试将带有特定附件的文件复制到不同的目录 并保留其相对路径 从我调用的原始顶部路径 cp parents find name pdf print new path 我相信这有效 但仅当找到的文件名称中没有空
  • 如何在 Rust winapi 编程中使用 COM VARIANT?

    我正在尝试转换C COM 代码 https technet microsoft com pt br aa382113 v vs 71 for TaskSchedulerRust 并坚持VARIANT的论证ITaskService Conne
  • 如何在没有 Node.JS 的情况下运行 UglifyJS2

    无论如何都要跑UglifyJS2 https github com mishoo UglifyJS2没有node js 假设我想使用 JavaScript 脚本引擎在 JVM 进程中运行它 怎么做 我看到米秀回答你了https github
  • 文件操作耗时较长,收到“正在运行[文件、保存、删除创建参与者”消息

    使用 JavaScript React 和 Node 时 会发生在 VSCode 版本 1 52 1 中 我已经在 VSCode 中从事 React 项目几个月了 在那两个月的某个时刻 我开始注意到 VSCode 处理文件操作的速度显着下降
  • 获取特殊文件夹

    请只回答问题否则请勿回答此问题 让我重新开始吧 如何使用这个扩展了内部Environment GetSpecialFolder 的类 我不想要特殊的根 root Environment GetFolderPath Environment S
  • ViewScope:定位“正确的”复合组件的对象实例

    进一步了解 jsf 2 视图范围的过程 我再次遇到了问题 我的复合组件的绑定对象创建了多个实例 并且设置值似乎没有针对 正确 的对象 我的初始设置与中相同从视图范围的 bean 自动实例化会话范围的 bean https stackover
  • 链表插入排序

    我在编程的排序部分还不是很先进 所以我正在为我的算法寻求一些帮助 void sortList Item PTR tmpNxt current gt nextItem Item PTR tmpPTR current int a tmp whi
  • R 中的“CSS 中的非平稳季节性 AR 部分”错误

    我正在尝试拟合季节性分解系列的 ARIMA 模型 但是当我尝试执行以下操作时 fit arima diff series order c 1 0 0 seasonal list order c 1 0 0 period NA 它给我以下错误
  • 在没有数据库的情况下运行 WordPress

    我一直在寻找一种将 WordPress 配置为仅使用文件系统数据库运行的方法 有点像 Java 中或内存中的 H2 任何人 仅用于演示目的 不可能 Wordpress 的要求之一是 MySQL http wordpress org abou
  • 了解 F# 尾递归

    最近在学习F 我尝试以不同的方式解决问题 像这样 0 1 2 3 4 5 6 7 8 gt 0 1 2 3 4 5 6 7 8 head recursive let rec toTriplet v1 list match list with
  • window.alert() 之后无法编辑输入文本字段

    我有这个 Electron 应用程序 使用 NodeJS Bootstrap AngularJS 其中包含一些可以编辑的文本输入字段 我有一个触发 window alert 的按钮 触发后 文本输入字段将不再可编辑 单击应用程序的其他元素不
  • 我们如何修改检测工具包来检查一个类是否具有具有特定签名的成员函数?

    鉴于 减少 实施检测惯用语 http www open std org jtc1 sc22 wg21 docs papers 2015 n4502 pdf namespace type traits template
  • 我是否必须覆盖子类中的所有数学运算符?

    我想在 Python 3 7 程序中创建一个简单的 Point2d 类 仅实现一些功能 我在一个 SO 答案中看到 我现在找不到 创建 Point 类的一种方法是重写complex所以我写了这个 import math class Poin
  • scala.concurrent.blocking - 它实际上做了什么?

    我花了一段时间学习 Scala 执行上下文 底层线程模型和并发性的主题 你能解释一下通过什么方式吗scala concurrent blocking 调整运行时行为 and 可以提高性能或避免死锁 如中所述scaladoc http www
  • Android 版 Qt 和 BoringSSL

    我正在开发一个基于 Qt 的 Android 应用程序 它使用 QSslSocket 下载数据 由于 Android 从 OpenSSL 转向 BoringSSL 因为依赖 OpenSSL 库的 Marshmallow Qt 程序在 And