Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Servicio SystemSuspend

En Android 9 y versiones anteriores, hay un hilo en libsuspend responsable de iniciar la suspensión del sistema. Android 10 introduce una funcionalidad equivalente en un servicio SystemSuspend HIDL. Este servicio se encuentra en la imagen del sistema y es proporcionado por la plataforma Android. La lógica de libsuspend sigue siendo en gran parte la misma, excepto que cada proceso del espacio de usuario que bloquea la suspensión del sistema necesita comunicarse con SystemSuspend.

libsuspend y libpower

En Android 10, el servicio libsuspend reemplaza libsuspend . libpower volvió a libpower para depender del servicio SystemSuspend en lugar de /sys/ power /wake[un]lock sin cambiar la API de C.

Este pseudocódigo muestra cómo implementar acquire_wake_lock y 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;
}

Hilos de ejecución

El servicio SystemSuspend realiza un seguimiento del número de wake locks emitidos con un contador de suspensión. Tiene dos hilos de ejecución:

  • El hilo principal responde a las llamadas de carpeta.
  • El sistema de control de subprocesos suspendido suspendió

Hilo principal

El hilo principal responde a las solicitudes de los clientes para asignar nuevos bloqueos de activación, aumentando / disminuyendo el contador de suspensión.

Suspender hilo

El hilo de suspensión realiza lo siguiente en un bucle:

  1. Leer de /sys/ power /wakeup_count .
  2. Adquirir el mutex. Esto asegura que el hilo de suspensión no toque el contador de suspensión mientras el hilo principal intenta incrementarlo o disminuirlo. El subproceso principal se bloquea al emitir o eliminar bloqueos de activación cuando el contador de suspensión ha llegado a cero y el subproceso de suspensión está intentando ejecutarse.
  3. Espere hasta que el contador sea igual a cero.
  4. Escriba el valor leído de /sys/ power /wakeup_count (del paso 1) en este archivo. Si la escritura falla, regrese al comienzo del ciclo.
  5. Inicie la suspensión del sistema escribiendo mem en /sys/power/ state .
  6. Suelta el mutex.

Cuando una solicitud de bloqueo de activación regresa con éxito, el hilo de suspensión se bloquea.

Figura 1. Suspender bucle de hilo

API SystemSuspend

La API SystemSuspend consta de dos interfaces. Los procesos nativos utilizan la interfaz HIDL para adquirir wake locks y la interfaz AIDL se utiliza para la comunicación entre SystemServer y SystemSuspend.

Interfaz ISystemSuspend HIDL


enum WakeLockType : uint32_t {
    PARTIAL,
    FULL
};

interface IWakeLock {
    oneway release();
};

interface ISystemSuspend {
    acquireWakeLock(WakeLockType type, string debugName)
        generates (IWakeLock lock);
};

Cada cliente que solicita un bloqueo de IWakeLock recibe una instancia de IWakeLock única. Esto es diferente de /sys/ power /wake_lock , que permite que varios clientes usen el bloqueo de /sys/ power /wake_lock con el mismo nombre. Si un cliente que tiene una instancia de IWakeLock termina, el controlador de enlace y el servicio SystemSuspend lo limpian.

Interfaz ISuspendControlService AIDL

ISuspendControlService está destinado a ser utilizado únicamente por SystemServer.


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

interface ISuspendControlService {
    boolean enableAutosuspend();
    boolean registerCallback(ISuspendCallback callback);
    boolean forceSuspend();
}

Aprovechar Android HIDL ofrece los siguientes beneficios:

  • Si un proceso de bloqueo de suspensión muere, SystemSuspend puede ser notificado.
  • El hilo responsable de la suspensión del sistema puede recibir una devolución de llamada.