2014年8月1日 星期五

qt 5.3 for android - 編譯流程 (指令篇)

env:
linux debian unstable 32bit

  1. adt-bundle-linux-x86-20140702.zip
  2. android-ndk32-r10-linux-x86.tar.bz2
  3. qt-creator-opensource-src-3.1.2.tar.gz
  4. qt-opensource-linux-x86-android-5.3.1.run
  5. qt-everywhere-opensource-src-5.3.1.tar.gz
總共需要 1, 2, 3 (本篇不需要這個), 4, 第五項是 qt 5.3.1 source code, 如果想要自己編譯 qt for android, 才會需要這個, 不過 qt 預先編譯好的應該就夠用了。

第三項是因為 qt-opensource-linux-x86-android-5.3.1.run 內附的 qt-creator 我每次都無法正常開啟, 所以我需要從 source code 編譯。

設定 qtcreator
tool/options/Build & Run/Qt Versions add /home/descent/Qt5.3.1/5.3/android_armv7/bin/qmake。
tool/options/android 設定 sdk, ndk

不過還好, qtcreator 已經用不到了,以下是全指令的編譯方式, 我已經受夠了按按紐只得到錯誤訊息, 根本編不出任何東西來。

以 /media/winxp/android-dev/qt-everywhere-opensource-src-5.3.1/qtbase/examples/widgets/itemviews/dirview/ 範例來介紹編譯流程:

export ANDROID_NDK_ROOT=/home/descent/and-dev/android-ndk-r10/
/home/descent/Qt5.3.1/5.3/android_armv7/bin/qmake dirview.pro 

descent@debianlinux:dirview$ ls
android-libdirview.so-deployment-settings.json  dirview.pro  main.cpp  Makefile
descent@debianlinux:dirview$ 

make # 編譯出 libdirview.so, 一般的 qt 程式到這裡就結束了, android app 還有其他步驟要做。
make install INSTALL_ROOT=./android-build # 初使化 android build 目錄

/home/descent/and-dev/adt-bundle-linux-x86-20140702/sdk/tools/android
選擇 Tools/Manage AVDs, 先把模擬器執行起來。

/home/descent/Qt5.3.1/5.3/android_armv7/bin/androiddeployqt --input android-libdirview.so-deployment-settings.json  --output ./android-build --deployment bundled --install --ant /usr/bin/ant --android-platform android-20 --jdk /usr/lib/jvm/java-7-openjdk-i386 --device emulator-5554 # 先建立 build.xml 讓 ant 使用, 再去 call ant 建立 apk, 並把 apk 傳到模擬器中

descent@debianlinux:platform-tools$ ./adb devices
List of devices attached 
emulator-5554 device 

到這裡應該可以在模擬器執行這個 app 了。

也可以從 /home/descent/and-dev/dirview/android-build 下 ant 指令
ant clean release
編譯出 *.apk

/home/descent/and-dev/dirview/android-build/android-build/bin/*.apk

我有遇到以下紅色部份的錯誤訊息, 我不知道如何設定正確的路徑, 只好建立一個 symbolic link 到該路徑, 就沒有問題了, 也不用在啟動那個很大很慢的 qt creator 了。
Android build platform: android-20
Install to device: emulator-5554
Cannot find Android tool: /opt/android/sdk/tools/android

--android-platform android-17 android 4.2.2
--android-platform android-20 android 4.4w

我另外安裝了 api-17 for android 4.2.2。

你也許會好奇我怎麼知道這些指令的, 噢! 那個折磨我的 qt creator 裡頭有 log 可以看, 從裡頭挖出這些指令。

androiddeployqt 指令: http://qt-project.org/doc/qt-5/deployment-android.html

在手機上 (歌林 7 吋雙核雙卡手機平板) 的執行畫面 (3 apps):



檔案大小和所安裝需要的權限:


這是以 NDK 方式執行的, 應該有效率的優勢, 但是最近火紅的 zenfone 可能無法執行, 得要重編譯一個 x86 版本才行。

從 5.1, 5.2 到 5.3 總算讓我搞定開發環境了。

debian 64bit

env:
debian 64bit

for run /home/descent/android-dev/adt-bundle-linux-x86_64-20140624/sdk/platform-tools/adb
adb 還沒有 64bit 版本, 需要安裝相對應的 i386 套件。

sudo dpkg --add-architecture i386
apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386

for android emulator
sudo apt-get install libsdl1.2debian:i386

ref: http://stackoverflow.com/questions/2710499/android-sdk-on-a-64-bit-linux-machine

若用舊版 qtcreator 可能遇到這問題 (我覺得直接用最新版的 source code 編譯解決這問題比較好):
Qt5 for Android: incompatible ABI
http://stackoverflow.com/questions/22238649/qt5-for-android-incompatible-abi
QtCreator -> Projects -> BuildEnvironment add the variable
ANDROID_TARGET_ARCH = default/armeabi-v7a

/home/descent/Qt5.3.1/5.3/android_armv7/bin/androiddeployqt --input android-liba1.so-deployment-settings.json  --output ./android-build --deployment bundled --install --ant /usr/bin/ant --android-platform android-17 --jdk /usr/lib/jvm/java-7-openjdk-amd64/ --device emulator-5554 --verbose

我很想測試一下 iOS 版本, 我也有 mac, 不過版本太舊, 無法執行 iOS toolchain, 所以等待未來購入新 mac 機器再來測試。

同樣的 source code, 可以產生 linux/X, windows, mac, android 這些平台的應用程式, 實在令人興奮, 這樣的投資很划算阿!

android 2.3.3 api 10

根據這份文件 Qt5.3 For Andoid 安装过程, 需要安裝Android armv5。



會多出一個 Qt5.3.1/5.3/android_armv5/, 不過我使用這目錄的 qmake, androiddeployqt, 還是無法成功編譯出 android 2.3.3 的 app。

~/Qt5.3.1/5.3/android_armv5/bin/qmake dirview.pro

/home/descent/Qt5.3.1/5.3/android_armv5/bin/androiddeployqt --input android-libdirview.so-deployment-settings.json   --output ./android-build --deployment bundled --install --ant /usr/bin/ant --android-platform android-10 --jdk /usr/lib/jvm/java-7-openjdk-i386 --verbose

--verbose 在有錯誤時可以印出多點訊息。

不管他了。

我似乎搞錯了,  查看 android-build/AndroidManifest.xml
41 <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
即可確認這個 android app 可以在哪個版本執行, 我在模擬器和真實機器 (twm amazing a1 android 2.3.3) 測試過, 可以正常執行。所以不需要特別下
--android-platform android-10 用 --android-platform android-20 就可以了。

ref:

2 則留言:

  1. Qtcreator 如果用apt來安裝的話,個人感覺是蠻容易也開得起來.但是也有問題.像是要用Hangee的
    https://github.com/HanGee/OwaNEXT 不論我怎麼改QML Qtquick等 上面相關的head file 就是聯結不到==,明明檔案就存在.
    也有可能是我太嫩 用法還是不對 Try過三次 目前呈現發呆中Orz

    回覆刪除
  2. 我也有遇過在 debian apt-get qtcreator 也是無法使用的狀況, 從 source code 編譯起來的版本似乎是最保險的。

    回覆刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。