网络优化的主要手段有三种:
第一种是通过抓包工具找到我们网络请求耗时的地方,然后进行针对性的改进。
第二种是通过将用户的网络请求信息打印到日志,然后我们远程获取这些用户的日志来定位到具体哪些请求耗时高,这样做的好处是我们不用自己复现问题了。
第三种是将网络请求的内容缓存下来,避免用户重复请求后响应慢。
这里我介绍下Fiddler抓包工具+Android Studio+夜神模拟器 的使用方法
Fiddler抓包工具设置
然后下载一个Android模拟器,比如夜神模拟器,然后配置它的网络
夜深模拟器经过以上配置后,在夜深模拟器上安装的APP的任何网络请求都会经过Fiddler
点击统计,会看到网络请求的详细信息!!!
断点调试功能:
以修改服务器响应给APP的内容为例讲解步骤:
1.为了调试将网络超时时间延长
2.设置断点
3.将设置改为之后响应,意思是在断点之后响应
4.点击发送网络请求
5.按照下图依次操作
6.在Android Studio的打印的返回网页的内容中看到了我们刚才添加的内容!!!
过滤域名功能
弱网测试功能
提示:记得把断点清掉
======================================================
线上流量获取方案:
解决的问题:通过将用户的网络请求信息打印到日志,然后我们远程获取这些用户的日志来定位到具体哪些请求耗时高,这样我们就不用自己复现问题了。
1.先申请权限
专门设置一个Service,每隔一段时间抓取一次当前APP的网络使用情况,把这些信息写入日志,并上传到服务器
以下是APP获取某个时间段发送流量或者接收流量数据大小的代码:
private void getNetStates(long startTime,long endTime) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
return;
}
long netDataRx = 0; //接收到的字节总数
long netDataTx = 0; //发送的字节总数
//获取到手机服务
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(
Context.TELEPHONY_SERVICE);
//获取到手机卡的ID
String subscriberId = telephonyManager.getSubscriberId();
//获取到网络服务管理者
NetworkStatsManager manager = (NetworkStatsManager) getSystemService
(Context.NETWORK_STATS_SERVICE);
NetworkStats networkStats = null;
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
try {
//获取到某个时间段所有应用的某一种模式下的流量统计
networkStats = manager.querySummary(
NetworkCapabilities.TRANSPORT_WIFI, subscriberId, startTime, endTime);
} catch (Exception e) {
e.printStackTrace();
}
if(networkStats == null){
return;
}
while (networkStats.hasNextBucket()){
networkStats.getNextBucket(bucket);
int uid = getUid();
//如果为true 就是当前应用的流量数据
if(uid == bucket.getUid()){
netDataRx += bucket.getRxBytes();
netDataTx += bucket.getTxBytes();
}
}
Log.e("APP的流量使用情况",netDataRx+"..."+netDataTx);
}
/**
* 获取UID
* @return
*/
public int getUid(){
PackageManager packageManager = getPackageManager();
//获取到应用的信息类
try {
@SuppressWarnings("WrongConstant") ApplicationInfo applicationInfo = packageManager.
getApplicationInfo(getPackageName(),PackageManager.GET_ACTIVITIES);
return applicationInfo.uid;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
也可以在统计信息里面加入这段流量是APP处于前台发生的,还是处于后台发生的
但是因为用户手机的前后台切换不固定,会导致我们统计的信息也不准确。
============================================================================
数据缓存可以利用OkHttp的缓存接口,
=======================================================================
======================================================