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:
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
.
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
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.
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.
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
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:
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
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
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
drivers / android / power.c
Las funciones de interfaz proporcionadas por Kernel son
EXPORT_SYMBOL (android_init_suspend_lock);
EXPORT_SYMBOL (android_init_suspend_lock);
// Inicializa el bloqueo de suspensión, debes inicializar
EXPORT_SYMBOL (android_uninit_suspend_lock) antes de usarlo ;
EXPORT_SYMBOL (android_uninit_suspend_lock) antes de usarlo ;
// Liberar recursos relacionados con la suspensión de bloqueo
EXPORT_SYMBOL (android_lock_suspend);
EXPORT_SYMBOL (android_lock_suspend);
// Solicita el bloqueo, debes llamar al desbloqueo correspondiente para liberarlo
EXPORT_SYMBOL (android_lock_suspend_auto_expire);
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_);
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"
"/ 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
"/ 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);
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
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
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!