Try   HackMD

Python 腳本語言在自動化控制 Android 系統的應用中,主要有兩種方法,分別為ADB (Android Debug Bridge)Appium

事前準備

程式部分

  1. ADB 開發環境

    Python 環境需安裝 ADB 套件:

    ​​​​python -m pip install adb-shell
    

    再來下載 ADB SDK,並將路徑加入到系統 Path 裡面:

    ​​​​https://developer.android.com/studio/releases/platform-tools?hl=zh-cn
    
    ​​​​https://developer.android.com/studio
    

    在 CLI 下使用以下指令產生 key:

    ​​​​adb keygen /path/to/your/private/key
    

    請將這些 Key 妥善保存,因為在使用 ADB 連結時會需要。

  2. Appium 開發環境

    安裝 Appium 套件:

    ​​​​pip install Appium-Python-Client
    

    其他部分:TBD

  3. 虛擬Android 環境建立

    這邊採用Bluestack 5進行開發,請去官網下載,並依照指示安裝。

    https://www.bluestacks.com/tw/bluestacks-5.html

    安裝好後,在Bluestack的設定中開啟ADB Debugging選項,就完成設定,每次開啟Bluestack時,請使用系統管理員權限執行模擬器,此外對外的port都會不同,也請在每次開發時記得更新。

  4. 實體Android 環境建立

    設定部分會依據不同的手機型號而有不同,請依照自己的手機型號進行實際設定。

到此開發環境已建置完成,可以開始開發相關腳本。也請記得在結束時,將開發者模式關閉,避免遭受不必要的外部攻擊。

1. ADB (Android Debug Bridge)

ADB 透過 Command Line Interface (CLI) 進行 Android 系統的控制。

實用例子

  1. 連結手機

    ​​​​from adb_shell.adb_device import AdbDeviceTcp
    ​​​​from adb_shell.auth.sign_pythonrsa import PythonRSASigner
    
    ​​​​with open('~/.android/adbkey') as f:
    ​​​​    priv = f.read()
    ​​​​signer = PythonRSASigner('', priv)
    
    ​​​​device = AdbDeviceTcp('localhost', 5555)
    ​​​​device.connect(rsa_keys=[signer], auth_timeout_s=0.1)
    
  2. 模擬按下手機系統的 Home 鍵

    ​​​​device.shell('input keyevent 3')
    
  3. 顯示當前系統中所有視窗與其對應的 X,Y 軸位置

    ​​​​result = device.shell('dumpsys window windows')
    

    結果會以以下形式顯示,可以看到當前 Android 手機系統的詳細資訊:

    ​​​​...
    ​​​​mCurrentFocus=Window{41cd39a8 u0 com.android.chrome/com.google.android.apps.chrome.Main}
    
  4. 使用 ADB 進行自動化操作

    例如,以下是一個使用 ADB 進行點擊操作的指令示例:

    ​​​​device.shell('input tap 500 500')
    

    這個指令代表在螢幕上 (500, 500) 的位置進行點擊。

    Android 的 ADB 指令與 Linux 的 Shell 指令十分相似,因為 Android 系統的底層是建立於 Linux 之上的。以下是一些常見的 ADB 指令範例:

    ​​​​# 執行各種 ADB 指令
    ​​​​device.shell('input tap 500 500')  # 點擊
    ​​​​device.shell('input swipe 100 500 100 1000')  # 滑動
    ​​​​device.shell('input text "text"')  # 輸入文字
    ​​​​device.shell('input keyevent KEYCODE_HOME')  # 模擬按鍵事件
    
    ​​​​# 管理裝置
    ​​​​device.shell('pm install /path/to/your.apk')  # 安裝 APK
    ​​​​device.shell('pm uninstall package.name')  # 移除應用程式
    
    ​​​​# 系統資訊
    ​​​​device.shell('dumpsys')  # 取得系統資訊
    ​​​​device.shell('dumpsys window windows | grep mCurrentFocus')  # 顯示當前焦點所在的應用程式和活動
    
    ​​​​# 推送與拉取檔案
    ​​​​device.push('/local/path/to/file', '/remote/path/to/file')
    ​​​​device.pull('/remote/path/to/file', '/local/path/to/file')
    

小結

  1. 使用 ADB 來做自動化的一個主要挑戰是它依賴於固定的螢幕座標。這意味著,對於不同尺寸和解析度的裝置,我們可能需要為每一種情況都寫一個特定的腳本,這無疑增加了開發和維護的複雜性。
  2. ADB 並非專為自動化腳本而設計,因此它缺乏像 Selenium IDE 或 Playwright Codegen 這類的工具,可以自動生成或記錄用戶的操作。因此,開發者往往需要與其他工具(例如 UI Automator Viewer 或 Appium Desktop)配合,才能獲得點擊處的相對座標。

2. Appium

Appium 是一個開源的自動化測試框架,適用於 iOS、Android 和 Windows應用的自動化測試。Appium 的主要優勢在於它可以使用標準的編程語言來撰寫測試腳本,包括 Python。

實用例子

  1. 建立 Appium 服務連接

    ​​​​from appium import webdriver
    
    ​​​​desired_caps = {
    ​​​​    "platformName": "Android",
    ​​​​    "deviceName": "emulator-5554",
    ​​​​    "app": "/path/to/your.apk",
    ​​​​}
    ​​​​driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    
  2. 使用 Appium 進行點擊操作

    例如,要點擊一個元素:

    ​​​​element = driver.find_element_by_id("element_id")
    ​​​​element.click()
    
  3. 使用 Appium 定位元素

    Appium 允許使用者用各種不同的方式來定位元素:

    ​​​​driver.find_element_by_id("id")
    ​​​​driver.find_element_by_name("name")
    ​​​​driver.find_element_by_xpath("xpath")
    ​​​​driver.find_element_by_class_name("class_name")
    

主要優勢

  1. 使用 Appium 可以簡化自動化腳本的開發過程,因為它並不僅僅依賴於固定的螢幕座標。這意味著同一份腳本可以適用於不同尺寸和解析度的裝置,大大簡化了開發和維護的工作。