电量优化
减少操作:您的应用是否存在可删减的多余操作?例如,是否可以缓存已下载的数据,而不是每次重新下载数据?
推迟操作:应用是否需要立即执行某项操作?例如,是否可以等到设备充电后或者Wifi连接时(通常情况下使用移动网络要比WIFI更耗电 )再将数据备份到云端?
合并操作:工作是否可以批处理,而不是多次将设备置于活动状态?比如和服务器请求不同的接口获取数据,部分接口是否可以合并为一个?
Doze测试(打盹儿)
暂停访问网络。
系统忽略PowerManager.WakeLock唤醒锁定。
标准 AlarmManager 闹钟(包括 setExact() 和 setWindow() )推迟到下一个维护期。
如果需要设置在设备处于低电耗模式时触发的闹钟,请使用API 23(6.0)提供的setAndAllowWhileIdle() (一次性闹钟,同set方法)或 setExactAndAllowWhileIdle() (比set方法设置的精度更高,同setExact)。
使用 setAlarmClock() 设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。
系统不执行 WLAN 扫描。
系统不允许运行同步适配器AbstractThreadedSyncAdapter (账号同步拉活)。
系统不允许运行 JobScheduler 。
#启用Doze
adb shell dumpsys deviceidle enable
#强制进入doze模式 (同时还需要关闭屏幕)
adb shell dumpsys deviceidle force-idle
#退出doze模式
adb shell dumpsys deviceidle unforce
#关闭doze
adb shell dumpsys deviceidle disable
#重置设备
adb shell dumpsys battery reset
#查看doze白名单
adb shell dumpsys deviceidle whitelist
Standby待机模式
应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。
当用户有一段时间未触摸应用并且应用没有以下表现, 则Android系统就会使应用进入空闲状态
l 用户明确启动应用
l 应用当前有一个进程在前台运行( 作为活动或前台服务, 或者正在由其他活动或前台服务使用) 。
l 应用生成用户可在锁定屏幕或通知栏中看到的通知。
当用户将设备插入电源时, 系统会从待机状态释放应用, 允许它们自由访问网络并执行任何待处理的作
业和同步。 如果设备长时间处于闲置状态, 系统将允许闲置应用访问网络, 频率大约每天一次。
日志采集腾讯xlog和美团logan
https://tech.meituan.com/2018/10/11/logan-open-source.html
https://tech.meituan.com/2018/02/11/logan.html
WorkManager(厂商的修改,有些不管用)
WorkManager API 是一个针对原有的 Android 后台调度 API 整合的建议替换组件
观察电量耗电情况用Battery Historian或者Energy Profiler(8.0以上看location、wake locks、alarms & Jobs。中文-唤醒锁定、闹钟、作业和位置信息请求)
网络优化
网络请求步骤
dns->解析出ip->socket(Tcp/ip)3次握手建立连接封装报文格式-》发送数据给服务器
1、dns解析优化
DNS 完整的解析流程很长,会先从本地系统缓存取,若没有就到最近的 DNS 服务器取,若没有再到主域名服务器取,每一层都有缓存,但为了域名解析的实时性,每一层缓存都有过期时间。
传统的DNS解析机制有几个缺点:
缓存时间设置得长,域名更新不及时,设置得短,大量 DNS 解析请求影响请求速度;
域名劫持,容易被中间人攻击,或被运营商劫持,把域名解析到第三方 IP 地址,据统计劫持率会达到7%;
DNS 解析过程不受控制,无法保证解析到最快的IP;
一次请求只能解析一个域名
用阿里的HTTPDNS优化
HTTPDNS的好处总结就是:
Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问
domain 解析过程,所以从根本避免了劫持问题。
DNS 解析由自己控制,可以确保根据用户所在地返回就近的 IP 地址,或根据客户端测速结果使用速度最快的IP;
一次请求可以解析多个域名。
2、连接优化(keep-alive)减少tcp、ssl握手
http1.1 以下
不支持
http1.1
串行复用请求,需要等待上个请求结束
http2.0
支持多路复用把在连接里传输的数据都封装成一个个stream,每个stream都有标识
3、数据压缩
两种数据格式是 json 和 protobuf 是二进制,比json数据更小
https://github.com/protocolbuffers/protobuf/blob/master/java/lite.md
gzip压缩
其他
1、使用webp代替png/jpg
2、不同网络的不同图片下发,如(对于原图是300x300的图片):
2/3G使用低清晰度图片:使用100X100的图片;
4G再判断信号强度为强则使用使用300X300的图片,为中等则使用200x200,信号弱则使用100x100图片;
WiFi网络:直接下发300X300的图片
3、http开启缓存 / 首页数据加入缓存
模拟网络
超时模拟 直接睡眠
弱网模拟 设置读写字节为1kb或者设置读的是sleep
断网模拟 在okhttp设置response为400
参考didi 哆啦A梦