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