线上线下流量获取
问题思考
如何判断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后台跑流量
只获取一个时间段的值不够全面
前后台流量获取方案
Executors.newScheduledThreadPool(1).schedule(new Runnable() {
@Override
public void run() {
long netUse = getNetStats(System.currentTimeMillis() - 30 * 1000, System.currentTimeMillis());
//前台还是后台,利用activity生命周期来判断
}
}, 30, TimeUnit.SECONDS);
有一定误差,可接受范围内
结合精细化的流量异常报警针对性的解决后台跑流量