[TOC]
- 网络优化需要从多个维度、多个方面展开,并建立合适的数据指标来反应当前的网络的各项特征;
- 多维度具体包括:流量消耗、弱网质量、网络稳定性以及应用性能等方面;
- 网络流量质量提升的同时会减少手机电量的消耗,减少公司的成本。
- 减少整个应用的流量消耗,比如采用更小的数据格式,压缩数据传输,选择更小的图片;
- 准确统计消耗的流量,网络类型,前后台等数据指标来减少网络流量消耗。
- 提高网络请求速度,提高网络请求成功率,提供网络缓存,减少网络请求提升用户体验,更小的数据格式在减少流量消耗的同时提升弱网下的体验;
- 准确统计网络请求的各个维度,提升网络质量。
在应用启动过程中开启高级选项:
run-->edit configurations;profiling--> 勾选enable advanced profiling;apply-->profile模式部署。
CharlesWireshark
FiddlerTcpDump
- 连接
Android与Chrome; - 可以查看组件布局,网络抓包,
sp存储,数据库存储
使用步骤:
①引入stetho:
implementation 'com.facebook.stetho:stetho:1.5.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'②在Application中初始化
@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
Stetho.initializeWithDefaults(context);
}③OKHttp中添加拦截器
private OkHttp() {
client = new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.retryOnConnectionFailure(true).build();
}④运行程序并在Chrome地址栏输入chrome://inspect/#devices中查看
TrafficStats.getUidRxBytes(int uid);TrafficStats.getUidTxBytes(int uid);TrafficStats.getTotalRxBytes();TrafficStats.getTotalTxBytes();
private int getUid() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(getPackageName(), 0);
return ai.uid;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return 0;
}
//流量统计方式一(从开机到现在)
private void statistics() {
TrafficStats.getUidRxBytes(getUid());
TrafficStats.getUidTxBytes(getUid());
TrafficStats.getTotalRxBytes();
}方式二:
//流量统计方式二(从开机到现在)
private long[] getStat(int uid) {
String line, line2;
long[] stats = new long[2];
try {
File fileSnd = new File("/proc/uid_stat/" + uid + "tcp_snd");
File fileRcv = new File("/proc/uid_stat/" + uid + "tcp_rcv");
BufferedReader br1 = new BufferedReader(new FileReader(fileSnd));
BufferedReader br2 = new BufferedReader(new FileReader(fileRcv));
while ((line = br1.readLine()) != null && (line2 = br2.readLine()) != null) {
stats[0] = Long.parseLong(line);
stats[1] = Long.parseLong(line2);
}
br1.close();
br2.close();
}catch (Exception e) {
e.printStackTrace();
}
return stats;
}还可以获取不同网络类型下的流量。
- 选用合适的图片格式;
- 不同清晰度对空间的大小影响很大;
- 合适的位置展示合适大小的图片;
- 减少序列化数据大小;
JSON与XML为了提高可读性,在文件中加入了大量的符号,空格等字符,占用空间,可以采用protocol buffers,nano-proto-buffer以及flatbuffer等来替换。
Protocol Buffers:强大、灵活,但是对内存的消耗会比较大,并不是移动端上的最佳选择;Nano-Proto-Buffers:基于Protocol,为移动端做了特殊的优化,代码执行效率更高,内存使用效率更佳;FlatBuffers:这个开源库最开始是由Google研发的,专注于提供更优秀的性能。
- 存在重复的属性名称 --> 减少重复的属性名;
GZIP不能进行有效的压缩 --> 使得GZIP的压缩效率更高;- 同样的数据类型可以批量优化。
- 缓存数据;
- 不要采用轮询的方式获取数据;
- 数据压缩;
- 数据增量更新;
- 请求打包,减少请求头信息。
DNS解析的失败率占联网失败中很大一种,而且首次域名解析一般需要几百毫秒;- 采用
IP直连省去DNS解析过程,节省这部分时间; - 采用
HttpDNS,避免Local DNS造成的域名劫持和跨网访问问题,解决域名解析异常带来的困扰。
- 采用高版本的
HTTP; - 采用
quic协议,比如google的grpc; - 采用
socket长连,保证数据实时收发。
- 选取合适的图片格式,不仅减少了流量,也提高了网络传输的成功率;
- 选取缩略图,图片越小传输速度越快,成功率越高;
- 分片上传,根据网络情况动态调整分片大小,失败重传。
- 打包网络请求,监控网络状态,在
WIFI下预取; - 区分数据重要程度,低优先级数据在
WIFI网络下上传; - 设置重试次数,减小服务器压力;
- 资源部署
CDN; - 弱网情况下不显示图片。





