Win10 + Qt Creator + Android:如何build一个项目
本文创建于2019年5月。
Qt在更新,Android 开发的各种kits在更新,一切都在更新,于是不可避免地,很多资料都过时了。比如SDK不再提供GUI服务,只提供命令行模式;又比如NDK R19C版本似乎不支持C/C++ Clang……博主尝试用Qt Creator在安卓虚拟机上编译运行项目,遇到了很多问题,因而在此依此记录,如果有人碰到类似的问题,可以参考。
相关环境
NDK:
没有用最新版本,最新版本反馈bug较多。下载于官网归档页(https://developer.android.com/ndk/downloads/older_releases.html)
Android NDK,修订版 17c(2018 年 6 月)
平台 | 软件包 | 大小(字节) | SHA1 校验和 |
---|---|---|---|
Windows 32 位 | android-ndk-r17c-windows-x86.zip | 608358310 | 5bb25bf13fa494ee6c3433474c7aa90009f9f6a9 |
Windows 64 位 | android-ndk-r17c-windows-x86_64.zip | 650626501 | 3e3b8d1650f9d297d130be2b342db956003f5992 |
SDK:
最新版本,下载于官网(https://developer.android.com/studio)
Platform | SDK tools package | Size | SHA-256 checksum |
---|---|---|---|
Windows | sdk-tools-windows-4333796.zip | 148 MB | 7e81d69c303e47a4f0e748a6352d85cd0c8fd90a5a95ae4e076b5e5f960d3c7a |
JDK:
选择了JDK8 8u211。推荐JDK8的版本,官方文档显示:“Note: Android SDK Tools have issues with JDK versions later than 8.”
博主一开始就因为下载了JDK12而遇到状况。
Qt:
Qt 5.12.1
Qt Creator 4.8.1
在安装时,需要选择Qt 5.10下面的一些分支,比如Qt Android,这样才支持安卓开发的功能。如果忘记安装组件,可以在maintenance tool里选择安装。
有用的提示
虽然官方不提供SDK,AVD的GUI工具了,但是Qt creator有提供。在Options>Devices>Android的下方,可以看到AVD MANAGER和SDK MANAGER。在上方设置好JDK NDK SDK的路径之后,下面的两个工具就可以开始使用了。可以在SDK Manager里方便地安装package。
SDK需要安装的有:(参照https://doc.qt.io/qtcreator/creator-developing-android.html)
- Platform tools
- Build tools
- At least one SDK platform
这里根据需要选择合适的平台。安装前可了解一下各个版本的区别,以及system image的选用。
因为我的Kit里采用的CPU architecture是armeabi-v7a, 我安装了Android 24即7.0版本的SDK Platform。
如果想用命令行完成package的安装,可以参照这篇文章:https://medium.com/@dalenguyen/working-with-android-emulator-through-command-line-b3a96965566f
如果要建立自己的安卓虚拟机,还需要下载对应版本的system image,才能新建。Android Emulator这个package也需要,否则无法运行虚拟机。也可以使用真实的安卓设备进行调试,需要安装USB debugging的package,参见http://www.qter.org/forum.php?mod=viewthread&tid=20679。
我在建立安卓虚拟机时遇到很多issue,有关于版本的,各式各样的……而且,运行非常非常非常慢。所以推荐用真机调试。
遇到的问题
1. “Cannot run target compiler 'C:\AndroidDev\android-ndk\android-ndk-r19c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++'. Maybe you forgot to setup the environment?”
查阅路径,发现不存在g++这个文件。有搜到讨论说最新版本NDK不支持GCC编译器。
https://forum.qt.io/topic/94858/qt-android-problem/6
删除了R19C版本,下载了R17C版本。
不过在Qt Creator的Options> Device> Android重新设置路径之后, Options>Kit界面显示了两个Android kit,因为重名而显示警告,删除了19c的NDK文件依旧如此……我重启试试。为什么已经删除的文件还能被Qt 检测为一个Kit……没办法,我只好改了设备名称来避免warning。
compiler和debugger都是有默认选项的:
目前我的Device状态是这样:
遇到了新的问题。
2.
:-1: warning: "C:\AndroidDev\android-ndk\android-ndk-r17c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc" is used by qmake, but "C:\AndroidDev\android-ndk\android-ndk-r17c\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe" is configured in the kit.
Please update your kit (Android for armeabi-v7a (Clang Qt 5.10.0 for Android armv7)) or choose a mkspec for qmake that matches your target environment better.
:-1: warning: "C:\AndroidDev\android-ndk\android-ndk-r17c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-g++" is used by qmake, but "C:\AndroidDev\android-ndk\android-ndk-r17c\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe" is configured in the kit.
Please update your kit (Android for armeabi-v7a (Clang Qt 5.10.0 for Android armv7)) or choose a mkspec for qmake that matches your target environment better.
不过仅仅是警告,也不会影响build。这时,build成功了,不过run有了新的问题:
Emulator Tool is Missing...
OK之后意外地还在run。run的结果如下:
Warning: Android platform 'android-28' does not exist in SDK.
Error while building/deploying project qmlTest (kit: Android for armeabi-v7a (Clang Qt 5.10.0 for Android armv7))
When executing step "Deploy to Android device"
之前安装的package比较混乱,安装了android-24的system image,新建了对应的AVD。不过package里还同时装了android-28。再回到qt creator>options>devices>android>sdkmanager,查看自己的安装情况,进行一些更改。
我自己的安卓手机是android-26 即8.0版本……于是卸载9.0的SDK Platform和system image,安装8.0对应的。
原本对system image也不太了解,这里有说:http://www.voidcn.com/article/p-dlfggbbi-btw.html
于是选择下载Intel 开头的,64位的。system-images;android-26;default;x86_64
关于CPU Architecture,也就是ABI相关……这帖子里写得挺清楚:https://xamarinhelp.com/choosing-cpu-architecture-sdk-version/
最后让我决定好版本问题的,还是KIT里的armeabi-v7a,我下载的system image得和它保持一致,否则选择虚拟机时显示不兼容,所以选择了Android 7.0里的。build成功,然后run,等了有五分钟,模拟器才终于开机,又等了几分钟,程序自动显示出来了,一切正常。
如果真机调试,很快程序就跑起来了。所以还是推荐真机调试。
听说选择x86的CPU architecture模拟器会快很多,没尝试过,不清楚方法。