最近學習了Qt的QML編程技術,感覺相較於以前的QtGUI來說更方便一些,使用QML可以將界面與業務邏輯解耦,便於開發。
QML支持跨平台,包括支持Android平台,因此可以使用Qt的QML進行Android開發。本文記錄了Qt for Android環境搭建及測試過程。
本文使用Qt 5.6.1版本。
1. 下載Qt for Android
Qt for Android (5.6.1)安裝包下載地址:http://download.qt.io/archive/qt/5.6/5.6.1/qt-opensource-windows-x86-android-5.6.1.exe
2. 安裝Android依賴環境
參考Qt for Android官方網站:Getting Started with Qt for Android | Qt 5.7,可知需要安裝如下幾項:
- Android SDK (包括Android SDK Tools和Android Debug Bridge(ADB))
- Android NDK
- Apache Ant v1.8 or later
- Java SE Development Kit (JDK) v6 or later
於是,我安裝了如下幾項:
- Android SDK (包括Android SDK Tools 24.3.2和幾個版本的SDK Platform和Google APIs)
- Android NDK (android-ndk-r11c-windows-x86)
- Apache Ant v1.9.7
- JDK 1.7.0_55
3. 安裝Qt for Android
如果之前沒有安裝過Qt 5.6.1的任何平台版本(包括VS2015、VS2013等),則可以直接雙擊運行qt-opensource-windows-x86-android-5.6.1.exe,按提示進行安裝即可。
但如果之前安裝過Qt 5.6.1,比如我之前安裝了Qt 5.6.1 VS2010 x86,安裝目錄下的結構如下:
D:\ProgramFiles\Qt\5.6.1
├─5.6
│ ├─msvc2010_x86
│ └─Src
├─Docs
├─Examples
├─Tools
└─……(其他不重要的目錄或文件)
我又在虛擬機里測試安裝了一下qt-opensource-windows-x86-android-5.6.1.exe,得到的目錄結構如下:
D:\ProgramFiles\Qt\5.6.1
├─5.6
│ ├─android_armv7
│ ├─android_x86
│ ├─mingw49_32
│ └─Src
├─Docs
├─Examples
├─Tools
│ └─mingw492_32
└─……(其他不重要的目錄或文件)
從上面兩個目錄結構的對比中可以看出,Qt 5.6.1在不同編譯平台下的安裝文件的區別就在於5.6目錄下和Tools目錄下的對應內容。
於是,我將虛擬機中的5.6\android_armv7、5.6\android_x86、5.6\mingw49_32、Tools\mingw492_32這幾個文件夾復制到主機中安裝了Qt 5.6.1 VS2010的對應目錄下。現在匯總的目錄結構如下:
D:\ProgramFiles\Qt\5.6.1
├─5.6
│ ├─android_armv7
│ ├─android_x86
│ ├─mingw49_32
│ ├─msvc2010_x86
│ └─Src
├─Docs
├─Examples
├─Tools
│ └─mingw492_32
└─……(其他不重要的目錄或文件)
其中Tools\mingw492_32目錄相當於MinGW編譯器的安裝目錄,需要將Tools\mingw492_32\bin的絕對路徑添加到系統Path環境變量中,否則后面Qt Creator會找不到mingw32-make.exe文件。
OK,到這里就算安裝完成了。
4. 后續配置
安裝完之后,就是在Qt Creator中配置Qt路徑了,比較簡單,就不再贅述了。
我的電腦上配置完之后如下(在Qt Creator中選擇"工具"->"選項"來查看):

5. 測試
打開Qt Creator,新建一個工程,配置如下:

選擇構建套件為Qt 5.6.1(即VS2010平台),點擊構建按鈕,成功構建。
再點擊運行按鈕,成功運行可以看到一個Hello World界面:

然后選擇構建套件為Android for armeabi-v7a (GCC 4.9, Qt 5.6.1)(即Android平台),點擊構建按鈕,成功構建。
此時可能會出現如下錯誤:
Execute failed: java.io.IOException: Cannot run program…${aapt}": error=2, No such file or directory
解決辦法參考:android - ant jar error: Execute failed: …… - Stack Overflow
Have you updated the Android SDK tools to 24.3.2? This seems to have caused the issue. Add following 4 lines to android-sdk-path/tools/ant/build.xml starting line 484 and hopefully it should solve.
<property name="aidl" location="${android.build.tools.dir}/aidl${exe}" />
<property name="aapt" location="${android.build.tools.dir}/aapt${exe}" />
<property name="dx" location="${android.build.tools.dir}/dx${bat}" />
<property name="zipalign" location="${android.build.tools.dir}/zipalign${exe}" />
於是,用文本編輯器打開D:\ProgramFiles\Android\sdk\tools\ant\build.xml,在第484行處添加上面幾行內容,保存。
重新點擊Qt Creator的構建按鈕,又出現了如下錯誤:
02:23:45: 正在啟動 "D:\ProgramFiles\Qt\5.6.1\Tools\mingw492_32\bin\mingw32-make.exe" "INSTALL_ROOT=D:/ProgramData/QtCreatorProjects/AndroidTest/build-AndroidTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_1-Debug/android-build" install
cp -f libAndroidTest.so D:/ProgramData/QtCreatorProjects/AndroidTest/build-AndroidTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_1-Debug/android-build/libs/armeabi-v7a/libAndroidTest.so
makefile:820: recipe for target 'install_target' failed
process_begin: CreateProcess(NULL, cp -f libAndroidTest.so D:/ProgramData/QtCreatorProjects/AndroidTest/build-AndroidTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_1-Debug/android-build/libs/armeabi-v7a/libAndroidTest.so, ...) failed.
make (e=2): 系統找不到指定的文件。
mingw32-make: [install_target] Error 2 (ignored)
注意到上面有一行命令是cp,cp是Linux系統中的復制命令,在Windows系統中對應的是copy,問題就出在這兒。
查看該工程Android平台build目錄(build-AndroidTest-Android_for_armeabi_v7a_GCC_4_9_Qt_5_6_1-Debug)下的Makefile,發現里面有下面這段內容:
COPY = cp -f
COPY_FILE = cp -f
COPY_DIR = cp -f -R
而在VS2010平台build目錄(build-AndroidTest-Qt_5_6_1-Debug)下的Makefile中的對應內容為:
COPY = copy /y
COPY_FILE = copy /y
COPY_DIR = xcopy /s /q /y /i
對比其中的cp和copy兩個命令,可以由此確定是因為構建套件Android for armeabi-v7a (GCC 4.9, Qt 5.6.1)(即Android平台)生成的Makefile是只適用於Linux平台的。
(注:我試過在"工具"->"選項"中修改該構建套件生成的Makefile的類型,但是不管選擇哪種Makefile類型,生成的Makefile中都是cp而不是copy。)
於是考慮在Windows系統中搭建虛擬Linux環境。
MSYS可以解決我的這個問題!
MSYS,即Minimal GNU(POSIX)system on Windows,是一個小型的GNU環境,包括基本的bash,make等等。與Cygwin大致相當。
於是下載MSYS,安裝,然后將其bin路徑添加到系統Path環境變量中。
再次點擊Qt Creator的構建按鈕,OK,成功構建!
最后點擊運行,可以選擇安裝到Android模擬器或是真機,安裝apk后可以看到和Windows平台上界面類似的Android界面:

到此,Qt for Android開發環境搭建以及測試全部完成!
