【Android】Notas de estudo sobre otimização de bateria do APP

Razões para otimização de energia

A otimização da bateria é muito importante no desenvolvimento do Android pelos seguintes motivos:

experiência de usuário:

A duração da bateria é um dos fatores aos quais os usuários prestam muita atenção ao usar dispositivos móveis. Ao realizar a otimização de energia, a vida útil da bateria do dispositivo pode ser estendida, permitindo que os usuários usem o dispositivo por um longo período de tempo sem precisar recarregar com frequência. Isso melhorará muito a satisfação do usuário e a experiência geral.

Desempenho do equipamento:

A duração da bateria de um dispositivo móvel está diretamente relacionada ao desempenho do dispositivo. Ele fornece melhor desempenho e capacidade de resposta quando a bateria do dispositivo está totalmente carregada. No entanto, quando a carga da bateria está baixa, para prolongar a vida útil da bateria, o sistema pode reduzir o desempenho do dispositivo, o que afetará a eficiência operacional do aplicativo e a experiência do usuário. Ao realizar a otimização de energia, os ajustes do sistema para o desempenho do dispositivo podem ser minimizados para garantir que os aplicativos possam fornecer um bom desempenho em vários estados de energia.

utilização de recursos:

A bateria é um dos recursos importantes de um dispositivo móvel e é limitada. Ao executar a otimização de energia, os recursos da bateria podem ser razoavelmente gerenciados e utilizados para evitar que os aplicativos consumam muita energia em segundo plano, reduzindo assim o desperdício desnecessário de energia. Isso é de grande importância para o uso a longo prazo de equipamentos e proteção ambiental.

requisitos:

A atualização da versão do sistema Android geralmente introduz novas regras e restrições de otimização de bateria, exigindo que os desenvolvedores de aplicativos as cumpram. Por exemplo, o Android 6.0 (Marshmallow) introduziu o Modo Soneca e o App Standby, recursos que reduzem o consumo de energia limitando a atividade do app em segundo plano. Para garantir que o aplicativo funcione normalmente e atenda às especificações da nova versão do sistema, a otimização de energia é necessária.

Doze modo de baixo consumo de energia e modo de espera StandBy

Quando o usuário não usa o dispositivo há muito tempo, 低电耗模式会延迟应用的后台 CPU 和网络活动,从 而降低耗电量。应用待机模式会延迟用户近期未与之交互的应用的后台网络活动.

Doze modo de baixo consumo

Se o dispositivo 未充电、屏幕熄灭、让设备在一段时间内保持不活动状态, então o dispositivo entrará no modo Doze. No modo Doze, o sistema tentará 限制应用访问占用大量网络和 CPU 资源的服务economizar energia. Será 阻止应用访问网络, e será 延迟其作业、同步和标准闹钟.

Cochilar é um cochilo em chinês, portanto 系统会定期退出cochile por um curto período de tempo para permitir que o aplicativo conclua suas atividades atrasadas. Durante esse período de manutenção, todas as sincronizações, trabalhos e alarmes pendentes serão executados e os aplicativos terão acesso à rede permitido.

Assim que o usuário ativar o dispositivo movendo-o, ligando a tela ou conectando-o a um carregador, o sistema irá reiniciar 立即退出低电耗模式e todos os aplicativos retomarão a atividade normal.

Durante o modo Soneca, os aplicativos estão sujeitos às seguintes restrições:

1. 暂停访问网络

2. O sistema ignora PowerManager.WakeLockwake locks.

3. Padrão AlarmManager 闹钟(incluindo setExact() e setWindow()) 推迟到下一个维护期.
Se você precisar definir um despertador que seja acionado quando o dispositivo estiver no modo de baixo consumo de energia, use API 23 (6.0) setAndAllowWhileIdle() (despertador único, igual ao método set) ou setExactAndAllowWhileIdle() (precisão maior
que , o mesmo que setExact ).
Os alarmes definidos com o uso setAlarmClock() continuarão a disparar normalmente e o sistema sairá do Modo Soneca pouco antes de esses alarmes dispararem
.

4. Sistema 不执行 WLAN 扫描.

5. Sistema 不允许运行同步适配器AbstractThreadedSyncAdapter (pull de sincronização de conta ao vivo).

6. Sistema 不允许运行 JobScheduler.

Modo de espera

Modo de espera do aplicativo 允许系统判定应用在用户未主动使用它时是否处于待机状态. Quando o usuário não toca no aplicativo por um período de tempo e o aplicativo não apresenta o seguinte desempenho, o sistema Android fará com que o aplicativo entre no estado ocioso

1. 应用当前有一个进程在前台运行(como uma atividade ou serviço de primeiro plano, ou está sendo usado por outra atividade ou serviço de primeiro plano).

2. 应用生成用户可在锁定屏幕或通知栏中看到的通知

Quando o usuário conecta o dispositivo a uma fonte de energia, o sistema libera os aplicativos do modo de espera, permitindo que eles acessem livremente a rede e executem trabalhos e sincronizações pendentes.

Se o dispositivo ficar ocioso por um longo período de tempo, o sistema permitirá que aplicativos ociosos acessem a rede aproximadamente uma vez por dia.

lista de permissões

O sistema fornece uma lista de permissões configurável de aplicativos parcialmente isentos das otimizações Doze e App Standby. Os aplicativos da lista de permissões podem usar a rede e reter bloqueios de ativação parciais durante Doze e App Standby. No entanto, os aplicativos da lista de permissões ainda estarão sujeitos a outras restrições, assim como outros aplicativos. Por exemplo, trabalhos e sincronizações para aplicativos da lista de permissões são atrasados ​​(em dispositivos 6.0 e anteriores) e seus alarmes regulares do AlarmManager não disparam. Um aplicativo pode chamar PowerManager.isIgnoringBatteryOptimizations()para verificar se o aplicativo está atualmente na lista de permissões de isenção.

A lista de permissões pode ser configurada manualmente em Otimização da bateria em Configurações. Além disso, o sistema fornece métodos para aplicativos solicitarem que o usuário coloque na lista de permissões

Os aplicativos podem disparar ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGSIntenções que levam os usuários diretamente à Otimização da bateria, onde eles adicionam o aplicativo.

startActivity(new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS));

Aplicativos com a permissão REQUEST_IGNORE_BATTERY_OPTIMIZATIONS podem acionar uma caixa de diálogo do sistema para permitir que o usuário adicione o aplicativo à lista de permissões diretamente sem acessar as Configurações. Esses aplicativos ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
acionarão a caixa de diálogo disparando um Intent.

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" />
Teste em Soneca
#启用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 wh
Teste em App Standby
#设置断开充电
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

Monitore o nível da bateria e o status de carregamento

Obter status de carregamento
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;
Log.e(TAG, "isCharging: " + isCharging + " usbCharge: " + usbCharge + " acCharge:" + acCharge);
Monitorar alterações no estado de carga
//注册广播
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); //电量从低变回高

powerConnectionReceiver = new PowerConnectionReceiver();
registerReceiver(powerConnectionReceiver, ifilter);

public class PowerConnectionReceiver extends BroadcastReceiver {
    
    
  @Override
  public void onReceive(Context context, Intent intent) {
    
    
    if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
    
    
        Toast.makeText(context, "充电状态:CONNECTED", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
    
    
        Toast.makeText(context, "充电状态:DISCONNECTED", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
    
    
        Toast.makeText(context, "电量过低", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals(Intent.ACTION_BATTERY_OKAY)) {
    
    
        Toast.makeText(context, "电量从低变回高", Toast.LENGTH_SHORT).show();
    }
  }
}
Perfil de Energia

Em dispositivos Android 8.0+, use o Energy Profiler para ver onde os aplicativos estão usando energia desnecessária. O EnergyProfiler monitora o uso de CPU, rádio de rede e sensor de GPS e fornece uma exibição visual de quanta energia cada um desses componentes está consumindo. Também mostra o número de ocorrências de eventos do sistema (wake locks, alarmes, trabalhos e solicitações de localização) que podem afetar o consumo de energia.

Acho que você gosta

Origin blog.csdn.net/qq_43358469/article/details/132027679
Recomendado
Clasificación