騰訊雲技術社區-掘金主頁持續爲你們呈現雲計算技術文章,歡迎你們關注!python
做者:樊林android
對於android的開發以及測試人員,對adb命令必定會很熟悉,adb工具可謂android測試的入門神器,安裝、卸載、抓log、截圖等等包羅萬象。不少自動化以及性能工具都必定程度上要依賴adb工具。ios
剛開始接觸iOS時,一直但願iOS有一套相似adb工具的東西,結果都被告知要用itools、ituns類的圖形化界面工具。後來通過研究,要在iOS上實現一套類adb工具理論上是沒有問題,有不少開源庫可使用,因此就作了一套idb出來(目前適用於windows平臺),做爲iOS的測試的基礎工具,主要實現了兩個功能。程序員
一、讓用戶可使用idb對iOS手機進行基礎的操做,就如同使用adb操做android手機;shell
二、封裝好了一鍵抓取網絡包(生成pcap文件)以及log的方式,提升相應的效率。 windows
完整idb工具下載地址(僅供交流學習):
share.weiyun.com/f28c0e8f6fb… 。微信
第一步:首先經過usbmux技術,和手機創建鏈接。usbmux是一種能夠經過usb管道(也就是一個usb端口)創建多路複用鏈接的系統。這是一個類TCP系統,經過這種系統,主機的端口號能夠和手機中的特定端口號創建鏈接並通訊。網絡
第二步:鏈接手機的lockdown服務,對應的端口號爲62708,而後經過和lockdown服務傳輸數據,實現相應的功能。這個服務一般只能經過usb端口創建相應的tcp鏈接(也就是第一步說的usbmux系統)。Lockdown服務能夠用來作不少事情,安裝應用、查看文件、重啓等等。架構
通訊協議從低到高以下:app
一、USB協議:經過usb端口傳輸多個鏈接的數據,相似於網絡中的數據鏈路層;
二、usbmuxd協議:打開設備上TCP端口鏈接,類型於網絡中的運輸層;
三、lockdownd協議:用於和lockdown服務傳輸數據,相似於網絡中的應用層。
瞭解到iTunes的原理後,不少人便開始本身開發一些庫,實現同樣的功能,最有名的就是libimobiledevice是基於C語言實現的,編譯配置比較麻煩,學習成本也較高。後來也出了對應的python庫,即pymobiledevice。idb就是基於這個python庫實現的。
idb架構設計上分爲5層:
一、usbmux層:usb驅動層;
二、PlistService層:鏈接創建層,調用usbmux層,完成鏈接的創建,示例代碼以下:
self.s = mux.connect(dev, 62708);
三、Locdown封裝層:封裝好基本的lockdwon服務,並完成和手機的配對驗證;
四、功能實現層:經過lockdown實現對應的功能,核心示例代碼以下:
實現安裝功能
self.lockdown.startService("com.apple.mobile.installation_proxy")
實現文件相關功能
self.lockdown.startService("com.apple.mobile.house_arrest")
五、命令行工具封裝層:工具的初衷是爲了開發一套相似android的adb的工具,這一層主要仿照adb,實現對應命令行參數的解析並調用功能實現層,完成對應的功能。
一、模仿adb的交互方式:adb的便利性以及高效已經獲得了你們的普遍承認,因此idb的用法要和adb保持一致,作到在命令行中直接輸入idb+對應的命令便可實現對應的功能;
二、具體的實現:工具使用的是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平常測試過程當中,會有一些抓包、抓log的需求,這些在android測試中也比較麻煩,因此在idb開發過程當中,但願可以將抓網絡包、抓log操做盡最大可能簡化。
一、交互設計:一條命令開始抓取、Ctrl+C結束、當前目錄生成pcap文件以及log文件 。
二、具體實現:
A、命令封裝:idb pcap。
B、網絡包和log的抓取實現通用的封裝:核心實現start和stop兩個函數。
start:啓動工做線程實現對應的功能,並在工做線程中時刻檢測對應的標誌位,看是否要結束;
stop:修改標誌位爲結束,觸發工做線程的中止;處理並存儲生成的文件。
C、入口函數對Ctrl+C的捕獲:當運行python程序時,使用鍵盤輸入Ctrl+C,python程序內部會拋出一個KeyboardInterrupt異常,咱們能夠經過捕獲對應的異常實現相應的功能。
D、爲了方便查看,對應的文件統一以當前的時間命令,並存在在命令行所在的路徑。
核心代碼實現:
下載地址(僅供交流學習):share.weiyun.com/f28c0e8f6fb… 。
下載對應的zip包,而後解壓。
「.」開頭的是eclipse工程文件,不用管(能夠直接做爲pydev工程導入eclipse,僅供交流學習)。
「idb.py」實現idb全部功能的腳本。
「idb.bat」入口函數,方便在命令行中直接經過「idb」命令調用相應功能。
「pymobiledevice_sheldonfan」調用的類庫,全部須要的python庫都已經放在裏面了。
一、支持手機基本操做:重啓、鎖屏、休眠;
二、支持應用的安裝、卸載、查看;
三、支持沙盒目錄的查看以及基本的文件操做(iOS10以後出現限制,暫沒法完美支持);
四、支持log、網絡pcap包的一鍵抓取。
一、安裝python2.7(32位版),並設置環境變量。設置方法以下:
依次打開:計算機——》右鍵——》屬性——》左上角"高級系統設置"——》右下角「環境變量」——》系統變量——》選中「Path」——》點擊「編輯」——》將python的目錄加進去用";"分割,其餘不要變——》點擊肯定。
Python目錄指的是python的安裝目錄,默認安裝在C:\Python27目錄下。Python目錄須要包含python的可執行文件,以下圖:
二、Windows 7,安裝iPhone驅動(檢驗標準,各類iPhone手機助手可以識別並鏈接手機);
三、下載完後能夠將目錄添加到PC的環境變量中,方便在任何地方調用。
若是已經添加了環境變量,直接打開cmd便可。
1.重啓手機:輸入命令 idb reboot。
二、關機:idb shutdown。
三、讓手機休眠:idb sleep //這個命令會讓手機進入深度睡眠,usb鏈接也會斷掉;按電源鍵點亮屏幕,又會正常鏈接 。
4.安裝app(ipa文件):idb install 「ipa文件路徑」。
五、卸載app:idb uninstall 「app的id」(相似於android中的包名)。
六、顯示全部的APP:idb listapps //默認顯示全部的APP。
七、顯示用戶安裝的APP:idb listapps user。
八、顯示系統自帶的APP:idb listapps sys。
九、查看系統級文件列表:idb shell //ios使用沙盒環境,默認進入的是系統的圖片、書籍音樂,也只能顯示這些文件:
十、獲取系統文件到本機:idb pull 手機目錄 pc目錄
手機目錄能夠經過idb shell命令來查看(就是上一條命令)。
示例:idb pull /DCIM .
將手機中的DCIM目錄抓到當前目錄(當前目錄用「.」表示)。
能夠pull單個文件,也能夠pull整個目錄。
十一、push文件到系統目錄idb push 「pc文件路徑」「手機目錄」。
手機目錄也是經過idb shell來肯定的(push圖片後,手機沒法識別,後續會繼續優化)。
十二、獲取APP沙盒中的文件:idb -p 「應用id」 pull 「 手機目錄」「pc目錄」。
示例以下:
idb -p com.tencent.mlife.dailybuild pull Documents .
將應用id爲com.tencent.mlife.dailybuild 的應用的Documents 目錄,拉到當前目錄(用「.」表示)
1三、push文件到app沙盒中:idb -p 「應用id」 push「pc文件路徑」「手機目錄」。
1四、idb logcat 抓系統日誌,也能夠經過idb logcat >mylog.txt重定向到文件。
1五、idb screenshot 截圖,這個須要手機裝了開發者功能,若是沒裝的話,能夠考慮在手機上按電源鍵以及home鍵,而後pull到電腦上。
1六、idb pcap抓包,開始抓包,按Ctrl+C結束,會在當前的cmd所在的目錄生成對應的pcap文件以及log文件。
按Ctrl+C結束抓取,提示總流量並在當前目錄生成pcap文件以及日誌文件(系統日誌)。
一、驅動必定要先裝好,若是電腦識別不了手機,全部的命令都沒法執行;
二、有時候鏈接不上手機,多是驅動加載問題,能夠嘗試啓動itunes從新安裝驅動、重啓電腦、重啓手機;
三、部分APP的沙盒環境是不能訪問的,這個和APP設置有關。通常平常測試的APP(非正式發佈的)都容許訪問沙盒目錄,方便獲取相應的文件。可是iOS10增長了對沙盒目錄的限制,沒法完美支持;
四、目前支持python2.7 32位版,其餘版本暫時沒法支持(由於有些引用類庫的限制)。
想知道更多測試相關乾貨 請關注咱們的微信公衆號——騰訊移動品質中心TMQ:
【有獎討論】程序員,怎麼應對三十歲? 點擊查看詳情
相關閱讀
Web 性能壓測工具 ApacheBench(ab)使用總結
手機發燙是爲什麼—— App 電量測試定位方法
iOS 程序從開發完到上 AppStore 那點事兒
此文已由做者受權騰訊雲技術社區發佈,轉載請註明文章出處
原文連接:cloud.tencent.com/community/a…
獲取更多騰訊海量技術實踐乾貨,歡迎你們前往騰訊雲技術社區