需求

因為疫情的關係,公司已經實施了一陣子的在家上班 WFH 的政策。 也導致了一些平常我人在公司可以完成的事情,在家工作後就會變得非常不易。

今天有個需求是需要針對機房裡面的 Android 手機進行排錯、修復甚至是重啟 App。 前一陣子的作法就是有問題後,我會進公司到機房做一些基礎的排錯。 但是一來一回來個幾次後,就非常地沒有效率。

因此公司的 Android 工程師決定幫我一把,教我如何遠端操控機房的手機。 讓我可以之後不需要一直進機房也可以藉由電腦遠端手機排錯進行一些簡易的處理。

作法

注意:以下教學皆屬學術研究,請勿拿去做非法的行為。

注意:以下操作皆在 Terminal 下完成。

前置作業

安裝

  1. 首先需要安裝 scrcpy (一款像是 iOS 的模擬器,可以顯示畫面與操控 Android 手機)

    brew install scrcpy

  2. 接著需要安裝 Android 的 SDK Platform Tools,以便後續的 debug 操作

    brew install android-platform-tools

指令介紹

adb 全名為 Android Debug Bridge ,一種利用指令列來與 Android 手機溝通的 debug 工具。

adb devices # 可以列出所連接的手機

adb tcpip 5555 # 修改手機的 port 為 5555

adb connect <IP>:5555 # 藉由 IP 連接手機

adb disconnect # 取消連接手機

adb shell input keyevent KEYCODE_POWER # 測試是否可以觸發手機的電源鍵

scrcpy # 利用 scrcpy 連接手機

實機操作

  1. 將手機打開開發者模式(因每一款機型皆不同,這邊就不贅述了),將 USB 偵錯模式打開

  2. 將手機與電腦連接,第一次應該會跳出權限同意,點擊同意並永遠允許或是紀錄 RSA 金鑰以便後續無需再次同意

  3. 利用 adb devices 來確認是否有連結到手機,如下圖所示

    注意:一次建議只連結 1 台裝置,不然後續的 scrcpy 會有問題。

    adbdevices

  4. 利用 adb tcpip 5555 將port 改成 5555

  5. 拔除 USB 線,到手機的 wifi 或是網路查看 IP,記下來後,在 Terminal 輸入

    adb connect <IP>:5555 如果 IP 沒有被自動切換的話,應該是可以連接到的

  6. 可以輸入 adb shell input keyevent KEYCODE_POWER 來測試是否連接成功,如果有的話應該是會關閉螢幕的

  7. 接著打開手機螢幕,並在 Terminal 輸入 scrcpy ,就會跳出 Android 的畫面囉!

    (如果有需要允許操作記得點擊允許 ✅ ),接著就可以做任何你需要的操作!

  8. 結束後,記得取消連接 adb disconnect

後續作業步驟與要點

上述就是基本上如何遠端操作 Android 手機的作法。

後續只要 3 個步驟即可遠端操作手機了。

  1. adb connect <裝置IP>:5555
  2. scrcpy
  3. adb disconnect

但有幾個需要注意的要點是

  1. 手機需要是打開螢幕的,因此有特別設置接上電源時不關閉螢幕

  2. 手機連結的 IP 建議是固定的,要不然下次可能會連結不到

    具體作法可以指定哪些手機使用哪些 IP 。

    或是更 hack 方式,寫一個 App 安裝進去,IP 有變化時就回報給 RD 知道。

    ps. Android 大神還幫我寫了內部使用查詢手機 IP 的工具,佩服佩服

  3. 一次建議只連結 1 個裝置,要換下一個裝置時記得取消上次的連結

總結

藉由上述的操作,之後只要於 Terminal 中輸入指令就可以進行遠端操作 Android 手機了。

可以大大的提升工作的效率。

不過也讓我意識到,真的不能讓手機離開自己的視野 XDD。

還有文中的 Android 大神讓我覺得原來做一個小產品就跟疊積木一樣。 他簡易地寫一個網頁、寫可以 IP 變化後打 API 到 DB 的 APK、DB 採用 Firebase Storage、後端 API 架設在 Heroku,就這樣做出可以簡易查詢手機對應的 IP 工具。 果然事情拆分的越小然後一步一步去完成去修正方向,這樣成功的機率也更大!

這篇文章花了我些時間撰寫,如有錯誤歡迎指正喔!

也歡迎大家幫我點擊下方 ⬇️ 的 LikeCoin 按鈕 5 下給予肯定與回饋,讓我能持續的創作撰寫下去XDD。