iOS 測試利器:idb

騰訊雲加社群發表於2017-05-12

騰訊雲技術社群-掘金主頁持續為大家呈現雲端計算技術文章,歡迎大家關注!


作者:樊林

導讀

對於android的開發以及測試人員,對adb命令一定會很熟悉,adb工具可謂android測試的入門神器,安裝、解除安裝、抓log、截圖等等一應俱全。很多自動化以及效能工具都一定程度上要依賴adb工具。

剛開始接觸iOS時,一直希望iOS有一套類似adb工具的東西,結果都被告知要用itools、ituns類的圖形化介面工具。後來經過研究,要在iOS上實現一套類adb工具理論上是沒有問題,有很多開源庫可以使用,所以就做了一套idb出來(目前適用於windows平臺),作為iOS的測試的基礎工具,主要實現了兩個功能。

1、讓使用者可以使用idb對iOS手機進行基礎的操作,就如同使用adb操作android手機;

2、封裝好了一鍵抓取網路包(生成pcap檔案)以及log的方式,提高相應的效率。

完整idb工具下載地址(僅供交流學習):
share.weiyun.com/f28c0e8f6fb…

原理

iTunes是如何連線手機的?

第一步:首先通過usbmux技術,和手機建立連線。usbmux是一種可以通過usb管道(也就是一個usb埠)建立多路複用連線的系統。這是一個類TCP系統,通過這種系統,主機的埠號可以和手機中的特定埠號建立連線並通訊。

第二步:連線手機的lockdown服務,對應的埠號為62708,然後通過和lockdown服務傳輸資料,實現相應的功能。這個服務通常只能通過usb埠建立相應的tcp連線(也就是第一步說的usbmux系統)。Lockdown服務可以用來做很多事情,安裝應用、檢視檔案、重啟等等。

通訊協議從低到高如下:

1、USB協議:通過usb埠傳輸多個連線的資料,類似於網路中的資料鏈路層;

2、usbmuxd協議:開啟裝置上TCP埠連線,型別於網路中的運輸層;

3、lockdownd協議:用於和lockdown服務傳輸資料,類似於網路中的應用層。

idb原理介紹

瞭解到iTunes的原理後,很多人便開始自己開發一些庫,實現一樣的功能,最有名的就是libimobiledevice是基於C語言實現的,編譯配置比較麻煩,學習成本也較高。後來也出了對應的python庫,即pymobiledevice。idb就是基於這個python庫實現的。

idb架構設計上分為5層:

1、usbmux層:usb驅動層;

2、PlistService層:連線建立層,呼叫usbmux層,完成連線的建立,示例程式碼如下:

self.s = mux.connect(dev, 62708);

3、Locdown封裝層:封裝好基本的lockdwon服務,並完成和手機的配對驗證;

4、功能實現層:通過lockdown實現對應的功能,核心示例程式碼如下:

實現安裝功能
self.lockdown.startService("com.apple.mobile.installation_proxy")

實現檔案相關功能
self.lockdown.startService("com.apple.mobile.house_arrest")

5、命令列工具封裝層:工具的初衷是為了開發一套類似android的adb的工具,這一層主要仿照adb,實現對應命令列引數的解析並呼叫功能實現層,完成對應的功能。

遇到的問題及解決方案

工具互動方式的選擇以及如何實現?

1、模仿adb的互動方式:adb的便利性以及高效已經得到了大家的廣泛認可,所以idb的用法要和adb保持一致,做到在命令列中直接輸入idb+對應的命令即可實現對應的功能;

2、具體的實現:工具使用的是python語言開發實現的,而python的執行方式最常見的是 python+指令碼檔名,要做到在命令列中直接輸入idb實現對應指令碼python指令碼的執行並實現引數的傳遞;

最初想到的方案:將python打包成可執行的exe檔案,這個操作比較重,而且之後改起來又比較麻煩,同時也不符合python指令碼語言的特性,最終拋棄了這種方案。

最終方案:簡潔的bat封裝(bat是windows自帶的批處理語言)。

A、新建一個idb.bat檔案,將idb.bat檔案所在目錄加入Path環境變數後,命令列中輸入idb,即可執行對應的idb.bat檔案;

B、Python指令碼路徑設定:最
終需要呼叫相應的python指令碼實現相應的功能,為了保證在任意目錄下,都能正常執行。

在idb.bat中設定對應python指令碼的絕對路徑:目前python指令碼和bat指令碼在同一個目錄下,所以可以用“%~dp0%mypy%”來表示python指令碼的絕對路徑,“mypy”變數代表對應的python指令碼的名稱。

C、Bat到python的引數傳遞:bat指令碼中可以用“%*”表示在命令列中收到的引數,可以用這種方式傳遞引數給python。

具體的實現如下:

iOS 測試利器:idb

複雜功能的封裝

在iOS日常測試過程中,會有一些抓包、抓log的需求,這些在android測試中也比較麻煩,所以在idb開發過程中,希望能夠將抓網路包、抓log操作盡最大可能簡化。

1、互動設計:一條命令開始抓取、Ctrl+C結束、當前目錄生成pcap檔案以及log檔案 。

2、具體實現:

A、命令封裝:idb pcap。

B、網路包和log的抓取實現通用的封裝:核心實現start和stop兩個函式。

start:啟動工作執行緒實現對應的功能,並在工作執行緒中時刻檢測對應的標誌位,看是否要結束;

stop:修改標誌位為結束,觸發工作執行緒的停止;處理並儲存生成的檔案。

C、入口函式對Ctrl+C的捕獲:當執行python程式時,使用鍵盤輸入Ctrl+C,python程式內部會丟擲一個KeyboardInterrupt異常,我們可以通過捕獲對應的異常實現相應的功能。

D、為了方便檢視,對應的檔案統一以當前的時間命令,並存在在命令列所在的路徑。

核心程式碼實現:

iOS 測試利器:idb

工具介紹

下載地址(僅供交流學習):share.weiyun.com/f28c0e8f6fb…

目錄結構:

iOS 測試利器:idb

下載對應的zip包,然後解壓。

“.”開頭的是eclipse工程檔案,不用管(可以直接作為pydev工程匯入eclipse,僅供交流學習)。

“idb.py”實現idb所有功能的指令碼。

“idb.bat”入口函式,方便在命令列中直接通過“idb”命令呼叫相應功能。

“pymobiledevice_sheldonfan”呼叫的類庫,所有需要的python庫都已經放在裡面了。

主要功能:

1、支援手機基本操作:重啟、鎖屏、休眠;

2、支援應用的安裝、解除安裝、檢視;

3、支援沙盒目錄的檢視以及基本的檔案操作(iOS10之後出現限制,暫無法完美支援);

4、支援log、網路pcap包的一鍵抓取。

環境依賴

1、安裝python2.7(32位版),並設定環境變數。設定方法如下:

依次開啟:計算機——》右鍵——》屬性——》左上角"高階系統設定"——》右下角“環境變數”——》系統變數——》選中“Path”——》點選“編輯”——》將python的目錄加進去用";"分割,其他不要變——》點選確定。

Python目錄指的是python的安裝目錄,預設安裝在C:\Python27目錄下。Python目錄需要包含python的可執行檔案,如下圖:

iOS 測試利器:idb

2、Windows 7,安裝iPhone驅動(檢驗標準,各種iPhone手機助手能夠識別並連線手機);

3、下載完後可以將目錄新增到PC的環境變數中,方便在任何地方呼叫。

用法詳解

如果已經新增了環境變數,直接開啟cmd即可。

1.重啟手機:輸入命令 idb reboot。

iOS 測試利器:idb

後面輸入的是呼叫python指令碼時列印出來的內容。

2、關機:idb shutdown。

3、讓手機休眠:idb sleep //這個命令會讓手機進入深度睡眠,usb連線也會斷掉;按電源鍵點亮螢幕,又會正常連線 。

4.安裝app(ipa檔案):idb install “ipa檔案路徑”。

5、解除安裝app:idb uninstall “app的id”(類似於android中的包名)。

6、顯示所有的APP:idb listapps //預設顯示所有的APP。

7、顯示使用者安裝的APP:idb listapps user。

8、顯示系統自帶的APP:idb listapps sys。

9、檢視系統級檔案列表:idb shell //ios使用沙盒環境,預設進入的是系統的圖片、書籍音樂,也只能顯示這些檔案:

iOS 測試利器:idb

進入後支援簡單的ls、cd、pwd等命令。進入後可以使用exit命令退出。

10、獲取系統檔案到本機:idb pull 手機目錄 pc目錄
手機目錄可以通過idb shell命令來檢視(就是上一條命令)。

示例:idb pull /DCIM .

將手機中的DCIM目錄抓到當前目錄(當前目錄用“.”表示)。

iOS 測試利器:idb

iOS 測試利器:idb

可以pull單個檔案,也可以pull整個目錄。

11、push檔案到系統目錄idb push “pc檔案路徑”“手機目錄”。

手機目錄也是通過idb shell來確定的(push圖片後,手機無法識別,後續會繼續優化)。
12、獲取APP沙盒中的檔案:idb -p “應用id” pull “ 手機目錄”“pc目錄”。

示例如下:

idb -p com.tencent.mlife.dailybuild pull Documents .
將應用id為com.tencent.mlife.dailybuild 的應用的Documents 目錄,拉到當前目錄(用“.”表示)

iOS 測試利器:idb

iOS 測試利器:idb

13、push檔案到app沙盒中:idb -p “應用id” push“pc檔案路徑”“手機目錄”。

14、idb logcat 抓系統日誌,也可以通過idb logcat >mylog.txt重定向到檔案。

15、idb screenshot 截圖,這個需要手機裝了開發者功能,如果沒裝的話,可以考慮在手機上按電源鍵以及home鍵,然後pull到電腦上。

16、idb pcap抓包,開始抓包,按Ctrl+C結束,會在當前的cmd所在的目錄生成對應的pcap檔案以及log檔案。

iOS 測試利器:idb

按Ctrl+C結束抓取,提示總流量並在當前目錄生成pcap檔案以及日誌檔案(系統日誌)。

iOS 測試利器:idb

iOS 測試利器:idb

注意事項

1、驅動一定要先裝好,如果電腦識別不了手機,所有的命令都無法執行;

2、有時候連線不上手機,可能是驅動載入問題,可以嘗試啟動itunes重新安裝驅動、重啟電腦、重啟手機;

3、部分APP的沙盒環境是不能訪問的,這個和APP設定有關。一般日常測試的APP(非正式釋出的)都允許訪問沙盒目錄,方便獲取相應的檔案。但是iOS10增加了對沙盒目錄的限制,無法完美支援;

4、目前支援python2.7 32位版,其他版本暫時無法支援(因為有些引用類庫的限制)。

想知道更多測試相關乾貨 請關注我們的微信公眾號——騰訊移動品質中心TMQ:

iOS 測試利器:idb

【有獎討論】程式設計師,怎麼應對三十歲? 點選檢視詳情

相關閱讀
Web 效能壓測工具 ApacheBench(ab)使用總結
手機發燙是為何—— App 電量測試定位方法
iOS 程式從開發完到上 AppStore 那點事兒


此文已由作者授權騰訊雲技術社群釋出,轉載請註明文章出處
原文連結:cloud.tencent.com/community/a…
獲取更多騰訊海量技術實踐乾貨,歡迎大家前往騰訊雲技術社群

相關文章