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