本文對Android App的啟動流量測試進行介紹。這裡的啟動流量指的是網路流量,即App在啟動時發起網路請求和接收網路響應時傳輸的網路資料量。
說起流量,也許大家的第一反應就是tcpdump/wireshark這類網路抓包工具。的確,Android系統確實也支援tcpdump
工具,通過tcpdump
,我們可以實現非常精準的流量測試。但tcpdump
也有個問題,就是它捕捉到的流量是系統層面的,我們很難區分捕捉得到的流量資料是否都是當前apk產生的。
其實,對於特定apk的整體流量資料,在Android系統中都會儲存到對應檔案中,我們完全可以通過讀取對應檔案來獲得當前apk的流量資訊。
get app UID
與流量相關的狀態資料儲存在/proc/uid_stat//
目錄下,其中,表示apk對應的UID。
關於UID,簡單地進行下說明。在Linux系統中,UID表示的是User Identifier,主要用於表示是哪位使用者執行了該程式。但在Android系統中,由於Android系統本身就為單使用者系統,這時UID就被賦予了新的使命,主要用於實現資料共享。具體地,Android系統為每個應用都分配了一個UID,不同apk的UID幾乎都是互不相同的,而對於不同UID的apk,不能共享資料資源。之所以用“幾乎”,是因為有時候同一廠家會存在多個產品,並且希望能在多個apk之間實現資料共享,這個時候,便可通過在menifest配置檔案中指定相同的sharedUserId,然後在Android系統中安裝應用時便會分配相同的UID。
獲取app UID的方式有多種,最簡單的方式應該還是從/data/system/packages.list
中讀取,並通過apk的找到對應的UID。
1 2 |
root@hammerhead:/ # cat /data/system/packages.list | grep com.UCMobile.trunk com.UCMobile.trunk 10084 0 /data/data/com.UCMobile.trunk default 3003,1028,1015 |
在這裡,10084即是com.UCMobile.trunk
的UID。
獲取流量資料
流量資料分為接收流量(tcp_rcv)和傳送流量(tcp_snd)兩部分,這兩個狀態數值我們可以通過讀取/proc/uid_stat/
目錄下的兩個檔案得到。
1 2 3 4 |
shell@hammerhead:/ $ cat /proc/uid_stat/10084/tcp_rcv 3446837 shell@hammerhead:/ $ cat /proc/uid_stat/10084/tcp_snd 134366 |
通過這種方式,我們就可以讀取得到指定apk在當前時刻的累計流量數值。
獲得啟動流量資料
有了前面的基礎,我們要測試啟動流量就很好實現了。只需要在啟動前採集下累計流量數值,然後啟動應用,完成啟動後再採集一次累計流量數值,前後兩次累計數值的差值便是當次啟動耗費的流量數。需要注意的是,由於很多時候apk在啟動後,會在系統後臺非同步載入一些資料資源,因此為了保證我們採集到當次啟動耗費的全部流量數值,我們在啟動應用後最好能等待一段時間。
1 2 3 4 5 6 7 8 9 10 11 |
root@hammerhead:/ # cat /proc/uid_stat/10084/tcp_snd 15068 root@hammerhead:/ # cat /proc/uid_stat/10084/tcp_rcv 98021 # start app activity, sleep 10s root@hammerhead:/ # cat /proc/uid_stat/10142/tcp_snd 23268 root@hammerhead:/ # cat /proc/uid_stat/10142/tcp_rcv 965651 |
採集到前後兩次流量數值後,即可計算得到當次啟動耗費的總流量。
1 |
當次啟動總流量 = (23268 + 965651) - (15068 + 98021) = 875830 bytes |
當然,這裡的啟動還分為好幾種,包括首次安裝啟動、非首次安裝啟動、覆蓋安裝啟動等。具體的啟動方式可根據實際場景來定,但在統計流量的方法方面都是相同的。
總結
本文講解了Android App啟動流量測試的一種方法。然而,本次介紹的方法也存在一定侷限性,因為/proc/uid_stat//
目錄下的tcp_rcv
和tcp_snd
檔案中都只記錄了總值,如果我們只關注總體的流量數值還好,但要是我們希望能測試得到更細化的資料,該方法就沒法滿足我們的測試需求了。
舉個例子,UC瀏覽器國際版在啟動後,會和美國的伺服器進行通訊互動。現在,我們想測試UC瀏覽器國際版在啟動後與美國伺服器的通訊流量。
顯然,本文中介紹的方法是沒法實現上述例子中的測試需求的。那例子中的場景要怎麼測呢?這就還是得用到tcpdump
,在下一篇文章中我會再詳細進行介紹。