2017年6月18日 星期日

在「遠端電腦」開發,以連接在「本地電腦」之 Android 裝置測試(多人版)

依前文〝在「遠端電腦」開發,以連接「本地電腦」之 Android 裝置測試(修訂)〞的步驟安裝、設定後,也用了一陣子,似乎沒什麼問題。但是當第二個「Android 開發者」也連上「遠端電腦」時,啟動 Android Studio 後,Android APP 下載測試時,到底下載到哪裏呢?

一、ADB 預設連結埠號被佔用之問題

在前文〝在「遠端電腦」開發,以連接「本地電腦」之 Android 裝置測試(修訂)〞有提到『在建立「遠端電腦」的逆向連接通道』時,有提及:關閉「遠端電腦」中佔用 5037/TCP 埠的 ADB,以解決建立逆向連接通道失敗的問題。
  而 Android Studio 預設連結 ADB (Android Debug Bridge) 的埠號為 5037/TCP,當「遠端電腦」開啟 Android Studio 時,會以這個埠號去連結 ADB。若這個埠號沒有 ADB,即會開啟一個 ADB 供自己連結使用。
  但是,若『遠端電腦』有多人同時開啟 Android Studio,當第二個開發者開啟 Android Studio 時,發現在預設埠號已被佔用,就會認定有 ADB 而嘗試連結,那麼 Android APP 要下載至那一台 Android 裝置執行?
  答案是第一個佔用 5037/TCP 的 ADB,看是那個「開發者」先執行就下載到他/她設定的 Android 裝置了。這時,那位開發者就會滿頭霧水,不知這個 APP 是怎麼回事。
  萬一,APP 的名稱相同,第二位開發者的畫面會出現
這個訊息,顯示已有同名但不是同一個 APP 已被安裝在該 Android 裝置。
  要解決這個問題,就須每個開發者使用自己專用的 ADB,自己的 APP 才不會下載到別人的 Android 裝置。

二、解決 ADB 連結埠號被佔用之問題

要解決 ADB 預設埠號被佔用的問題,最簡單的方法是停掉佔用 5037/TCP 的程式。但是
  • 在多人環境下,由別的使用者所執行的程式,其他使用者是不能關閉,除了管理者。
  • 就算是自己的程式所佔用,若是必要的程式,也是不能關閉它。
因此,最好的方法是改變 Android Studio 和 ADB 連結時所用的預設埠號。改變 ADB 的埠號,方式有好幾個。

在 ADB 啟動時,由參數設定改變 ADB 的埠號

在開啟 ADB 時,藉由參數設定改變 ADB 的埠號,如:
[SiB@Celeron-D ~]$ ~/Android/Sdk/platform-tools/adb -L tcp:5837 start-server
* daemon not running. starting it now at tcp:5837 *
* daemon started successfully *
上例中,『-L tcp:5837』參數就是將 ADB 所使用的埠號改成 5837/TCP,而不是預設的 5037/TCP。

設定「環境變數」以改變 ADB 的埠號

設定「環境變數」,則 ADB 與 Android Studio 都會因這個設定而改變使用於連結的埠號。如:
[SiB@Celeron-D ~]$ ANDROID_ADB_SERVER_PORT=5837 ~/Android/Sdk/platform-tools/adb start-server
* daemon not running. starting it now at tcp:5837 *
* daemon started successfully *
上例中,設定的「環境變數」將 ADB 所使用的埠號改成 5837/TCP,而不是預設的 5037/TCP。Android Studio 也適用這個方法,不過在「遠端」開發、「本地」測試的情形下, ADB 與 Android Studio 是分別在不同電腦執行的。

二、在「遠端電腦」啟動 Android Studio

若從「本地電腦」建立由「遠端電腦」連回的逆向連結通道,文。
[SiB@Celeron ~]$ ssh 192.168.10.17 -p 5566 -R 5837:127.0.0.1:5037
SiB@192.168.10.17's password:
Last login: Fri Feb 14 16:47:21 2014 from 192.168.10.13
上例中,『-R 5837:127.0.0.1:5037』這個參數就是『建立逆向連接通道』,
  • 在「遠端電腦」的 ADB 連結埠號就不是 5037/TCP ,而是 5837/TCP。(在多人開發的環境,千萬別用預設埠號
  • 而「本地電腦」的 ADB 連結埠號仍是 5037/TCP,反正是只有自己在用。
  • 埠號在進入、出來通道時,會自動轉換。
因此,在「遠端電腦」執行的 Android Studio 也一定要改變與 ADB 連結用的埠號。

設定「環境變數」以改變 Android Studio 的埠號

開始開發 Android APP,一樣是執行 Android Studio 的 studio.sh。為了改變 Android Studio 連結 ADB 所使用的埠號,在執行前要設定「環境變數」
[SiB@Core-i7 ~]$ ANDROID_ADB_SERVER_PORT=5837 /opt/android-studio/bin/studio.sh
上例中,連結 ADB 的埠號是 5837/TCP。只是,這個方法執行起來有些麻煩,下個設定方法比較簡單。

修改「程式捷徑」設定,使 Android Studio 執行前,自動加上「環境變數」

前文〝在 Fedora 中安裝 Android Studio 供『所有用戶』使用〞在『程式選單』之【應用程式】→【軟體開發】下增加的【Android Studio】這個「程式捷徑」是供所有使用者所用,沒有修改連結 ADB 的預設埠號。因此,要改變 Android Studio 連結 ADB 的埠號,就不能再點選它了。
  所幸,「MATE 桌面」的『程式選單』還有一個功能,就是加上使用者自定的「程式捷徑」(註:「MATE 桌面」是源自「GNOME2 桌面」)。
[SiB@Core-i7 ~]$ cd .local/share/applications/
[SiB@Core-i7 applications]$ cp /usr/share/applications/Android-Studio.desktop Android-Studio-Remote.desktop
[SiB@Core-i7 applications]$ pluma Android-Studio-Remote.desktop
上述命令是
  • 更改「工作目錄」到使用者家目錄下的 .local/share/applications/,
  • 將「管理者」設定的 Android Studio 複製一個複本到「使用者」的「程式捷徑」目錄,
  • 再用 Pluma 文字編輯器編輯它。
將「程式捷徑」的設定檔內容改為
[Desktop Entry]
Name=Android Studio (Remote)
Comment=The Official Integrated Development Environment for Android
Exec=env ANDROID_ADB_SERVER_PORT=5837 /opt/android-studio/bin/studio.sh
Icon=/opt/android-studio/bin/studio.png
Terminal=false
Type=Application
Categories=Development;IDE
上例中,以紅色標記的文字是新增加的設定,分別用來顯示不同名稱更改連結 ADB 的埠號。更詳細的設定說明,請參考前文〝在 GNOME 中,用戶自訂「常用程式」選單〞。
  在修改後,「程式選單」就會顯示一個新的「程式捷徑」。
以後執行 Android Studio 就點選新的【Android Studio (Remote)】捷徑。其它詳細說明,請參考前文〝在「遠端電腦」開發,以連接「本地電腦」之 Android 裝置測試(修訂)〞。

已測試版本:

  • Android SDK: 26, 25
  • Fedora: 25, 24, 22

沒有留言:

張貼留言

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