英文原文地址:http://www.kdab.com/qt-android-episode-4/。
学习了如何搭建安卓开发环境和怎样使用 Qt on Android 之后,接下来在这篇文章里,我们将了解 Qt on Android 的几种部署系统,以及如何给 APK 签名以便能够在安卓市场上发布。
选择部署系统
Qt Creator 支持三种部署系统(如图所示):
- Use Ministro service to install Qt
- Bundle Qt libs in APK
- Deploy local Qt libs to temporary directory
Use Ministro service to install Qt
早在 2009 年我开始这个项目时,世面上只有少数几种安卓设备。它们中的多数只有非常有限的空间(小于 100MB ),使用静态的 Qt 库或者把 Qt 库打包到 APK 中不太可能,那时候 Google 市场对 APK 大小的限制也比现在多( 50MB )。如你所知,我*引入 Ministro 。
即便在今天,一些中低端的设备一样没有太多空间。
Ministro 怎样工作
- 不用把所有东西都打包进你的 APK ,你的安装包只需要包含你的应用库(so)文件、它需要的资源以及它需要的外部库列表
- 你的应用启动时,它会尝试连接 Ministro 服务,如果失败它会认为 Ministro 没有安装,进而打开 Android Play 让用户安装 Ministro 。成功连接 Ministro 之后,你的应用会把依赖库列表发给 Ministro
- Ministro 检查这些依赖库是否存在,如果不存在,它会下载缺失的库并保存到一个特定的安全位置,然后它会发送给你的应用另外一份列表,包括你的应用在启动 Qt 应用之前必须要加载的所有的依赖项
- 应用从 Ministro 给出的位置加载依赖库,然后你的应用继续运行
现在让我们来看看使用 Ministro 的优点和缺点。
优点:
- 使用 Ministro ,用户只需要下载一次 Qt 库。如果用户下载了另一个使用 Qt 的应用,该应用会使用已经存在的 Qt 库。当然如果该应用需要更多的库,Ministro 只会下载缺少的那部分。
- Ministro 可以检测设备的 CPU 特性( armv5 with VFP 或者 armv7 with NEO ),下载针对该CPU特性集优化过的版本。即便你的应用没有针对这些 CPU 特性进行构建,仅仅使用优化过的 Qt 库也会让你的应用跑得更快。现在这些库还不可用,不过我打算在 Qt 5.4 发布它们。
- Ministro 可以更新 Qt 库,不需要你发布一个新的应用。
- 你可以用一个 APK 匹配所有的安卓平台。因为多数时候你的应用库文件不会太大,可以打包到一个单独的 APK 中。如果你的应用没有进行密集计算,你可以使用针对 armv5 的库文件来适配 armv5 和 armv7 两个(架构)平台,因为即便你的应用只包含针对 armv5 的库,Ministro 会下载与目标设备 CPU 架构匹配的库。
- 你可以定制 Ministro 源码以便使用你自己定制的 Qt 库。简言之,你需要一个拥有有效证书的 HTTP/HTTPS 服务器来创建和上传 Ministro 仓库。关于这个主题有很多需要说明的,我打算创建一个 WIKI 页面来说明所有与这个主题相关的信息。
缺点:
- 有些人不喜欢 Ministro ,因为用户必须要安装一次 Ministro 服务。其实有很多其他应用也依赖额外的服务,如果我的母亲能够在一个较老的安卓版本上安装和使用 Google 视频群聊服务(该服务需要手动安装 Google Play 服务),或者 MX 播放器(该应用需要手动安装 MX 播放器需要的编解码服务),我敢肯定她能接受使用 Qt 的应用需要手动安装一次 Ministro 服务这件事。
- Ministro 会更新 Qt 库,而且可能带来不良影响。我非常关心这一点,为了解决这个问题,Ministro 针对 Qt 的每一个主要发行版本使用不同的存储路径(如https://download.qt-project.org/ministro/android/qt5/qt-5.1 , https://download.qt-project.org/ministro/android/qt5/qt-5.2 , https://download.qt-project.org/ministro/android/qt5/qt-5.3);更进一步,每一个来源都使用 Debian-like 的释放方案,有三个不同的存储库(不稳定、测试、稳定)。
使用这种方案,在四年内,发布了 13 个 Necessitas 版本 和 5 个 Qt 项目版本,Ministro 的用户没有任何衰减。
正如你所看到的, Ministro 在这点上非常安全。
Bundle Qt libs in APK
这个特性是最近才加进 Qt Creator 中的。除了你的应用库文件和资源, Qt Creator 添加你应用所需的所有 Qt 库。
优点:
- APK 包含它运行所需要的一切
缺点:
- APK 非常巨大,因为 Qt 库很大(完整版本超过 40MB )
- 所有的 Qt 库都必须解压!因此你的应用将需要更多的空间来运行(超过 50MB )。现在 Google Play 中只有少数几个应用需要那么多的空间。
- 因为体积太大,你不能在一个 APK 中匹配多个目标平台,你必须给每个平台(armv5、armv7、x86)创建一个 APK 。这会让 armv7 的用户感到困惑,因为(据我所知) Google Play 会把你的应用列出来两次,一次针对 armv5 一次针对 armv7 (看看 MX Player Codecs )。如果我的母亲可以安装一个简单的应用程序,我敢肯定她不知道她的手机使用什么样的 CPU ,实际上我非常肯定她根本不知道 CPU 是个什么玩意儿也不知道她的手机上有这么个玩意儿。
- 不能在 armv5 设备上使用 VFP,不能在 armv7 设备上使用 NEON
- 同一个设备上的多个 Qt 应用不能共享 Qt 库
- Qt 库不能自动更新
正如你所看到的,没有完美的解决方案。 Ministro 方案的优点刚好是 Bundle Qt libs in APK 方案的缺点,而缺点又刚好的是优点。
Deploy local Qt libs to temporary directory
这个部署系统的主要被 Qt 骇客在研究 Qt 库本身时使用,因为它是在设备上部署和测试修改过的 Qt 库的最快方式。不要在产品中使用它!
最终还得由你自己来做决定,而我只是把每种部署系统的优缺点告诉你。
包的签名
这是在发布之前的最后也是最重要的一个步骤。为了给包签名你需要一个密钥文件( keystore )和一个自签名证书。
如果你没有证书, Qt Creator 可以很方便的帮你创建,你只需要点击创建按钮,然后填写密钥和签名选项,参考下图:
你只能使用与发布时相同的签名来更新的你的应用,因此一定要确保备份你的密钥文件( keystore )。
如果你已经有了一个密钥文件,只需要浏览、选中它即可。
下一步是将你的项目切换到发布版本,然后选中 sign package(签名包) 和 open package location after build(构建后打开包所在位置),参考下图:
点击运行按钮后,过上一会儿, Qt Creator 就会打开你的应用构建和签名时所在的文件夹,确认选择签过名的那个 APK (QtApp-release.apk)。参考下图:
本章内容到此结束,下次我们来看怎么使用 JNI 来扩展我们的应用。
回顾:
- Qt on Android Episode 1(翻译)
- Qt on Android Episode 2(翻译)
-
Qt on Android Episode 3(翻译)
- Windows下Qt 5.2 for Android开发入门
-
Qt for Android 部署流程分析