Android性能测试之流量统计

达芬奇密码2018-08-09 11:25

说到流量统计,可以利用Android官方提供的TrafficStats类,详见链接,其中主要API有:

static long  getMobileRxBytes()  //获取通过Mobile接收的字节总数,不包含WiFi

static long  getMobileTxBytes()  //获取通过Mobile发送的字节总数,不包含WiFi

static long  getTotalRxBytes()  //接收的字节总数,包含MobileWiFi

static long  getTotalTxBytes()  //发送的字节总数,包含MobileWiFi

static long  getUidRxBytes(int uid)  //获取uid所代表的APP接收的字数,包含MobileWiFi

static long  getUidTxBytes(int uid)  //获取uid所代表的APP发送的字节数,包含MobileWiFi

需要注意的是,这些方静态法统计的都是从上次开机到当前时间的流量值,也就是说,每次关机后流量数据都会被清零。本阶段,主要看这两个静态方法getUidRxBytes(int uid)getUidTxBytes(int uid)。而APPuid,可以通过应用的包名得到ApplicationInfo,然后再从ApplicationInfo中提取它的uidPackageManagerApplicationInfo)。最后只要将得到的RxBytesTxBytes相加就得到APP所使用的流量了。此处,我们是以JDK的形式集成到APP中,所以可以直接用android.os.Process.myUid()来获取APPuid

1、获取流量代码

获取第三方APP的流量:

    PackageManager pm = context.getPackageManager();

    ApplicationInfo ai = pm.getApplicationInfo("com.netease.bimdesk", PackageManager.GET_ACTIVITIES);

    long rxBytes = TrafficStats.getUidRxBytes(ai.uid);

    long txBytes = TrafficStats.getUidTxBytes(ai.uid);

    long totalBytes = rxBytes + txBytes;

获取自身流量:

    int uid = android.os.Process.myUid();         

    long rxBytes = byteToMB(mNetUtils.getUidRBytes(uid));

    long txBytes = byteToMB(mNetUtils.getUidTBytes(uid));

    long totalBytes = rxBytes + txBytes;


2、区分Wifi和非WiFi中的流量使用

因为getUidRxBytes(int uid) getUidTxbytes(int uid)包括了所有网络形式的流量,即包括WiFi4g/3g。因此可以监听WiFi的变化,并利用数据库来记录WiFi/WiFi过程中该APP使用的流量。

    public class WifiStateReceiver extends BroadcastReceiver {

        @Override

        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {

                int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);

                if (wifistate == WifiManager.WIFI_STATE_DISABLED) {//关闭WiFi

                    //记录本次WiFi过程中APP消耗的流量

                } else if (wifistate == WifiManager.WIFI_STATE_ENABLED) {//打开WiFi

                    //记录本次非WiFi过程中APP消耗的流量

                }

            }

        }

    }

3、记录App关机流量使用

如上所述,getUidRxBytes(int uid)getUidTxbytes(int uid)记录的是该APP在手机启动到当前时间的流量值,而手机关机时还需要记录APP使用的流量,也可以利用数据库和广播机制来记录。

    public class ShutDownReceiver extends BroadcastReceiver{

        @Override

        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals(ACTION_SHUTDOWN)) {//关机

                 //在关机时记录APP消耗的流量

             }

        }

    }

网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者冯超授权发布。