电量优化
- 减少操作:如缓存数据
- 延迟操作:等待设备充电或者wifi链接时操作。(最好是从厂家配合,)
- 合并操作:如请求服务器时接口合并
Doze低耗电模式
- 低耗电模式会延迟后台cpu和网络活动;定期打盹一会儿,让应用完成延迟活动
- 未充电、屏幕熄灭、一段时间内保持不活动状态 就会进入Doze模式
- 低电耗模式下,限制:
暂停访问网络
系统忽略PowerManager.WakeLock唤醒锁定
标准 AlarmManager 闹钟触发闹钟方法暂用不到(有方法,但不保险)
系统不执行 WLAN 扫描
系统不允许运行同步适配器AbstractThreadedSyncAdapter (账号同步拉活)
系统不允许运行 JobScheduler
StandardBy 待机模式
当用户有一段时间未触摸应用并且应用没有以下表现,则Android系统就会使应用进入空闲状态
- app有前台进程
- app在锁屏界面或者通知栏有通知
白名单解决办法
系统提供了一个可配置的白名单,将部分免除低电耗模式和应用待机模式优化的应用列入其中,app可以使用网络并保留部分唤醒锁定,其他限制任然受限
PowerManager.isIgnoringBatteryOptimizations() 来检查应用当前是否在豁免白名单中。
对话框方式,跳转方式意义不大
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:"+getPackageName()));
startActivity(intent);
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
WorkManager
- 是一个针对原有的 Android 后台调度 API 整合的建议替换组件(android23以上有效)
可以处理比如充电时运行,电量不足不允许,但是在国内因厂家限制,此方法意义不大。 - 建议走厂家通道,按厂家要求申请白名单
电量数据
以前有Battery Historian 等其他工具;8.0以上用energy profiler 即可,看下cpu的情况和各种电量模式下的状态些,可以选中区域看
网络优化
DNS 优化
- 因dns 转发会有不确定性
- 用Httpdns:建议接入阿里HttpDNS
- Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问
- domain 解析过程,所以从根本避免了劫持问题
- DNS 解析由自己控制,可以确保根据用户所在地返回就近的 IP 地址,或根据客户端测速结果使用速度最快的IP
- 一次请求可以解析多个域名
连接优化
keep-alive 保持socket的长链接
http1.1上面同时发送多个请求:串行可以共用,并行还是得走3次握手
http2 用多路复用解决了并行问题
okhttp3以上支持http2
需要服务端配合,如果服务端不开启keep-alive 无用
数据压缩
- protobuf
用二进制的方式序列号;数据量比json 测试byte数组要小一半以上的量;序列化速度也有优势(不支持delphi) - 压缩的方式
自己用的zip方式,可以在okhttp中interapte
其他
- 使用webp代替png/jpg:as里面就可以转
- 不同网络情况用不同的图片
- http缓存、首页数据缓存
- 日志系统接入,自己接入的百度移动统计
- gradle 如果找不到 对应lib
可以看下是否确实pom文件,然后官网看库里面哪个版本有则加上
在gradle要处理 排除和引入
参考位置 C:\Users\xx.gradle\caches\modules-2\files-2.1
具体:
gradle中
implementation('com.xx.xx:xxx:1.1.1'){
transitive true
exclude group:'com.xx.xx',module:'yyy'
}
implementation 'com.xx.xx:yyy:1.2.1'
摘要:
非重点,仅仅记录
- 在低电耗模式下测试
#启用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
- 在应用待机模式下测试
#设置断开充电
adb shell dumpsys battery unplug
#进入standby
adb shell am set-inactive <packageName> true
#退出standby
adb shell am set-inactive <packageName> false
#查看是否处于standby
adb shell am get-inactive <packageName>
#重置
adb shell dumpsys battery reset
- 根据电量和充电状态操作
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = registerReceiver(null, ifilter);
// 是否正在充电
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
// 什么方式充电?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
//usb
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
//充电器
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
- 监控充电状态变化
//注册广播
IntentFilter ifilter = new IntentFilter();
//充电状态 ifilter.addAction(Intent.ACTION_POWER_CONNECTED);
ifilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
//电量显著变化
ifilter.addAction(Intent.ACTION_BATTERY_LOW);
//电量不足
ifilter.addAction(Intent.ACTION_BATTERY_OKAY);
//电量从低变回高
xxReceiver = new xxReceiver();
registerReceiver(xxReceiver, ifilter)
public class xxReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
...各种状态
}