---
# System prepended metadata

title: Python 自動化控制 Android 系統
tags: [Andriod, ADB, Appium]

---


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

## 事前準備

### 程式部分

1. **ADB 開發環境**

    Python 環境需安裝 ADB 套件：

    ```python
    python -m pip install adb-shell
    ```

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

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

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

    ```text
    adb keygen /path/to/your/private/key
    ```

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

2. **Appium 開發環境**

    安裝 Appium 套件：

    ```python
    pip install Appium-Python-Client
    ```

    其他部分：TBD

3. **虛擬Android 環境建立**
    
    這邊採用Bluestack 5進行開發，請去官網下載，並依照指示安裝。
    
    [https://www.bluestacks.com/tw/bluestacks-5.html](https://www.bluestacks.com/tw/bluestacks-5.html?utm_source=Google&utm_medium=CPC&utm_campaign=aw-ded-tw-bluestacks5-brand&utm_source=google&utm_campaign=12450783260&utm_medium=ad&utm_content=606025724345&utm_term=bluestacks%E4%B8%8B%E8%BC%89&gad=1&gclid=Cj0KCQjwiIOmBhDjARIsAP6YhSXBMNR7FGgdAhfg4kj92zL-ttf3F1dL0kPNCs4IKRww5CYyR9Gm3bUaAq4yEALw_wcB)
    
    安裝好後，在Bluestack的設定中開啟ADB Debugging選項，就完成設定，每次開啟Bluestack時，請使用系統管理員權限執行模擬器，此外對外的port都會不同，也請在每次開發時記得更新。

4. **實體Android 環境建立**
    
    設定部分會依據不同的手機型號而有不同，請依照自己的手機型號進行實際設定。
    
到此開發環境已建置完成，可以開始開發相關腳本。也請記得在結束時，將開發者模式關閉，避免遭受不必要的外部攻擊。

## 1. ADB (Android Debug Bridge)

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

### 實用例子

1. **連結手機**

    ```python
    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 鍵**

    ```python
    device.shell('input keyevent 3')
    ```

3. **顯示當前系統中所有視窗與其對應的 X，Y 軸位置**

    ```python
    result = device.shell('dumpsys window windows')
    ```

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

    ```text
    ...
    mCurrentFocus=Window{41cd39a8 u0 com.android.chrome/com.google.android.apps.chrome.Main}
    ```

4. **使用 ADB 進行自動化操作**

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

    ```python
    device.shell('input tap 500 500')
    ```

    這個指令代表在螢幕上 (500, 500) 的位置進行點擊。
    
    Android 的 ADB 指令與 Linux 的 Shell 指令十分相似，因為 Android 系統的底層是建立於 Linux 之上的。以下是一些常見的 ADB 指令範例：

    ```python
    # 執行各種 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 服務連接**

    ```python
    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 進行點擊操作**

    例如，要點擊一個元素：

    ```python
    element = driver.find_element_by_id("element_id")
    element.click()
    ```

3. **使用 Appium 定位元素**

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

    ```python
    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 可以簡化自動化腳本的開發過程，因為它並不僅僅依賴於固定的螢幕座標。這意味著同一份腳本可以適用於不同尺寸和解析度的裝置，大大簡化了開發和維護的工作。
