android power_manager Análisis de gestión de energía

http://dongyulong.blog.51cto.com/1451604/512362


1. Análisis de la capa de aplicación de administración de energía de Android

 
    Android proporciona la clase android.os.PowerManager, que se utiliza para controlar la conmutación del estado de alimentación del dispositivo.
    Esta clase tiene tres funciones de interfaz:
    1. anule goToSleep (mucho tiempo);         preste atención al problema de permiso al
       obligar al dispositivo a entrar en el estado de suspensión
.
    2.newWakeLock (int flags, String tag);
       Obtener el nivel correspondiente de la
       descripción del parámetro de flags de bloqueo :
           PARTIAL_WAKE_LOCK: pantalla apagada, luz del teclado apagada
           SCREEN_DIM_WAKE_LOCK: pantalla tenue, luz del teclado apagada
           SCREEN_BRIGHT_WAKE_LOCK: pantalla brillante, luz del teclado apagada
           FULL_WAKE_LOCK: pantalla completa brillante
           ACQUIRE_CAUSES_WAKEUP: fuerza para abrir la pantalla y la luz del teclado
           ON_AFTER_RELEASE: restablece el temporizador de actividad cuando se libera el bloqueo una vez que se solicita un bloqueo
 
       Si solicita un wakelock parcial, incluso si presiona el botón de Encendido, el sistema no ingresará a Suspender. Por ejemplo,
       si solicita otros wakelock durante la reproducción de Música , presione el botón de Encendido, el sistema aún ingresará a Suspender.
    3.evitar UserActivity (mucho tiempo, cuando no hay cambios de luz booleanos);
       Se produce un evento de actividad del usuario, el dispositivo cambiará al estado de Full on, y Reset Screen off timer.
       1) En la aplicación que utiliza la función anterior, debe estar en su Manifest.xml Agregue los siguientes permisos al archivo:
           <uses-permission android: name = "android.permission.WAKE_LOCK" />
           <uses-permission android: name = "android.permission.DEVICE_POWER" />
       2) Todos los bloqueos deben estar emparejados Utilícelo, si lo solicita y no lo libera a tiempo, causará fallas en el sistema.
          Wakelock, pero no se libera a tiempo, entonces el sistema nunca puede ingresar al modo de suspensión.
 
En segundo lugar, análisis de la capa Java de Android Power Management
 
    El archivo de código principal es el siguiente:
       frameworks \ base \ core \ java \ android \ os \ PowerManager.java
       frameworks \ base \ services \ java \ com \ android \ server \ PowerManagerService.java
       frameworks \ base \ core \ java \ android \ os \ Power.java
 
    Entre ellos, PowerManagerService.java es el núcleo, PowerManager.java se proporciona para que la capa de la aplicación llame, y
    Power.java proporciona la interfaz de función subyacente para interactuar con la capa JNI. La función de la clase PowerManagerService.java
    es proporcionar las funciones de PowerManager y el funcionamiento de toda la máquina de estado de administración de energía. Hay muchas funciones y clases en él, en lo que
    respecta a las divisiones externas e internas:
    1. Hablemos primero de la alimentación externa. ¿Cómo realiza PowerManagerService la administración de energía? Luego, debemos notificarlo cuando haya un evento externo.
       Esto se debe principalmente a
       frameworks \ base \ services \ java \ com \ android \ server \ WindowManagerService.java
       Por dentro. WindowManagerService llamará al clic del usuario en la pantalla, teclas, etc. como un evento de actividad del usuario
       La función userActivity, PowerManagerService determinará el tipo de evento en userActivity para reflejar,
       Ya sea para iluminar la pantalla para proporcionar operación, o ignorarla por completo, o simplemente apagarla después de solo una luz. Llamado por WindowManagerService
       También hay gotoSleep y otras funciones para obtener el estado de energía, como screenIsOn, etc.
     2. Además, internamente, el método userActivity como interfaz externa completa principalmente las funciones a través de setPowerState. A punto de establecer
        El estado de energía del dispositivo, como cambiar la luz de fondo de la pantalla o algo así, se denomina setPowerState como parámetro. SetPowerState primero determina el siguiente
        ¿Se puede completar el estado deseado, por ejemplo, si la pantalla se va a encender, pero la pantalla está bloqueada ahora, no se puede encender, de lo contrario se puede ajustar
        Use Power.setScreenState (true) para ejecutar el controlador a través de jni para iluminar la pantalla. Y el ciclo de energía
        Se logra principalmente a través de Handler. PowerManagerService iniciará uno en init
        Controlador: puede enviar un bucle de mensajes en segundo plano para proporcionar una entrega retrasada de las tareas. Puede usar el Controlador para posponer un mensaje personalizado.
        El tiempo de ejecución de la tarea, para realizar el ciclo de la máquina de estados. Por ejemplo, tiempo de espera, después de un período de tiempo, no hay operación para oscurecer la pantalla, luego
        Después del cierre, se refleja en el código de la siguiente manera:
            En userActivity, setTimeoutLocked se usará para establecer el tiempo de espera después de llamar a setPowerState.
            Luego, en setTimeoutLocked, el siguiente estado y hora se calcularán de acuerdo con el estado actual, y luego se ajustarán después del juicio
            Use mHandler.postAtTime (mTimeoutTask, when) para publicar una TimeoutTask. Como este
            TimeoutTask se ejecutará después de cuando milisegundos. En TimeoutTask, se llama de acuerdo con el estado establecido  
            setPowerState para cambiar el estado de energía y luego establecer un nuevo estado, por ejemplo, ahora la pantalla cambia de brillante a oscura, luego
            Simplemente use setTimeoutLocked (ahora, SCREEN_OFF) para esperar a que la pantalla se apague por completo. Si esta vez ya es
            La pantalla se apaga y se considera que el ciclo de estado de tiempo de espera ha terminado.
 
     Si desea personalizarlo, por ejemplo, si necesita apagar algunos dispositivos periféricos después de que se apaga la pantalla de tiempo de espera, entonces
     Simplemente apague la pantalla en TimeoutTask y agregue el código para apagar otros dispositivos. Incluso si el nuevo estado necesita exactamente lo mismo que el original
     No es lo mismo, no debería ser difícil usar Handler. Es lógico poner el código en el lugar correcto.

Tres, análisis de capa JNI de administración de energía de Android
 
    El archivo de código principal es el siguiente:
       frameworks \ base \ core \ jni \ android_os_power.cpp
       hardware \ libhardware \ power \ power.c
 
    El código de la capa JNI está principalmente en el archivo android_os_Power.cpp, y la interacción con el kernel de Linux se realiza a través de Power.c
    Sí, la interacción entre Andriod y Kernel se realiza principalmente a través del archivo sys.
 
Cuatro, análisis de gestión de energía del kernel de Android
 
    1. El código principal se encuentra en la siguiente ubicación:
       drivers / android / power.c
 
     Las funciones de interfaz proporcionadas por Kernel son
         EXPORT_SYMBOL (android_init_suspend_lock);
         // Inicializa el bloqueo de suspensión, debes inicializar
         EXPORT_SYMBOL (android_uninit_suspend_lock) antes de usarlo ;
         // Liberar recursos relacionados con la suspensión de bloqueo
         EXPORT_SYMBOL (android_lock_suspend);
         // Solicita el bloqueo, debes llamar al desbloqueo correspondiente para liberarlo
         EXPORT_SYMBOL (android_lock_suspend_auto_expire);
         // Solicite wakelock parcial, liberará automáticamente
         EXPORT_SYMBOL (android_unlock_suspend); // Libere el bloqueo
         EXPORT_SYMBOL (android_power_wakeup); // Despierte el sistema en
         EXPORT_SYMBOL (android_register_early_suspend); // Registre el controlador de la
         suspensión tempranaEXPORT_SYMBOL_ (android_syMBOL_);
         // Cancelar el controlador de suspensión anticipada registrado
 
     Los archivos de proceso provistos para la capa de Android Framework son los siguientes:
         "/ sys / android_power / adquirir_partial_wake_lock" // Solicitar bloqueo de
         activación parcial "/ sys / android_power / adquirir_full_wake_lock" // Solicitar bloqueo de
         activación completa "/ sys / android_power / release_wake_lock" // Liberar el correspondiente Wake lock
         "/ sys / android_power / request_state"
            // Solicite cambiar el estado del sistema, ingrese al modo de espera y regrese al estado de activación dos estados
         "/ sys / android_power / state" // indique el estado actual del sistema
 
    2. La administración de energía de Android se logra principalmente a través del bloqueo Wake. En la parte inferior, las siguientes tres colas se utilizan principalmente para lograr su administración.
       Razón:
           LIST_HEAD estático (g_inactive_locks);
           LIST_HEAD estático (g_active_partial_wake_locks);
           LIST_HEAD estático (g_active_full_wake_locks);
       Todos los bloqueos inicializados se insertarán en la cola g_inactive_locks y la activación parcial activa actualmente
       El bloqueo se insertará en la cola g_active_partial_wake_locks, y el bloqueo de activación completa activa se insertará en
       En la cola g_active_full_wake_locks, todos los bloqueos de activación parcial y los bloqueos de activación completos han caducado
       Después de ser desbloqueado, se moverá a la cola inactiva y esperará la próxima llamada.
 
    3. Los pasos para usar Wake Lock en la capa Kernel son los siguientes:
       1) Llame a la función android_init_suspend_lock para inicializar un bloqueo de activación
       2) Llame a la función relevante lock_android_lock_suspend o Android_lock_suspend_auto_expire
          Solicitar bloqueo, aquí solo puede solicitar el bloqueo de activación parcial, si desea solicitar el bloqueo de activación completa, debe llamar a la carta
          Número android_lock_partial_suspend_auto_expire (la función no sale de EXPORT), este nombre es un poco
          Extraño, no te confundas con el anterior android_lock_suspend_auto_expire.
       3) Si se trata de un bloqueo de activación automático caducado, puede ignorarse; de ​​lo contrario, el bloqueo de activación correspondiente debe liberarse a tiempo.
          De lo contrario, el sistema funcionará en un estado de alto consumo de energía durante mucho tiempo.
       4) Recuerde llamar a android_uninit_suspend_lock para liberar cuando el controlador esté descargado o Wake lock ya no se use
          Recursos.
    4 、 系统 的 状态:
         USER_AWAKE, // Completo en estado
         USER_NOTIFICATION, // Controlador suspendido temprano pero CPU sigue en
         USER_SLEEP // CPU entra en modo de suspensión
 
Cinco, proceso de administración de energía de Android
 
    Después de que el sistema se enciende normalmente, entra en el estado DESPERTAR y la luz de fondo se ajustará lentamente desde el más brillante al brillo establecido por el usuario.
    temporizador de apagado de pantalla (configuración-> sonido y pantalla-> Configuración de pantalla -> Pantalla
    tiempo de espera) Comience a cronometrar, antes de que caduque el tiempo de cronometraje, si ocurre algún evento de actividad, como Toque clic
    Para el teclado presionado y otros eventos, el temporizador de apagado de la pantalla de reinicio mantendrá el sistema en estado DESPERTAR. Si hay una aplicación
    El programa aplica para el bloqueo de activación total durante este tiempo, luego el sistema también permanecerá en el estado DESPERTAR a menos que el usuario presione
    tecla de encendido. En el estado DESPERTAR, si la energía de la batería es baja o si se usa alimentación de CA, el temporizador de apagado de la pantalla está activado y seleccionado
    Mantenga la pantalla encendida mientras está conectada, la luz de fondo se verá obligada a ajustarse al estado DIM.
 
    Si el temporizador de apagado de la pantalla está activo y no hay bloqueo de activación completo o el usuario presiona la tecla de encendido, el estado del sistema será
    Se cambió a NOTIFICACIÓN y se llamó a todas las funciones registradas de g_early_suspend_handlers, generalmente la pantalla LCD
    Regístrese con el controlador de luz de fondo como tipo de suspensión temprana, también puede registrar otros controladores como suspensión temprana si es necesario, esto
    La muestra se cerrará en la primera etapa. A continuación, el sistema determinará si se ha adquirido un bloqueo de activación parcial y, de ser así, espere
    Su lanzamiento, si hay un evento de actividad del usuario en el proceso de espera, el sistema volverá inmediatamente al estado DESPERTAR;
    Si no se adquiere un bloqueo de activación parcial, el sistema llamará inmediatamente a la función pm_suspend para cerrar otros controladores relacionados
    La CPU entrará en el estado de suspensión si el sistema detecta alguna fuente de activación durante el estado de suspensión, la CPU pasará de la suspensión
    Se despierta el estado y se llama a la función de reanudación del controlador relacionado, y luego se llama inmediatamente al controlador de suspensión temprana registrado temprano
    Reanude la función, y finalmente el estado del sistema vuelve al estado DESPERTAR. Hay un problema aquí es que todas las funciones que han registrado una suspensión temprana están entrando
    Es comprensible que se llame a la primera etapa de Suspend, pero durante la reanudación, Linux llamará primero a la función de reanudación de todos los controladores.
    En este momento, la función de reanudación del controlador de suspensión temprana registrada anteriormente se llama

   Vuelva a imprimir los artículos de otras personas, ¡habrá tiempo para mejorar sobre esta base en el futuro!

Publicado 6 artículos originales · elogiado 4 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/sjc53yy/article/details/8494354
Recomendado
Clasificación