精准获取流量消耗实战

475 阅读1分钟

线上线下流量获取

问题思考

如何判断App流量消耗偏高

绝对值看不出高低

对比竞品,相同Case对比流量消耗

异常监控超过正常指标

线下流量获取方案

设置-流量管理

抓包工具:只允许本App联网

可以解决大多数问题,但是线上场景线下可能遇不到

线上流量获取方案

TrafficStats

TrafficStats:API8以上手机重启以来的流量流量统计

getUidRxBytes(int uid) 指定Uid的接收流量

getTotalTxBytes()总发送流量

无法获取某个时间段内的流量消耗

NetworkStatsManager

NetworkStatsManager:API23之后流量统计

可获取指定时间间隔内的流量信息

可获取不同网络类型下的消耗

private long getNetStats(long startTime, long endTime) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return 0;
        }
        long netDataRx = 0;//接收
        long netDataTx = 0;//发送
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String subId = telephonyManager.getSubscriberId();
        NetworkStatsManager manager = (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE);
        try {
            int uid = getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.uid;
            NetworkStats networkStats = manager.querySummary(NetworkCapabilities.TRANSPORT_WIFI, subId, startTime, endTime);
            NetworkStats.Bucket bucket = new NetworkStats.Bucket();
            while (networkStats.hasNextBucket()) {
                networkStats.getNextBucket(bucket);
                if (uid == bucket.getUid()) {
                    netDataRx += bucket.getRxBytes();
                    netDataTx += bucket.getTxBytes();
                }
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return netDataRx + netDataTx;
    }

前台后台流量获取

难题:线上反馈App后台跑流量

只获取一个时间段的值不够全面

前后台流量获取方案

145600053.png

Executors.newScheduledThreadPool(1).schedule(new Runnable() {
            @Override
            public void run() {
                long netUse = getNetStats(System.currentTimeMillis() - 30 * 1000, System.currentTimeMillis());
                //前台还是后台,利用activity生命周期来判断
            }
        }, 30, TimeUnit.SECONDS);

有一定误差,可接受范围内

结合精细化的流量异常报警针对性的解决后台跑流量