Existe otro tipo de servicio, en este caso, necesario para el funcionamiento normal de cada aplicación. Hay aplicaciones tipo Whatsapp que necesita realizar tareas en segundo plano para lanzar notificaciones cuando se detecta un evento.
Estos servicios se llaman servicios definidos por aplicaciones y se encarga el desarrollador de definirlos en su aplicación. Para el objetivo de este proyecto son necesarios únicamente los servicios del sistema, por lo que nos centraremos en ellos a partir de ahora.
Capítulo 3
Estadísticas de batería
Llevo obteniendo resultados desde hace tiempo, pero aún no sé cómo llegué a ellos. Carl Friedrich Gauss
Resumen: En este capítulo, en primer lugar, se indican los ficheros que participan en el cálculo del consumo de la batería. Posteriormente, se explican los métodos de obtención de datos, los consumos monitorizados y la realización del cálculo del consumo. Finalmente, se presentan herramientas que facilitan la visualización del consumo.
3.1.
Situación actual
La situación actual del cálculo de consumo de batería es un terreno poco transitado, es decir, hay muy poca documentación por parte de Android de como se realiza internamente en el terminal. A continuación se explica qué componente se encarga de almacenar datos relacionados con el consumo, qué datos se están monitorizando, qué componente obtiene y de dónde esos datos y finalmente cómo se calcula el consumo.
3.2.
BatteryStats
Como se mencionó anteriormente en 2.2.1.1, el servicio del sistema encargado de las estadísticas de la batería es BatteryStats. Este servicio utiliza una serie de ficheros necesarios para el cálculo del consumo.
BatteryStats.java: Clase abstracta que define todos los timers o contadores de tiempo que se encargarán de contabilizar el tiempo que ha estado corriendo cada componente que ha consumido batería. Estostimers son los encargados de contar el tiempo que el Wi-Fi, Flash o cualquier otro tipo de componente del sistema ha estado encendido para calcular posteriormente su consumo. Está situado en frameworks/base/core/java/android/os.
BatteryStatsImpl.java: Implementación de BatteryStats.java. Situado en /frameworks/base/core/java/com/android/internal/os.
10 Capítulo 3.Estadísticas de batería
BatteryStatsService.java: Servicio del sistema encargado de recibir eventos. Estos eventos activan o desactivan los timers definidos en BatteryStats.java. De esta forma, se puede contabilizar el tiempo que un componente del sistema ha estado activo. Dichos eventos son enviados por otros servicios del sistema como por ejemplo el de cámara o Wi-Fi. Situado en /frameworks/base/services/core/java/com/android/server/am.
BatteryStatsHelper.java: Encargado de procesar los datos obtenidos a través de BatteryStatsService.java y almacenados por BatteryStats.java, para calcular el consumo por aplicación o servicio. Por cada aplicación o servicio que ha consumido, se genera un objeto BatterySipper.java que guarda información relacionada con el consumo.
Situado en /frameworks/base/core/java/com/android/internal/os.
BatterySipper.java: Objeto que almacena información de una aplicación o servicio que ha consumido batería. Hay distintos tipos de consumo, y una aplicación puede consumir por distintos motivos como por ejemplo uso de Wi-Fi, uso de redes móviles o de flash. Estos consumos se guardan diferenciados pudiendo obtenerlos de forma desgregada. Situado en /frameworks/base/core/java/com/android/internal/os.
3.3.
Obtención de datos
El Framework de Android automáticamente determina el uso de batería contabilizando el tiempo que cada componente ha estado en los diferentes estados. Cuando los componentes(Wi-Fi, redes móviles, GPS, pantalla) cambian sus estados(encendido/apagado, bajo/alto brillo) su controlador, conocido como servicio del sistema, avisa a BatteryStatsService. [5]
BatteryStats guarda información y la mantiene incluso tras apagar el terminal. El cálculo del consumo no se realiza directamente, sino que a partir de los datos almacenados cuando se necesite o se pida, se realiza dicho cálculo.
Se utilizan los siguientes métodos para la obtención de estadísticas:
Push: Los servicios de cada componente avisan de los cambios en sus estados a BatteryStatsService.
Pull: Para componentes como la CPU usada por las aplicaciones, automáticamente se piden los datos en las transiciones de los procesos en ejecución para obtener una captura de dicho estado y poder comparar ante futuros cambios.
3.4.
Consumos monitorizados
Cada fabricante debe generar un fichero llamado power_profile, que debe definir en /frameworks/base/core/res/res/xml/power_profile.xml. Este fichero contiene los consumos de cada uno de los componentes del teléfono. Las medidas de consumo
3.4. Consumos monitorizados 11
se dan en mA, y es el fabricante el que debe medirlas con el hardware de su dispositivo en las situaciones en las que la documentación de Android pide.
Este fichero es de tipo xml, de forma que se pueden definir etiquetas específicas para cada consumo, además de permitir anidaciones de etiquetas en forma de array.
Los consumos monitorizados por el framework de Android se muestran en la Tabla 3.1 [6].
Nombre Descripción Ejemplo
screen.on Consumo de la pantalla al mínimo brillo. 200mA
screen.full Consumo de la pantalla al máximo brillo. 300mA
wifi.on Consumo Wi-Fi encendido, pero sin recibir, 2mA
enviar o escanear.
wifi.active Consumo de Wi-Fi cuando se envían 30mA
o reciben datos.
wifi.scan Consumo de Wi-Fi cuando se escanea en 100mA
busca de puntos de acceso.
camera.avg Consumo de cámara. 600mA
camera.flashlight Consumo de led flash. 200mA
gps.on Consumo deGPS adquiriendo señal. 50mA
radio.active Consumo de redes móviles cuando transmite o recibe. 300mA
radio.scanning Consumo de redes móviles cuando escanea. 1.2mA
radio.on Consumo de redes móviles cuando se encuentra 1.2mA
encendido el chip. Entrada multivalor para cada uno de los tipos de calidad de señal.
cpu.speeds Entrada multivalor que lista las frecuencias de la CPU. 125000KHz
cpu.idle Consumo de la CPU cuando el dispositivo se encuentra suspendido. 3mA
cpu.awake Consumo de la CPU cuando el dispositivo se encuentra activo. 50mA
cpu.active Consumo de la CPU en cada frecuencia 200mA
de funcionamiento. Entrada multivalor.
cpu.clusters.core Número de núcleos de cada CPU. 4
Tabla 3.1: Consumos monitorizados por BatteryStats
Adicionalmente, a partir de Android 6.0 loschips de Wi-Fi y Bluetooth son capaces de exportar estadísticas de batería. Es decir, el chip conoce información acerca de:
Transmisión: Cantidad de tiempo que ha estado transmitiendo información, medido en milisegundos.
Recepción: Cantidad de tiempo que ha estado recibiendo información, medido en milisegundos.
Idle: Cantidad de tiempo que ha estado en reposo, medido en milisegundos. Es el fabricante del SoC (System on Chip) el encargado de definir la interfaz para obtener dichos datos. Esta interfaz se conoce como HCI (Host Controller Interface).
El fabricante del teléfono, de nuevo, debe definir un fichero llamado config.xml situado en /frameworks/base/core/res/res/values/. En dicho fichero se deben definir una serie de variables definidas en la Tabla 3.2.
12 Capítulo 3.Estadísticas de batería
Nombre Descripción
config_bluetooth_idle_cur_ma Consumo de bluetooth en estado de reposo.
config_bluetooth_active_rx_cur_ma Consumo de bluetooth en estado de recepción.
config_bluetooth_active_tx_cur_ma Consumo de bluetooth en estado de transmisión.
config_bluetooth_operating_voltage_mv Voltage de referencia delchipde bluetooth.
config_wifi_idle_cur_ma Consumo de Wi-Fi en estado de reposo.
config_wifi_active_rx_cur_ma Consumo de Fi-Fi en estado de recepción.
config_wifi_active_tx_cur_ma Consumo de Wi-Fi en estado de transmisión.
config_wifi_operating_voltage_mv Voltage de referencia delchipde Wi-Fi.
Tabla 3.2: Consumos Wi-Fi y Bluetooth