Qt for Android 部署流程分析

    今天為了測試使用 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 。內容如下:

{
"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
,可以看到下面的介面:

    看圖片上畫藍線、籃圈的地方,就是這裡,新增你依賴的庫即可。

    好啦,到這裡我們可以在純粹 C 的 IDE 當中進行 Android 的開發了,帶介面的、不帶介面的,都可以完成。不過貌似 service 還不行,這個我還沒有研究。