幾乎每個雲測平臺或手機廠商都有云真機業務,解決了小團隊真機裝置覆蓋不足、資產管理困難的問題,讓開發者可以像本地裝置一樣線上操控和除錯裝置。雲真機平臺一般附帶一些輔助操作平臺,可以通過拖拽的方式安裝APP,同步黏貼板,檢視log,截圖跑自動化,等等這些都可以在瀏覽器內完成,確實給研發測試都帶來了不少便捷。雲真機通過一個裝置管理系統,將這些真機對外租用,相比於傳統的實體機租用,線上租用免去了實體機快遞和硬體損壞風險的問題,隨租隨用,資費透明。但他們都有一個共同點,貴,超級貴,按秒計費。
主流的雲真機平臺有騰訊WeTest遠端除錯、TestIn遠端真機、百度測試雲真機等,下面是百度雲真機官網的介紹。
ADB是什麼在講雲真機之前,需要先說說什麼是ADB。全名:Android Debug Bridge官方解釋:
Android 除錯橋 (adb) 是一個通用命令列工具,其允許您與模擬器例項或連線的 Android 裝置進行通訊。
ADB可分為三個部分:
客戶端 該元件傳送命令。客戶端在開發計算機上執行。您可以通過發出 adb 命令從命令列終端呼叫客戶端。後臺程式該元件在裝置上執行命令。後臺程式在每個模擬器或裝置例項上作為後臺程序執行。伺服器該元件管理客戶端和後臺程式之間的通訊。伺服器在開發計算機上作為後臺程序執行。開啟開發者除錯模式發生了什麼ADB的後臺程式相當於一個跑在手機上的伺服器,通過約定的協議以TCP的方式和PC的客戶端互動,執行命令。比如 adb install命令,實際上是往手機上傳了一個apk檔案,然後告訴手機的安裝程式安裝這個apk;比如斷點除錯程式碼,實際上是IDE和手機之間通過adb互傳程式碼執行資訊,程式碼行號之類的。
研發可以通過開啟一個SocketServer來欺騙adb,執行adb connect命令就會顯示連線了一個裝置,可以看到每條adb命令發出的是什麼樣的報文,當然孤獨的adb是得不到任何迴應的,它連的是假的裝置。
adb的許可權極大,可以在偷偷的執行命令而使用者看不到,就像電腦上安裝了360防毒軟體,連上手機後,手機上會默默的多出一個360安全助手APP。。。
這個後臺程式預設是不開啟的,當你開啟和關閉手機開發者設定裡面的除錯模式後,其實就是在開關這個後臺程式。
所以不建議普通使用者的手機開啟這個功能,哪怕360給你說出一萬個開啟除錯模式的好處,也不要開。
雲真機是什麼這些雲測平臺沒有騙你,真的在雲端跑了大量的真機,不是虛擬機器不是模擬器。所以貴也是有道理的,當你租用這個手機的時候,就是獨佔了一臺價值不菲的裝置,消耗著不小的頻寬。
雲真機原理
雲真機本質上就是遠端控制手機,並且通過API的方式間接呼叫adb命令和手機互動。雲測平臺的伺服器通過一些高階的USB HUB連線了很多真機,再通過一個裝置管理系統,將手機螢幕類似直播的方式顯示到使用者的瀏覽器上,再接收瀏覽器的上的手勢操作回傳給伺服器。
上面提到這些雲測平臺的雲真機服務,基本都是在一個叫STF的開源軟體基礎上定製開發而來的。STF 全名Smartphone Test Farm,是一個安卓裝置管理線上平臺(也在擴充套件ios支援),剛開始被設計用來將將公司內部眾多的安卓裝置資產統一管理,並可以直接在個人電腦上線上使用手機,後來這些雲測平臺改改UI,變成了一個對外租用服務。
STF平臺架構STF架構的官方說明可以看看GitHub上的DEPLOYMENT.md
這個有點不好理解,這裡畫個簡版的架構圖:
這裡面幾個關鍵角色介紹一下:
STF部署上面所有的服務都可以是一臺獨立的電腦,也可以部分或全部在同一臺電腦上。部署方式分為單機和叢集兩種。
單機單機就是所有的服務都部署在同一臺電腦上,用於自己使用。stf的安裝成功是比較困難的,命令其實很簡單,主要是一些依賴庫可能需要翻牆,因此建議下面的所有安裝命令都要在翻牆狀態下執行。安裝失敗建議解除安裝已安裝的模組,全部重新安裝。
安裝:首先,安裝依賴項,Mac為例:
brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config
然後再安裝stf:
npm install -g stf
執行:先啟動rethinkdb:只需要在命令列中通過rethinkdb命令啟動;再啟動服務:對於單機版,有一個快捷的命令以預設配置一鍵啟動所有服務:
stf local --public-ip <your_internal_network_ip_here>
—public-ip 是你的內網ip,這樣區域網內的其他同學也可以遠端你電腦上的手機,不加這個引數就只能本機訪問。
使用:預設的web服務埠是7100,因此在瀏覽器輸入http://localhost:7100即可使用。接入手機,裝置列表上會自動出現手機並且標記為線上狀態,點選該裝置就可以進入遠端控制狀態;拔下手機就會自動標灰,無法遠端。
叢集叢集就是將部分模組獨立部署,以緩解節點壓力,上面的每一個服務都是可以獨立部署的,並且像裝置提供方、web伺服器、代理伺服器都是可以叢集的。一種簡單的叢集模式可以是:
伺服器部分:因為不再是單機了,每個服務都得單獨啟動關聯,相對複雜,可以參考官方的部署方法(https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md)個人部分:只要執行provider模組,所以只要使用stf provider命令,除了指定內網ip外(大家電腦上也沒有公網ip),還需要其他幾個必要引數,包括訊息服務的地址、儲存服務的地址、埠區間(用於代理服務分配埠,不能和其他裝置提供方重合)等。完整的命令如下:將除裝置提供服務外的所有服務部署在一個公網伺服器上,而在每個人的電腦上部署一個裝置提供服務。這樣,每個人電腦上的部署就相對簡單,而且每個人都可以將自己電腦上的裝置連線到伺服器上,統一管理。
stf provider \\ --name "%H/%i" \\ --connect-sub tcp://devside.stf.example.org:7250 \\ --connect-push tcp://devside.stf.example.org:7270 \\ --storage-url https://stf.example.org/ \\ --public-ip ${COREOS_PRIVATE_IPV4} \\ --min-port=15000 \\ --max-port=25000 \\ --heartbeat-interval 10000 \\ --screen-ws-url-pattern "wss://stf.example.org/d/%i/<%= serial %>/<%= publicPort %>/"
Docker部署docker部署的成功率最高,但是在Mac下docker和宿主機無法共享USB裝置,所以無法提供裝置,其他其他的可以嘗試。也在上面的官方部署裡面有提到。
STF擴充套件方向這裡可以參考美團點評雲真機平臺實踐(https://tech.meituan.com/2018/07/19/cloud-phone.html),可以擴充套件的方向包括:簡單的頁面改造、賬戶整合KMS、整合Jenkins自動化測試(使用API上傳apk直接安裝指定到測試機)、跨區域網部署(比如把Websocket換成WebRTC,使用SocketServer模擬裝置轉發)等等。反編譯了阿里雲真機的客戶端程式原始碼,其真是通過本地開啟了一個SocketServer中轉雲端真機的adb資料流,而我們本地Android Studio連結的裝置其實是這個SocketServer,阿里雲通過這個SocketServer實現了雲真機的一些許可權校驗工作。
等實踐了定製後再但單獨開一篇介紹吧。