Lariat是一種強大的命令行工具,旨在簡化遠程Android設備上的命令執行和運行。它通過利用DeviceFarmer的API和Android調試橋(ADB)來實現這一目標。借助Lariat,可以簡化並更有效地手動連接到設備,推動文件,運行命令和檢索結果的繁瑣過程。它是在連續集成(CI)管道中自動化任務的理想解決方案。
PYPI可用lariat:
python -m pip install lariat
Lariat正式支持Python 3.8+。
Lariat使用JSON配置文件。此配置文件的默認位置位於用戶主目錄( ~/.lariat/config.json
)中的.lariat
目錄中。配置文件用於指定以下內容:
device_farmer_url
:要連接到的設備FARMER實例的URL。
.json
或.yaml
結尾的完整URL。 access_token
:您的DeviceFarmer訪問令牌。
adb_private_key_path
:(可選)非默認ADB專用密鑰的路徑。如果未指定,則默認為~/.android/adbkey
adb_shell_default_read_timeout_s
:(可選)默認的總超時(以秒為單位)用於從設備讀取數據。對於某些設備操作的默認值10s,此值可能需要增加。
{
"access_token" : " ef02da4fb3884395af4cf011061a2318ca5e9a04abd04de59c5c99afcce0b7fz " ,
"device_farmer_url" : " https://my.device-farmer-instance.com/ " ,
"adb_private_key_path" : " /custom/path/adb.key " ,
"adb_shell_default_read_timeout_s" : 32.5
}
所有配置選項都可以在命令行上指定,以覆蓋配置文件中設置的任何默認值。例如,命令行選項--device_farmer_url
可以用來覆蓋配置文件中設置的設備farmer URL。
usage: lariat [-h] [-g | -e EXEC_FILE | -c COMMAND] [--config CONFIG] [-s SELECT [SELECT ...]] [-f FILTER [FILTER ...]]
[-p PUSH_FILES]
DeviceFarmer automation tool
optional arguments:
-h , --help show this help message and exit
-g , --get-devices Enumerate devices on DeviceFarmer instance. Does not execute any commands on devices. Prints JSON results
to stdout.
-e EXEC_FILE, --exec-file EXEC_FILE
Push a file and execute it. Pushes to /data/local/tmp/.
-c COMMAND, --command COMMAND
Run a command.
--config CONFIG Override the default path to the configuration file. Default:/home/larry.espenshade/.lariat/config.json
-s SELECT [SELECT ...], --select SELECT [SELECT ...]
Select the fields to be returned by --get-devices (-g). If not specified, all fields are returned.
-f FILTER [FILTER ...], --filter FILTER [FILTER ...]
Filter devices via a list of key-value pairs (e.g., sdk=27 manufacturer=SAMSUNG). Non boolean values are
regex matched
-p PUSH_FILES, --push-files PUSH_FILES
Specify the path to the file or directory to be pushed to the device. Pushes to /data/local/tmp/.
-v, --verbose Increase log level. Can be supplied multiple times to further increase log verbosity (e.g. -vv)
--select
和--filter
選項都使用“字段名稱”來執行各自的操作。這些字段名稱是JSON鍵,由DeviceFarmer定義為REST API的一部分。您可以通過導航到以下URL: https://<device_farmer_url>/api/v1/devices/<serial>
來查看deviceFarmer安裝的支持字段,其中device_farmer_url
是您設備的安裝的URL,並且是serial
號。您的裝置.可以省略/<serial>
組件以查看所有設備的所有字段。
字段名稱支持點表示法以訪問嵌套密鑰。例如, battery.health
可用於訪問battery
內的嵌套health
密鑰。
請注意,指定一個--filter
以及--select
將自動包含結果JSON中過濾器中指定的任何字段名稱。
abi
設備應用二進制界面(例如armeabi-v7a
)manufacturer
- 設備製造商marketName
設備營銷名稱model
- 設備型號名稱provider.name
託管此設備的STF提供商version
- Android版本lariat --get-devices
--get-devices
返回的字段: lariat --get-devices --select serial model status
lariat --get-devices --filter manufacturer=SAMSUNG sdk=2[5-7]
lariat --get-devices --filter provider.name=my.devicefarmer.com
lariat --exec-file path/to/hello
lariat --command " echo hello " --filter abi=arm64-v8a
lariat --push-files path/to/files
符合過濾標準的每個設備的套索返回結果。
以下是echo
命令的示例輸出:
lariat --command " echo hello " --filter abi=arm64-v8a
" A12345 " : {
" output " : " hello " ,
" exitcode " : 0,
},
" B54321 " : {
" output " : " hello " ,
" exitcode " : 0,
},
" C678910 " : {
" reason " : " Device is currently in use " ,
}
每個結果都包含不同的字段,具體取決於設備的可用性:
如果設備不可用,則結果將具有一個字段:
reason
:指定為什麼無法使用該設備,例如目前正在使用的設備,而在範圍內不存在。如果有可用的設備並在其上執行操作,則結果將包括兩個字段:
output
:包含執行命令的ADB殼輸出,或有關執行的操作的詳細信息。exitcode
:在設備上執行的命令或操作的返回代碼。請記住,設備要么具有“原因”字段(如果不可用)或“輸出”和“ exitCode”字段
為了方便起見,可以使用官方的lariat docker圖像。
要使用Docker映像,只需運行
docker run --rm -v ~ /.android:/root/.android:ro -v ~ /.lariat:/root/.lariat:ro ghcr.io/zetier/lariat:latest -c ' echo hello '
此Docker Run命令創建並根據GHCR.IO/ZETIER/LARAIT:LATEST IMAGE創建Docker容器。它執行以下操作:
為在容器內部的 /root/.android目錄中為主機計算機上的.android目錄創建一個只讀音量安裝。
為在容器內部的 /root/.lariat目錄中為主機計算機上的.lariat目錄創建一個只讀音量安裝。
-RM標誌可確保容器退出後自動刪除。
在容器內部,執行了命令lariat -c 'echo hello'
,它將“ Hello”打印為設備範圍內每個可鎖定設備上的輸出。
請注意,如果您的ADB鍵和配置文件位於主機計算機上的不同目錄中,則可能需要相應地修改Docker Run命令,以提供正確的音量安裝路徑。
Lariat設計用於簡單地集成到CI管道中。以下是GitLab作業的一個示例,該作業測試了在DeviceFarmer範圍內內置的二進製文件:
.lariat-test :
image :
name : ghcr.io/zetier/lariat:latest
entrypoint : [""]
stage : test
before_script :
# Copy keys and configs from private CI variables
- mkdir -p ~/.android
- echo "$CI_ADB_PUB_KEY" > ~/.android/adbkey.pub
- echo "$CI_ADB_PRI_KEY" > ~/.android/adbkey
- echo "$CI_FARMHAND_CONFIG" -> ~/.lariat/config.json
script :
- lariat --file $BINARY > test_results.json
artifacts :
paths :
- test_results.json
# Assumes a `build-android-binary` job that produces `android_binary`
# as an artifact.
android-range-test :
extends : .lariat-test
variables :
BINARY : android_binary
needs :
- build-android-binary
Lariat將在執行任何操作之前鎖定設備以確保獨家訪問。操作完成後,設備將被解鎖。
確保通過~/.lariat/config.json
提供正確的路徑,如果它與默認位置不同( ~/.android/adbkey
)
默認情況下,Lariat將枚舉每一個設備範圍內的設備,包括未present
或ready
就緒的設備。您可以通過指定--filter ready=true present=true
如果需要)來修改它。
注意:Lariat是在Ubuntu 18.04上經常在Python 3.8上開發並定期測試的。其他發行版和版本可能會起作用,但目前未經測試。
克隆存儲庫
安裝依賴項以及Lariat Python軟件包
sudo apt-get update
sudo apt-get install python3-venv python3.8-venv -y
python3.8 -m venv venv
source venv/bin/activate
(venv) pip install --upgrade pip
(venv) pip install .
創建一個配置文件
歡迎捐款!如果您發現任何問題或有改進的建議,請打開問題或提交拉動請求。
該項目是根據GPLV2許可證獲得許可的。