Linux 系統(tǒng)下所有的信息都是以文件的形式存在的。
應(yīng)用程序的流量信息也被保存在操作系統(tǒng)的某一個文件中。
Android 2.2 版本以前的系統(tǒng)的流量信息都存放在
proc/net/dev
或者 proc/self/net/dev
目錄下辛友,讀取文件然后對其進(jìn)行解析就行了。
之后版本存放路徑
proc/uid_stat/uid /tcp_rcv
proc/uid_stat/uid /tcp_snd
讀取某個應(yīng)用(uid)的流量杰捂,對以上兩個文件進(jìn)行解析即可(注:模擬器下不存在這個目錄)比驻。
查看某個應(yīng)用的流量信息,可以通過以下命令來實(shí)現(xiàn):
查看uid等于1000的程序认轨,流量使用數(shù)據(jù)
這里需要注意的是不同語言編寫的應(yīng)用程序?qū)?yīng)的的 uid 命名規(guī)則是不同的:
Java 編寫的應(yīng)用程序绅络,它的 uid 是從 10000 開始的;
C 語言編寫的,它的 uid 是從 1000 開始的;
另外嘁字,uid 一旦被分配恩急,是不會改變的。
從下圖中我們可以看到類似u0_a0纪蜒、u0_a1衷恭、u0_a3、u0_a4的信息纯续,這些信息也代表了 uid:
u0_a0 等同于 10000
u0_a1 等同于 10001
事實(shí)上“u0_aXX”后面的信息代表這個應(yīng)用的安裝序號随珠,表示這個應(yīng)用是第幾個被安裝到系統(tǒng)的灭袁。
查看 /data/data 需要root權(quán)限
程序包名與程序uid對應(yīng)關(guān)系,存儲在系統(tǒng)/data/system/packages.list文件中
需要root權(quán)限
Android 2.2 版本開始加入了android.net.TrafficStats類來實(shí)現(xiàn)對流量統(tǒng)計(jì)的操作窗看。
其實(shí) TrafficStats 類也是讀取 Linux 下保存流量信息的文件并進(jìn)行解析來實(shí)現(xiàn)的茸歧。
類中提供了多種靜態(tài)方法,可以直接調(diào)用显沈,返回類型均為 long 型软瞎,如果返回值等于 -1 代表UNSUPPORTED,表示當(dāng)前設(shè)備不支持統(tǒng)計(jì)构罗。
這里需要注意的是铜涉,通過 TrafficStats 獲取的數(shù)據(jù)在手機(jī)重啟的時候會被清空,所以遂唧,如果要對流量進(jìn)行持續(xù)的統(tǒng)計(jì)需要將數(shù)據(jù)保存到數(shù)據(jù)庫中芙代,在手機(jī)重啟時將數(shù)據(jù)讀出進(jìn)行累加即可。
驗(yàn)證手機(jī)重啟
重啟手機(jī)后盖彭,查看流量相關(guān)文件纹烹,
說明數(shù)據(jù)已被清空了。
TrafficStats 類的靜態(tài)方法如下:
static long ?getMobileRxBytes() ?//獲取通過Mobile連接收到的字節(jié)總數(shù)召边,不包含WiFi
static long ?getMobileRxPackets() ?//獲取Mobile連接收到的數(shù)據(jù)包總數(shù)
static long ?getMobileTxBytes() ?//Mobile發(fā)送的總字節(jié)數(shù)
static long ?getMobileTxPackets() ?//Mobile發(fā)送的總數(shù)據(jù)包數(shù)
static long ?getTotalRxBytes() ?//獲取總的接受字節(jié)數(shù)铺呵,包含Mobile和WiFi等
static long ?getTotalRxPackets() ?//總的接受數(shù)據(jù)包數(shù),包含Mobile和WiFi等
static long ?getTotalTxBytes() ?//總的發(fā)送字節(jié)數(shù)隧熙,包含Mobile和WiFi等
static long ?getTotalTxPackets() ?//發(fā)送的總數(shù)據(jù)包數(shù)片挂,包含Mobile和WiFi等
static long ?getUidRxBytes(int uid) ?//獲取某個程序的接受字節(jié)數(shù)
static long ?getUidTxBytes(int uid) //獲取某個程序的發(fā)送字節(jié)數(shù)
總接受流量TrafficStats.getTotalRxBytes();
總發(fā)送流量TrafficStats.getTotalTxBytes());
不包含WIFI的手機(jī)GPRS接收量TrafficStats.getMobileRxBytes());
不包含Wifi的手機(jī)GPRS發(fā)送量TrafficStats.getMobileTxBytes());
/** 獲取手機(jī)指定 UID 對應(yīng)的應(yīng)程序用通過所有網(wǎng)絡(luò)方式接收的字節(jié)流量總數(shù)(包括 wifi) */
某一個程序的總接收量TrafficStats.getUidRxBytes(Uid));
/** 獲取手機(jī)指定 UID 對應(yīng)的應(yīng)用程序通過所有網(wǎng)絡(luò)方式發(fā)送的字節(jié)流量總數(shù)(包括 wifi) */
某一個程序的總發(fā)送量TrafficStats.getUidTxBytes(Uid));
從本次開機(jī)到本次調(diào)用該接口的統(tǒng)計(jì)量。