一、编译时生成json文件。
这个文件存在于编译路径下面,类似于“android-libuntitled1.so-deployment-settings.json”,其中libuntitled1.so是项目编译生成的so文件。
{
"description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
"qt": "E:/QT/Qt5.9.0/5.9/android_armv7",
"sdk": "E:/Android/Android/android-sdk",
"sdkBuildToolsRevision": "build-tools-23.0.1",
"ndk": "E:\\Android\\Android\\android-ndk-r10e",
"toolchain-prefix": "arm-linux-androideabi",
"tool-prefix": "arm-linux-androideabi",
"toolchain-version": "4.9",
"ndk-host": "windows-x86_64",
"target-architecture": "armeabi-v7a",
"qml-root-path": "E:/QT/Qt_test/untitled1",
"application-binary": "E:/QT/Qt_test/build-untitled1-Android_for_armeabi_v7a_GCC_4_9_Qt_5_9_0_for_Android_armv7- Debug/libuntitled1.so"
}
主要涉及到qt版本、使用的skd、ndk的路径和相关版本说明,最后是application-binary指向项目的so文件。
二、生成APK
单纯的编译只会生成so和json,不做其他事情。
运行选择对应的Android设备后,才会执行一系列动作生成APK,push到设备。
下面动作都由androiddeployqt.exe 程序完成,可以在 Qt Creator 的输出 panel 中看到 这个部署程序的输出信息。
- 创建构建目录
- 拷贝 application-binary
- 拷贝 Qt 自己的库和依赖的库,如 libgnustl_shared.so 等。
- 根据模板拷贝 java 文件、生成 AndroidManifest.xml 、资源文件等等
- 调用 ant 编译、打包、签名、对齐
- 连接设备,install APK 并运行
如果在项目中需要加载其他的第三方库,在.pro中加入 LIBS += -lxxx进行调用之后,Android的构建中,还需要去增加依赖库选项。
我使用的5.9.0版本的QT,在项目-》构建-》Build Android APK-》Additional Libraries中进行添加。添加后在构建运行时会正确打包。
Android运行之后,E:\QT\Qt_test\build-untitled1-Android_for_armeabi_v7a_GCC_4_9_Qt_5_9_0_for_Android_armv7-Debug\android-build\bin会生成QtApp-debug.apk文件,这个apk文件即可用于发布。
三、启动流程
1、执行程序的入口在构建目录下android-build\src\org\qtproject\qt5\android\bindings\QtActivity.java中,会检查应用需要的库文件、扩展包、插件等是否存在,如果不存在可以通过ministro服务进行下载(需要选择"Use Ministro service to install Qt",下载前会检查ministro的状态);另外ministro这个本身也是通过配置来调用,如果选择"Bundle Qt libraries in APK"这个配置,则打包时会将所需要的库文件全部打包。
2、QtActivity.java中会调用QApplication.java的接口来启动app的线程;
3、这个线程会将lib**.so中main函数入口以库函数接口的形式再次执行,这样就相当于qt可执行程序的执行
启动流程这个还是觉得不爱透彻,希望有了解的朋友跟我说说。谢谢O(∩_∩)O
参考:https://blog.csdn.net/foruok/article/details/17796017