起因
最近有一个之前搞的Qt项目想改成使用CMake构建,这样可以方便导入其他开源库,但是该应用有编译为安卓版本的需求,我发现Qt自带的CMake文件中这行
set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/android/")
根本无法使app拥有图标,所以我网上找了找直接添加图标的方法,在github上找到了这个项目https://github.com/LaurentGomila/qt-android-cmake,在主CMake文件中引用可以直接为应用添加属性,但是还差一个图标,所以我自己改了一下。
介绍
这个仓库https://github.com/tedcriss/qt-android-cmake是我fork上述项目自己修改的cmake代码,可以在上述项目的功能基础上实现添加应用图标、运行名、应用屏幕方向等功能。
使用方法
首先将仓库克隆下来,然后解压,将qt-android-cmake
整个文件夹复制到你的项目中。
然后在主CMakeLists.txt
中判断安卓平台的部分添加编译安卓库的命令:
add_library(PROJECT_NAME SHARED ${PROJECT_BASE_SOURCES_C_CXX} ${PROJECT_BASE_HEADS} ${PROJECT_QRESOURCES})
引用项目:
include(qt-android-cmake/AddQtAndroidApk.cmake)
接着使用以下代码调整各项属性:
add_qt_android_apk(PROJECT_NAME PROJECT_NAME_APK
NAME "程序名,就是显示在桌面上该程序的名字"
NAME_ACTIVE "运行名,显示在该应用程序属性中,也会在安装时显示该名称"
VERSION_CODE "版本号"
PACKAGE_NAME "包名,如org.mycompany.myapp"
KEYSTORE "这个参数有两个输入,第一个是签名key的地址" "第二个为该key的名称,在创建时设置的那个"
KEYSTORE_PASSWORD "对应上述签名key的密码"
APK_ICON_DIR "程序图标的存放目录"
SCREEN_ORIENT "程序默认屏幕方向"
)
注意事项
- 程序版本号(如1.1.1.1)会自动添加${PROJECT_VERSION}的内容,不需要重新传入;
- 上述实例中未列出的项目请不要轻易尝试,会出现其他的bug;
- 两个
PROJECT_NAME
要相同,PROJECT_NAME_APK
可以自定义,后面会用到,要记住; - 版本号为安卓应用必须设置的属性,如果不设置,程序内部自动设置为1;
KEYSTORE
需要直接指向该key文件;- 程序图标目录可使用Qt Creator创建,在左侧项目栏中,选中安卓build选项卡,在右侧 构建设置 - Build的步骤 - Build Android APK 中,点击Application中Android Customization对应的Create Templates选项,然后在弹出的AndroidManifest.xml窗口中的下侧根据提示添加应用图标,最后找到该AndroidManifest.xml文件同目录下的res目录,
APK_ICON_DIR
后面的参数直接写该目录即可,若不写则自动不添加图标; SCREEN_ORIENT
参数可以控制应用程序默认的屏幕朝向,有以下标签可选。
unspecified,默认值,由系统决定,不同手机可能不一致
landscape,强制横屏显示
portrait,强制竖屏显
behind,与前一个activity方向相同
sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化
sensorLandscape,横屏旋转,一般横屏游戏会这样设置
sensorPortrait,竖屏旋转
nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制
user,用户当前设置的方向
一些帮助
在设置完成上述参数后,点击编译即可直接编译,安卓的32位和64位版本可以直接在 构建设置 - CMake 中调整。
我发现在Qt Creator中使用上述代码虽然可以成功创建带属性的apk,但是使用默认设置在编译时会卡住,经测试可采用以下方法解决。
在左侧项目栏中,选中安卓build选项卡,在右侧 构建设置 - Build的步骤 - Build 中,将Targets中的上述代码中对应PROJECT_NAME
和PROJECT_NAME_APK
两个Target的名称前打勾,然后将最上面默认勾选的all的勾去掉,这样编译完成后程序可以自动运行,但是缺点是会编译两个版本的apk,一个是Qt自动生成的不带版本号的apk,另一个在${CMAKE_CURRENT_BINARY_DIR}/PROJECT_NAME-arm64-v8a/build/outputs/apk
下,其中的arm64-v8a
可能根据你选择构架名称变化,这下面的apk是带你设置的属性的,内部程序除了你设置的属性外和上述Qt自动编译的apk完全一致,可以将这个用于部署,上述无属性apk用于调试测试。
这样一来我全部的需求都解决了,研究这个东西搞了两三天,希望大家多多点赞支持。