Qt for Android 部署流程分析

摘要:
研究了一个小时,大体搞明白了QtCreator生成APK的流程。首先QtCreator会编译时会生成一个json文件,就在工程目录下,我的是android-libhelloAndroid.so-deployment-settings.json。当你运行时,选择了Android设备,QtCreator才开始执行一系列动作来生成APK,并push到设备上运行。更详细的过程可以参考Qt官方文档DeployingApplicationstoAndroidDevices,那里面说得很详细。这个问题的解决,只要添加一个额外的依赖库就可以了,QtCreator会传递参数给androiddeployqt,后者就会正确打包。

原地址:http://blog.csdn.net/foruok/article/details/17796017

今天为了测试使用 Qt Creator 3.0.0 开发的纯 C 工程,利用了Windows 下 Qt 5.2 for Android 开发入门里创建的 HelloAndroid 工程,想把纯 C 工程生成的 so 库加到 HelloAndroid 工程中。结果加入进去了,但不会自动拷贝到生成目录打包进 APK 。

研究了一个小时,大体搞明白了 Qt Creator 生成 APK 的流程。

首先 Qt Creator 会编译时会生成一个 json 文件,就在工程目录下,我的是 android-libhelloAndroid.so-deployment-settings.json。内容如下:

  1. {
  2. "description":"Thisfileisgeneratedbyqmaketobereadbyandroiddeployqtandshouldnotbemodifiedbyhand.",
  3. "qt":"C:\Qt\Qt5.2.0\5.2.0\android_armv7",
  4. "sdk":"E:/android-sdk-windows",
  5. "ndk":"E:\Android\android-ndk-r8d",
  6. "toolchain-prefix":"arm-linux-androideabi",
  7. "tool-prefix":"arm-linux-androideabi",
  8. "toolchain-version":"4.7",
  9. "ndk-host":"windows",
  10. "target-architecture":"armeabi-v7a",
  11. "android-extra-libs":"libhttpclient_test.so",
  12. "application-binary":"E:/qt/helloAndroid/libhelloAndroid.so"
  13. }
{
   "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
   "qt": "C:\Qt\Qt5.2.0\5.2.0\android_armv7",
   "sdk": "E:/android-sdk-windows",
   "ndk": "E:\Android\android-ndk-r8d",
   "toolchain-prefix": "arm-linux-androideabi",
   "tool-prefix": "arm-linux-androideabi",
   "toolchain-version": "4.7",
   "ndk-host": "windows",
   "target-architecture": "armeabi-v7a",
   "android-extra-libs": "libhttpclient_test.so",
   "application-binary": "E:/qt/helloAndroid/libhelloAndroid.so"
}

上面文件里的 application-binary ,实际上是一个 so 文件,在我这里是 libhelloAndroid.so 。

要说明的是,编译阶段只会生成 so 文件,什么事情不干。当你运行时,选择了 Android 设备,Qt Creator 才开始执行一系列动作来生成 APK ,并 push 到设备上运行。大概步骤是这样的:

  1. 创建构建目录
  2. 拷贝 application-binary
  3. 拷贝 Qt 自己的库和依赖的库,如 libgnustl_shared.so 等。
  4. 根据模板拷贝 java 文件、生成 AndroidManifest.xml 、资源文件等等
  5. 调用 ant 编译、打包、签名、对齐
  6. 连接设备,install APK 并运行

这些动作都是由一个名为androiddeployqt.exe 的程序完成的,感兴趣的可以看它的源码,Qt SDK 里有,同时也可以在 Qt Creator 的输出 panel 中看到 这个部署程序的输出信息。更详细的过程可以参考 Qt 官方文档Deploying Applications to Android Devices,那里面说得很详细。

说说我遇到的问题。我在 pro 文件里使用 LIBS += -lxxx 加入了我的 C 库,编译通过,可是 androiddeployqt 没有拷贝 libxxx.so ,APK 运行时找不到依赖的 libxxx.so 直接挂掉了。这个问题的解决,只要添加一个额外的依赖库就可以了,Qt Creator 会传递参数给 androiddeployqt ,后者就会正确打包。

在 Qt Creator 中,选则Projects>Run>Deploy configurations>Details ,可以看到下面的界面:

Qt for Android 部署流程分析第3张

看图片上画蓝线、篮圈的地方,就是这里,添加你依赖的库即可。

好啦,到这里我们可以在纯粹 C++ 的 IDE 当中进行 Android 的开发了,带界面的、不带界面的,都可以完成。不过貌似 service 还不行,这个我还没有研究。

免责声明:文章转载自《Qt for Android 部署流程分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下安装LoadRunner LoadGeneratorC#多线程和异步(一)——基本概念和使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android体系结构介绍

   1)应用程序层          Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是       用Java语言编写的,并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个    ...

安卓基础(点击事件)

今天学习了安卓开发的点击事件,下面我来叙述一下实现点击时间得基本方法: 第一种:在要被点击得控件中加onclick属性 格式:android:onClick="方法名" 例如andoroid:onClick="oneClick" 接下来在对应这个布局得activity中写一个方法,格式为: public void 方法名(View view ){ 方法得执...

Android开发笔记(十六)——Activity的4种启动模式

AndroidManifest 中比较重要的一个属性是 launchMode 启动模式: Acyivity的 android:launchMode 四个属性: standard:标准模式,默认 singleTop:Task栈顶复用模式(栈是先进后出,当我们启动一个Activity,如果这个目标Activity位于栈顶,不会创建一个新的实例,而是会直接...

为什么完整备份不能截断事务日志

导言 完整备份不能截断事务日志,这是所有SQL Server DBA的一个常识, 为此,当数据库处于完整恢复模式时(非特别说明,下文所提到都是完整恢复模式下的数据库),DBA们必须频繁地使用事务日志备份的方式来防止日志文件变得过大。 这几乎成为了DBA们的一个定理,但,作为一个DBA,你证明过这个定理吗?你知道为什么完整备份不能截断事务日志吗? 一个错误的...

android 判断网络 网络监控

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 1)判断是否有网络连接 复制代码 代码如下: public boolean isNetworkConnected...

第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257             由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo。实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交...