No Android 9 e versões anteriores, há uma linha de execução em libsuspend
  responsável por iniciar a suspensão do sistema. O Android 10
  introduz uma funcionalidade equivalente em um serviço SystemSuspend HIDL.
  Esse serviço está localizado na imagem do sistema e é oferecido pela plataforma Android.
  A lógica de libsuspend permanece praticamente a mesma, exceto que todo processo
  do espaço do usuário que bloqueia a suspensão do sistema precisa se comunicar com o SystemSuspend.
libsuspend e libpower
No Android 10, o serviço SystemSuspend substitui
  libsuspend. O libpower foi reimplementado para depender do serviço SystemSuspend em vez de /sys/power/wake[un]lock sem mudar a API C.
Este pseudocódigo mostra como implementar acquire_wake_lock
  e release_wake_lock.
static std::unordered_map<std::string, sp<IWakeLock>> gWakeLockMap;
int acquire_wake_lock(int, const char* id) {
    ...
    if (!gWakeLockMap[id]) {
        gWakeLockMap[id] = suspendService->acquireWakeLock(WakeLockType::PARTIAL, id);
    }
    ...
    return 0;
}
int release_wake_lock(const char* id) {
    ...
    if (gWakeLockMap[id]) {
        auto ret = gWakeLockMap[id]->release();
        gWakeLockMap[id].clear();
        return 0;
    }
    ...
    return -1;
}
Linhas de execução
O serviço SystemSuspend rastreia o número de bloqueios de despertar emitidos com um contador de suspensão. Ele tem duas linhas de execução:
- A linha de execução principal responde às chamadas de vinculação.
- A linha de execução suspend controla a suspensão do sistema.
Linha de execução principal
A linha de execução principal responde às solicitações dos clientes para alocar novos bloqueios de despertar, aumentando/diminuindo o contador de suspensão.
Suspender conversa
A linha de execução de suspensão faz o seguinte em um loop:
- Ler em /sys/power/wakeup_count.
- Adquira o mutex. Isso garante que a linha de execução de suspensão não toque no contador de suspensão enquanto a linha de execução principal tenta incrementá-lo ou decrementá-lo. A linha de execução principal é bloqueada ao emitir ou remover bloqueios de despertar quando o contador de suspensão chega a zero e a linha de execução suspend tenta ser executada.
- Aguarde até que o contador seja igual a zero.
- Grave o valor lido de /sys/power /wakeup_count(da etapa 1) nesse arquivo. Se a gravação falhar, volte ao início do loop.
- Para iniciar a suspensão do sistema, escreva memem/sys/power/state.
- Libere o mutex.
Quando uma solicitação de bloqueio de despertar é retornada com sucesso, a linha de execução de suspensão é bloqueada.
 
  API SystemSuspend
A API SystemSuspend consiste em duas interfaces. A interface HIDL é usada por processos nativos para adquirir bloqueios de despertar, e a interface AIDL é usada para comunicação entre SystemServer e SystemSuspend.
Interface HIDL ISystemSuspend
enum WakeLockType : uint32_t {
    PARTIAL,
    FULL
};
interface IWakeLock {
    oneway release();
};
interface ISystemSuspend {
    acquireWakeLock(WakeLockType type, string debugName)
        generates (IWakeLock lock);
};
Cada cliente que solicita um wake lock recebe uma instância IWakeLock exclusiva. Isso é diferente de
  /sys/power/wake_lock, que permite que vários
  clientes usem o bloqueio de despertar com o mesmo nome. Se um cliente que tem uma instância
  IWakeLock for encerrado, o driver de vinculação e o
  serviço SystemSuspend vão limpar a instância.
Interface AIDL ISuspendControlService
ISuspendControlService foi projetado para ser usado apenas pelo SystemServer.
interface ISuspendCallback {
     void notifyWakeup(boolean success);
}
interface ISuspendControlService {
    boolean enableAutosuspend();
    boolean registerCallback(ISuspendCallback callback);
    boolean forceSuspend();
}
Aproveitar a HIDL do Android oferece os seguintes benefícios:
- Se um processo de bloqueio de suspensão for encerrado, o SystemSuspend poderá ser notificado.
- A linha de execução responsável pela suspensão do sistema pode receber um callback.
