孫聖翔 淘系技術
tidevice 是阿里的內部的一個小組用來做 iOS 自動化用的工具,透過逆向iOS通訊協議,使用純Python實現。目前淘寶和其他部分事業部已經全面使用了該技術,進行iOS應用的效能採集,UI自動化。
注:這裡的被測應用無需做任何修改,使用不再侷限於Mac上。
開源地址:
https://github.com/alibaba/taobao-iphone-device
tidevice可以幫你做什麼呢?應用安裝,啟動,停止,檢視啟動 WDA(WebDriverAgent)(注:該操作不依賴xcodebuild,可跨平臺使用)執行UITests (跨平臺使用)效能採集(類似 PerfDog)截圖、syslog採集 等等熟悉libimobiledevice工具集的同學可能知道大部分上面提到的功能,為了方便日常的使用tidevice對libimobiledevice中已有的功能也重新實現了一遍(比如 截圖,看日誌,應用安裝),這樣有tidevice你就可以完成日常所有相關的操作了。
除了這些眾所周知的功能,tidevice還可以完成WDA的啟動,iOS裝置的效能採集。
可能有人不知道WDA為何物,這裡簡單的介紹一下。WDA全名WebDriverAgent是facebook推出的可以實現黑盒iOS自動化的專案。該專案作為一個App執行在iOS手機上,被測應用不需要做任何的更改(比如接入sdk),進行無侵入的測試。唯一不方便的是手機必須連線上Mac電腦,並使用Mac上才有的xcodebuild才能將WDA這個App執行起來,這也導致其推廣起來比較困難。
文章中會重點介紹一下tidevice 如何完成WDA的啟動。原理比較簡單:tidevice透過模擬xcodebuild與手機進行通訊,向手機發送特定的指令,來啟動WDA,從而可以脫離Mac的限制,能夠在Linux、Windows上執行起來iOS自動化,而在tidevice出現之前,這些是無法做到的。
安裝因為是Python專案,一條命令即可完成安裝 pip3 install -U tidevice
安裝完成後,先執行幾個命令測試一下
tidevice version 檢視tidevice版本
tidevice list 檢視已經連線上的iPhone裝置
常用命令安裝應用
tidevice install example.ipa
透過URL安裝應用 (實際使用時網址要改成正確的)
tidevice install http://example.org/demo.ipa
應用啟動
tidevice launch com.apple.Preferences
截圖
tidevice screenshot screenshot.jpg
檢視系統日誌
tidevice syslog
其他常用的命令幫助命令檢視,基本上常用的命令都有了
tidevice -h
啟動WebDriverAgent目前iOS的黑盒自動化,最流行的方法是透過WDA來實現的。在tidevice出現之前,WDA只能透過xcodebuild來啟動,而執行xcodebuild則必須有一臺Mac才行。
tidevice沒有透過xcodebuild,而是透過usbmuxd直接跟手機上的服務進行直接通訊完成手機上WDA的啟動。usbmux在不同的平臺都有開源的實現,所以tidevice不僅能在Mac上執行,也能在Linux、Windows上執行。
關於usbmux通訊協議這部分,蘋果當然不會告訴直接告訴我們。不過因為usbmux本身就是socket套接字,所以我們可以直接截獲其中的內容,然後根據開源界已有的成果,其中大部分的內容已經被破解了。先用xcodebuild完成一次WDA的啟動,然後找到關鍵的通訊內容,再用python來模擬回放一遍,就可以拋棄xcodebuild不用了。
相對於xcodebuild啟動,tidevice因為通訊內容更精簡,所以啟動速度更快(2s左右),另外也更穩定。
說了一堆理論,我們看一下怎麼使用的吧
前提條件
資料線將 iPhone 手機連線到 PC 上手機上已經有WebDriverAgent這個 App 了。這個可以透過 xcode 編譯原始碼安裝,也可以用開發者證書重簽名的 WebDriverAgent.ipa 安裝到手機。Linux和Windows因為預設沒有usbmux這個服務,提前安裝一下就可以。可以參考這個issue:https://github.com/alibaba/taobao-iphone-device/issues/7前提條件OK了的話,像下圖這樣執行命令就可以將WDA啟動起來了。
而驗證WDA是否工作最簡單的辦法就是開啟瀏覽器,網站:
http://localhost:8100/status
能看到下面的輸出說明WDA工作正常了
或者也可以直接使用Appium排程
執行 UITests有些使用者的開發能力可能比較強,習慣直接用OC或者Swift直接寫UI自動化用例。透過tidevice也支援的。
網上找了一個OC寫的XCTest UITests demo專案
https://github.com/FeiHuang93/XCTest-Demo
使用xcode編譯安裝到手機上之後,有兩個應用
testXCTestUITests 執行測試的應用testXCTest 被測應用
使用下面的命令執行即可
tidevice xctest --bundle-id philhuang.testXCTestUITests.xctrunner --target-bundle-id philhuang.testXCTest
將被測應用和執行測試應用打包成ipa後,就可以在多個的手機上運行了。
總結https://github.com/alibaba/taobao-iphone-device