文档章节

Android性能优化---移动端网络优化

iSnowFlake
 iSnowFlake
发布于 2015/10/21 11:34
字数 1129
阅读 102
收藏 7
点赞 0
评论 0

如果你的英文足够好:官方一序列的视频 https://www.youtube.com/watch?v=7lxVqqWwTb0&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

 

 

介绍下针对移动端的网络优化,不限于 Android,同样适用于 iOS 和 H5。

 

一个网络请求可以简单分为连接服务器 -> 获取数据两个部分。

其中连接服务器前还包括 DNS 解析的过程;获取数据后可能会对数据进行缓存。

 

一、连接服务器优化策略

1. 不用域名,用 IP 直连

省去 DNS 解析过程,DNS 全名 Domain Name System,解析意指根据域名得到其对应的 IP 地址。

如 www.codekk.com 的域名解析结果就是 104.236.147.76。

 

首次域名解析一般需要几百毫秒,可通过直接向 IP 而非域名请求,节省掉这部分时间,同时可以预防域名劫持等带来的风险。

 

当然为了安全和扩展考虑,这个 IP 可能是一个动态更新的 IP 列表,并在 IP 不可用情况下通过域名访问。

 

2. 服务器合理部署

服务器多运营商多地部署,一般至少含三大运营商、南中北三地部署。

 

配合上面说到的动态 IP 列表,支持优先级,每次根据地域、网络类型等选择最优的服务器 IP 进行连接。

 

对于服务器端还可以调优服务器的 TCP 拥塞窗口大小、重传超时时间(RTO)、最大传输单元(MTU)等。

 

二、获取数据优化策略

1. 连接复用

节省连接建立时间,如开启 keep-alive。

 

对于 Android 来说默认情况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:http://www.trinea.cn/android/android-http-api-compare/

 

2. 请求合并

即将多个请求合并为一个进行请求,比较常见的就是网页中的 CSS Image Sprites。

如果某个页面内请求过多,也可以考虑做一定的请求合并。

 

3. 减小请求数据大小

(1) 对于 POST 请求,Body 可以做 Gzip 压缩,如日志。

 

(2) 对请求头进行压缩

这个 Http 1.1 不支持,SPDY 及 Http 2.0 支持。

Http 1.1 可以通过服务端对前一个请求的请求头进行缓存,后面相同请求头用 md5 之类的 id 来表示即可。

 

4. CDN 缓存静态资源

缓存常见的图片、JS、CSS 等静态资源。

 

5. 减小返回数据大小

(1) 压缩

一般 API 数据使用 Gzip 压缩,下图是之前测试的 Gzip 压缩前后对比图。

 

(2) 精简数据格式

如 JSON 代替 XML,WebP 代替其他图片格式,回复 20 查看关于 WebP 的介绍。

 

(3) 对于不同的设备不同网络返回不同的内容

如不同分辨率图片大小。

 

(4) 增量更新

需要数据更新时,可考虑增量更新。如常见的服务端进行 bsdiff,客户端进行 bspatch。

 

(5) 大文件下载

支持断点续传,并缓存 Http Resonse 的 ETag 标识,下次请求时带上,从而确定是否数据改变过,未改变则直接返回 304。

 

6. 数据缓存

缓存获取到的数据,在一定的有效时间内再次请求可以直接从缓存读取数据。

 

关于 Http 缓存规则 Grumoon 在 Volley 源码解析最后杂谈中有详细介绍,可见:

http://codekk.com/blogs/detail/54cfab086c4761e5001b2542

 

三、其他优化手段

这类优化方式在性能优化系列总篇中已经有过完整介绍

1. 预取

包括预连接、预取数据。

 

2. 分优先级、延迟部分请求

将不重要的请求延迟,这样既可以削峰减少并发、又可以和后面类似的请求做合并。

 

3. 多连接

对于较大文件,如大图片、文件下载可考虑多连接。

需要控制请求的最大并发量,毕竟移动端网络受限。

 

四、监控

优化需要通过数据对比才能看出效果,所以监控系统必不可少,通过前后端的数据监控确定调优效果。

这一切做起来不简单,推荐android 使用retrofit2.0. https://github.com/AnyLifeZLB/Retrofit2.0_Demo

 

 

 

回复 perf 可查看 性能优化方式、资料汇总

 

------------------------------------------

codeKK 专注于开源分享、源码解析

长按下面二维码或搜索公众号 codekk 关注

------------------------------------------

 

© 著作权归作者所有

共有 人打赏支持
iSnowFlake
粉丝 32
博文 80
码字总数 53599
作品 0
深圳
高级程序员
Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

腾讯技术分享:Android版手机QQ的缓存监控与优化实践

本文内容整理自公众号腾讯Bugly,感谢原作者的分享。 1、问题背景 对于Android应用来说,内存向来是比较重要的性能指标。内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验。...

JackJiang2011 ⋅ 04/08 ⋅ 0

Android单个字体从上到下的透明渐变(应用场景:展开全文的最后一行)

学习自 https://blog.csdn.net/ly1414725328/article/details/50034747 看见开源中国一个很有意思的功能 思路 通过一个渐变的view去覆盖这些字。 最正确思路 web端实现。我简单分析了下,开源...

qq_36523667 ⋅ 05/02 ⋅ 0

揭秘支付宝中的深度学习引擎:xNN

导读:本文介绍支付宝App中的深度学习引擎——xNN。xNN通过模型和计算框架两个方面的优化,解决了深度学习在移动端落地的一系列问题。xNN的模型压缩工具 (xqueeze) 在业务模型上实现了近50倍...

技术边城 ⋅ 05/15 ⋅ 0

Android性能分析工具简介

在Android项目开发工程中,功能开发只是其中的一部分,更多的时候是优化,优化除了个人的良好习惯,往往还需要借助第三方工具。本文罗列Android优化过程中的一些常用工具借助这些工具,可以很...

code_xzh ⋅ 05/02 ⋅ 0

Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

Android性能优化:这是一份详细的布局优化 指南(含、、)

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢。 目录 /** 实例说明:在上述例子,在布局B中 通过标签引用布局C 此时:布局层级为 = RelativeLa...

Carson_Ho ⋅ 05/14 ⋅ 0

坐标上海或深圳:OPPO诚聘Linux内核和Android系统工程师

OPPO 是更多年轻人选择的拍照手机品牌。 十年来,OPPO 专注于手机拍照领域的技术创新,开创了手机自拍美颜时代,先后首发了前置 500 万像素和 1600 万像素的拍照手机,创造性地推出了全球首个...

jus3ve ⋅ 05/14 ⋅ 0

Android性能优化:那些不可忽略的绘制优化

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的绘制优化,希望你们会喜欢。 目录 // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除 优化方案2:移除 控件...

Carson_Ho ⋅ 05/21 ⋅ 0

React-native 拆包

react-native拆包 拆包是React-Native项目不得不面临的一个重要技术门槛。 为什么要拆包? bundle文件过大: 一个Hellworld的App,如果使用0.53RN 官方命令react-native bundle打包出来的JSB...

乘着风 ⋅ 前天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 23分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 24分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 28分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 40分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 45分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 55分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 59分钟前 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 今天 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 今天 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部