电量优化
Doze模式
- 系统的行为
- 进入Doze后看看App有没有奔溃就可以
Standby待机模式
- 针对某个应用
处于上述模式,App会无法访问网络
解决方案
- 可以手动申请权限让用户把App加入白名单
- 或者注册电池电量变化广播,当处于充电状态时才做一些上报日志等操作(8.0以后广播要动态注册,manifest文件注册失效)
- WorkManager,不过部分国内的手机可能会不支持
电量工具
Battery Historian
AS 的 Energy Profile
- 支持8.0以上
电量优化
- 减少操作:比如网络请求,可以考虑缓存数据
- 推迟操作:比如等连接WiFi再上传日志
- 合并操作:比如服务器接口合并
网络优化
网络请求流程:
代码语言:javascript复制DNS -> IP -> Socket(Tcp/IP) -> IO发送Http报文
DNS优化: HTTPDNS
- 传统DNS解析是UDP协议
- HTTPDNS是Http协议,阿里云的HTTPDNS就是先用固定IP解析DNS,不行就再用域名解析
- 由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问domain 解析过程,所以从根本上避免了劫持问题
- DNS 解析由自己控制,可以确保根据用户所在地返回就近的 IP 地址,或根据客户端测速结果使用速度最快的IP
- 一次请求解析多个域名
Keep alive
Okhttp请求头里默认就设置为true,需要服务同意,服务端也可能会关掉
- socket可以重复使用
- Http1.1一次只处理一个请求,虽然可以复用,但如果同时请求多个连接,就需要再创建新的socket
- http2提出了多路复用,也同样是复用一个连接,不过这条连接支持同时处理多条请求,所有请求都可以在这条连接上进行。
- 多路复用把在连接里传输的数据都封装成一个个stream,每个stream都有标识,stream的发送和接收可以是乱序的,不依赖顺序,也就不会有阻塞的问题,接收端可以根据stream的标识去区分属于哪个请求,再进行数据拼接,得到最终数据。
- OKhttp3以上版本支持了http2
数据压缩
protobuf
目前最流行的两种数据格式是 json 和 protobuf,json 是字符串,protobuf 是二进制,即使用各种压缩算法压缩后,protobuf 仍会比 json 小,数据量上 protobuf 有优势,序列化速度 protobuf 也有一些优势。
- 需要服务端也支持
- AS上面可以安装一个插件:Protocol Buffer Editor
- 然后需要依赖Google官方的 javalite依赖
- 如果要编译时自动将proto文件转成Java,需要安装Google的gradle插件protobuf-gradle-plugin
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.13'
apply plugin: 'com.google.protobuf'
implementation 'com.google.protobuf:protobuf-javalite:3.11.0'
gzip
http可以对内容body部分编码,OKhttp中已经加了请求头("Accept-Encoding", "gzip")
,如果服务器支持,并且返回内容响应头里有Content-Encodin:gzip
,OKhttp就会帮我们解压
- 需要服务器支持
其他优化
1、使用webp代替png/jpg
2、不同网络的不同图片下发,如(对于原图是300x300的图片):
- 2/3G使用低清晰度图片:使用100X100的图片;
- 4G再判断信号强度为强则使用使用300X300的图片,为中等则使用200x200,信号弱则使用100x100图片;
- 这个需要和服务端合作,客户端可以在请求头里面加入当前用户的手机网络状态
WiFi网络:直接下发300X300的图片
3、http开启缓存 / 首页数据加入缓存
作者介绍
中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机
越努力越幸运,加油