2014年2月14日 星期五

在「遠端電腦」開發,經 SFTP 下載,再由「本地電腦」ADB 載入至 Android 裝置測試

最近在開發 Android Apps 時,用平常工作用的電腦,覺得稍嫌慢了一些。於是從「本地電腦」以 VNC 連上「遠端電腦」,用另一台較快的電腦寫程式,希望編寫、編譯程式時會快一些(註:最近流行雲端應用)。如果模擬器是也在「遠端電腦」,僅將畫面傳回「本地電腦」時,除畫面及操作會有一些延遲外,其它的反應時間都相當不錯。
  但是,當這些開發的程式需要用 Android 裝置測試,用 VNC 連接「遠端電腦」時,也要同時『重導』USB 的連線,目前試過的幾個方法都有些麻煩。故而採用較簡單的解決辦法,就是將在「遠端電腦」編譯後產生的 Android apk 檔案,用 FTP 或 SFTP 下載回「本地電腦」,再利用 Android 的開發工具 ADB 將之下載至 Android 裝置測試。
  整理一下到目前為止的紀錄:
開 發 端測 試 機 (端)發 文 連 結
Eclipse (PC_1)AVD (在 PC_1)預設之開發環境(使用 AVD 模擬器)
Eclipse (PC_1)Android 裝置 (連接 PC_1)預設之開發環境(使用 Android 裝置)預設之開發環境(使用 Android 裝置)
Linux 中,令 ADB 測得以USB連接的 Android設備
Linux 中,令 ADB 測得以USB連接的 Android設備(F19)
Eclipse (PC_1)AVD (在 PC_2)使用另一台電腦的 Android 模擬器 (AVD) 除錯
Eclipse (PC_1)Android-x86 (為 PC_2)用另一台運行 Android-x86 的電腦除錯
Eclipse (PC_1)Android 裝置 (Galaxy SII)用 WiFi 下載 Android 程式到 GALAXY SII 手機
Eclipse (PC_1)Android 裝置 (連接 PC_2)本文
註一:『PC_1』和『PC_2』分別指兩台不同之電腦,『PC_1』為執行開發 Android App 的 Eclipse 之電腦,而『PC_2』是指另一台電腦。
註二:『PC_1』和『PC_2』編號與執行快慢無關,選擇以方便開發為主要考量。

在「遠端電腦」開發 App,經 FTP 或 SFTP 下載,再由「本地電腦」之 ADB 載入 Android 裝置測試,步驟說明如下:

一、在「本地電腦」安裝 Android SDK 及 ADB

由於並不在「本地電腦」開發 App,所以不需要安裝完整的 Android 開發環境,只要安裝足夠將 apk 檔案載入 Android 裝置的程式即可。
  自 Android Developer 官網下載最新版的 Android SDK,目前是 22.3 版。接著,將之解開在『使用者』的目錄下
[SiB@Celeron-D ~]$ tar zxf android-sdk_r22.3-linux.tgz
[SiB@Celeron-D ~]$ mv android-sdk-linux Android-SDK
第一個命令是解開 Android SDK,預設的目錄名為『android-sdk-linux』,第二個命令是將『android-sdk-linux』目錄改為『Android-SDK』。你也可以改成其它目錄名或保留原名稱。
  以上的 Android SDK 的安裝,並不含 ADB 這個程式。要安裝 ADB,要透過 Android SDK 的工具程式 Android 安裝 ADB。
[SiB@Celeron-D ~]$ Android-SDK/tools/android
Error: Missing platform-tools
上例中的『Error: Missing platform-tools』這個錯誤訊息,就是因為 Android SDK 中的『platform-tools』(內有 ADB)未安裝所致,暫時不用理會,接下來的步驟會安裝它。程式開啟後如下圖:
由上圖中可看出,在預設狀態下總共會安裝 10 個套件,但是其中只有一個是本文需要的。按『Deselect All』選項,清除所有預設選項,再點選『Android SDK Platform-tools』,如下圖所示:
接著按『Install 1 package...』按鈕,出現一個版權的宣告視窗,點選『○ Accept License』及『Install』按鈕,開始安裝程序。
  此時會跳出另一個視窗,顯示『Android SDK Manager』的執行、安裝過程。
當出現『Done loading packages.』,即表示安裝完成。按『Close』鈕,並結束『Android SDK Manager』這個程式。

二、確認「本地電腦」可透過 USB 連接 Android 裝置

這時如果直接執行 ADB 開始測試,會出現好幾個找不到某些套件的錯誤(:想跳過嘗試錯誤的過程,可直接看下面紅色框的安裝命令,一次解決)
[SiB@Celeron-D ~]$ Android-SDK/platform-tools/adb devices
bash: Android-SDK/platform-tools/adb: /lib/ld-linux.so.2: bad ELF interpreter: 沒有此一檔案或目錄
缺少『ld-linux.so.2』這個模組,補安裝『glibc.i686』套件
[root@Celeron-D ~]# yum install glibc.i686
會一併安裝關聯的套件『nss-softokn-freebl.i686』,再執行 ADB 一次
[SiB@Celeron-D ~]$ Android-SDK/platform-tools/adb devices
Android-SDK/platform-tools/adb: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
又缺少『libstdc++.so.6』模組,補安裝『libstdc++.i686』套件
[root@Celeron-D ~]# yum install libstdc++.i686
會一併安裝關聯的套件『libgcc.i686』,再執行 ADB 一次
[SiB@Celeron-D ~]$ Android-SDK/platform-tools/adb devices
List of devices attached
HT02SLG01505 device
這次沒有錯誤訊息,而且列出了偵測到的 Android 裝置。

註一:如果執行 ADB 沒有出現錯誤,但是未偵到 Android 裝置,請參考『Linux 中,令 ADB 測得以 USB 連接的 Android 設備(F19)』。
註二:如何從缺少的模組得知欠缺的套件,可以參考前文『常用的 YUM 命令:安裝、移除、查詢及回復』得知做法。不必如 Fedora 官網『HOWTO Setup Android Development』的說明安裝七、八個套件,只要安裝二個就夠了。
[root@Celeron-D ~]# yum install glibc.i686 libstdc++.i686
這兩個套件分別用以排除缺少『ld-linux.so.2』和『libstdc++.so.6』兩個模組的錯誤。

三、下載 App 編譯後的 apk 檔至「本地電腦」

將編譯後的 apk 檔,下載回「本地電腦」,可以用習慣的圖型化檔案傳輸程式,或是文字命令
[SiB@Celeron-D ~]$ scp -P 5566 SiB@192.168.10.17:WorkSpace/LunarLander2/bin/LunarLander2.apk .
SiB@192.168.10.17's password:
LunarLander2.apk100% 120KB 119.9KB/s 00:00
其中,『5566』是「遠端電腦」的 SSH 埠號,『192.168.10.17』是「遠端電腦」的網址,『WorkSpace/LunarLander2/bin/』是 apk 所在的檔案目錄,而第二列最後的『 . 』是指將下載的檔案存在「本地電腦」目前的工作目錄。接著輸入正確的 SSH 密碼後,就開始下載 apk 檔案。

:第三列輸入密碼如果嫌麻煩,可參考『SSH 的「自動驗證密碼」機制 - DSA』的步驟,讓 SCP 自動認證免輸入密碼。

四、用 ADB 載入「本地電腦」的 Android 裝置

要用 ADB 載入 apg 至 Android 裝置,除了要開啟 Android 裝置的「偵錯模式」外,還要勾選『未知的來源』的選項,以允許安裝非 Market 應用程式。
如上圖所示。接著就可以將剛才下載的 apk 檔案,透過 USB 連線載入至 Android 裝置。
[SiB@Celeron-D ~]$ Android-SDK/platform-tools/adb install LunarLander2.apk
923 KB/s (122748 bytes in 0.129s)
pkg: /data/local/tmp/LunarLander2.apk
Success
下載成功後,就可以在 Android 裝置上測試你開發的程式了。

已測試版本:

  • Fedora: 19, 20
  • Android SDK 22.3

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)