- Русские Блоги
- Wakelock для анализа энергопотребления Android
- Что такое WakeLock
- Функция WakeLock
- Какие бывают категории WakeLock
- Процесс установки WakeLock
- Использование WakeLock
- Методы отладки для проблем, связанных с WakeLock
- Отладка на уровне приложений
- Отладка системного уровня
- Power Management
- Introduction
- Wake Locks
- Driver API
- User-space API
- Types of Wake Locks
- Exploring a Wake Lock Example
- PowerManager class
- Registering Drivers with the PM Driver
- Early Suspend
- Русские Блоги
- PowerManager и WakeLock
- Четыре блокировки пробуждения
- как пользоваться
- Два режима WakeLock
Русские Блоги
Wakelock для анализа энергопотребления Android
Жизнь всегда оставляет нас в синяках и синяках, но в будущем эти травмированные места обязательно станут нашими сильнейшими местами. — Хемингуэй
Что такое WakeLock
WakeLock — это набор механизмов, предоставляемых уровнем инфраструктуры Android, которые могут использоваться приложениями для управления состоянием устройств Android. Состояние устройства здесь в основном относится к открытию и закрытию экрана, а также к продолжению работы процессора. Просто поймите, что WakeLock — это средство, чтобы система не спала.
Функция WakeLock
Когда телефон не используется на экране в течение некоторого времени, система переходит в спящий режим, и некоторые фоновые задачи могут не выполняться нормально, например, прерывание загрузки по сети, пауза воспроизведения фоновой музыки и т. Д. WakeLock призван решить эту проблему. Пока приложение применяется для WakeLock, система не перейдет в спящий режим до того, как WakeLock будет выпущен. Даже когда экран выключен, задача, выполняемая приложением, не будет прервана система.
Какие бывают категории WakeLock
WakeLock — это внутренний класс PowerManager, путь к которому находится по адресу:
WakeLock классифицируется следующим образом:
- PARTIAL_WAKE_LOCK: экран выключен, и ЦП продолжает работать, когда подсветка клавиатуры выключена.
- PROXIMITY_SCREEN_OFF_WAKE_LOCK: отключение экрана на основе датчика приближения. Наиболее типичный сценарий приложения — когда мы звоним по телефону близко к ушам, экран автоматически выключается.
- SCREEN_DIM_WAKE_LOCK / SCREEN_BRIGHT_WAKE_LOCK / FULL_WAKE_LOCK: эти три типа WakeLock устарели. Их цель — сохранить яркость экрана. Официальный представитель Android рекомендует использовать getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Способ замены. Поскольку этот метод проще, чем применение WakeLock, и не требуется специального приложения. android.permission.WAKE_LOCK Разрешения.
- DOZE_WAKE_LOCK / DRAW_WAKE_LOCK: скрытые категории, используются только на системном уровне.
Флаг WakeLock выглядит следующим образом:
- ACQUIRE_CAUSES_WAKEUP: включить экран, например, экран включается после того, как приложение получает уведомление.
- ON_AFTER_RELEASE: после выхода WakeLock экран не выключается сразу.
- UNIMPORTANT_FOR_LOGGING: скрытый флаг, используется только на системном уровне.
Процесс установки WakeLock
WakeLock выполняет операцию настройки из пользовательского пространства, затем входит в пространство ядра и, наконец, записывает в /sys/power/wake_lock Файловый узел.
Давайте проследим процесс получения WakeLock с точки зрения исходного кода.
hardware/libhardware_legacy/power/power.c
collect_wake_lock и, наконец, записать wakelock в узел в этом методе
Использование WakeLock
К использованию WakeLock следует обращаться осторожно. Неправильное использование может сделать приложение «убийцей батареи». Используемые принципы
- Постарайтесь не использовать его, если вы им не пользуетесь: например, если вы хотите, чтобы экран оставался ярким, вам следует использовать его. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Способ.
PowerManager.FULL_WAKE_LOCK будет держать экран включенным в течение длительного времени, например, установив автоматическое выключение экрана на 15 секунд. После применения wakelock экран не выключится, даже если он превышает 15 секунд. Но если пользователь активно нажимает кнопку питания, экран все равно будет выключен.
- Если вам нужно его использовать, не забудьте освободить его после использования.
Есть два способа подать заявку на WakeLock: получить () и получить (длительный тайм-аут). Последний относительно безопаснее. Если вы забудете освободить WakeLock, система автоматически отключится по истечении тайм-аута. .
Типичное использование WakeLock выглядит следующим образом:
В то же время вам нужно добавить разрешения в файле манифеста
Методы отладки для проблем, связанных с WakeLock
Отладка на уровне приложений
Если вы просто проверяете, не срабатывает ли будильник определенного приложения ненормально, вы можете использовать команду
Для просмотра, например, в следующем примере кода
При входе в метод onResume информация dumpsys выглядит следующим образом:
Проходить PARTIAL_WAKE_LOCK ‘azhengye-test-wakelock’ ON_AFTER_RELEASE ACQ=-4m52s949ms LONG (uid=10124 pid=31473 pkg=com.azhengye.testpath) Вы можете видеть, что приложение wakelock успешно работает.
Если вы введете метод onPause, то только что запрошенный wakelock должен быть снят. В это время информация из dumpsys выглядит следующим образом:
Ничего страшного, вышло нормально. Если приложение было запущено, чтобы освободить инструкцию wakelock, но информация из dumpsys по-прежнему видит, что wakelock удерживается, это проблема, и нам необходимо ее удалить.
Отладка системного уровня
Отладить проблемы, связанные с wakelock, на системном уровне сложнее. Основные шаги заключаются в следующем.
Согласно анализу журнала
Сначала включите переключатель отладки
frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
Затем dumpsys power view и поиск в logcat acquireWakeLockInternal Ключевое слово для просмотра статуса приложения Wakelock,
, например
ищи releaseWakeLockInternal Проверьте выпуск. lock= Следующие целые числа могут соответствовать получению и освобождению. В сочетании с меткой времени logcat вы можете получить продолжительность удержания wakelock. Кратковременное удержание wakelock обычно не вызывает проблем. Вид удержания wakelock в течение длительного времени будет увеличиваться потребляемая мощность. Есть проблема, это должно быть основано на tag Перейдите в поле кода, чтобы просмотреть конкретный процесс получения / выпуска.
После того, как система проработает какое-то время, получите отчет об ошибке. Используйте архиватор, чтобы проверить статус приложения wakelock.Вы можете проверить предыдущий блог для подробностейПостроение среды анализа энергопотребления историка батареи Android
Источник
Power Management
Introduction
Android supports its own Power Management (on top of the standard Linux Power Management) designed with the premise that the CPU shouldn’t consume power if no applications or services require power. For more information regarding standard Linux power management, please see Linux Power Management Support at http://kernel.org.
Android requires that applications and services request CPU resources with «wake locks» through the Android application framework and native Linux libraries. If there are no active wake locks, Android will shut down the CPU.
The image below illustrates the Android power management architecture.
Solid elements represent Android blocks and dashed elements represent partner-specific blocks.
Wake Locks
Wake locks are used by applications and services to request CPU resources.
A locked wakelock, depending on its type, prevents the system from entering suspend or other low-power states. This document describes how to employ wakelocks.
There are two settings for a wakelock:
- WAKE_LOCK_SUSPEND : prevents a full system suspend.
- WAKE_LOCK_IDLE : low-power states, which often cause large interrupt latencies or that disable a set of interrupts, will not be entered from idle until the wakelocks are released.
Unless the type is specified, this document refers to wakelocks of type WAKE_LOCK_SUSPEND .
If the suspend operation has already started when locking a wakelock, the system will abort the suspend operation as long it has not already reached the suspend_late stage. This means that locking a wakelock from an interrupt handler or a freezeable thread always works, but if you lock a wakelock from a suspend_late handler, you must also return an error from that handler to abort suspend. You can use wakelocks to allow the user-space to decide which keys should wake the full system and turn on the screen. Use set_irq_wake or a platform-specific API to ensure that the keypad interrupt wakes up the CPU. Once the keypad driver has resumed, the sequence of events can look like this:
- The Keypad driver receives an interrupt, locks the keypad-scan wakelock, and starts scanning the keypad matrix.
- The keypad-scan code detects a key change and reports it to the input-event driver.
- The input-event driver sees the key change, enqueues an event, and locks the input-event-queue wakelock.
- The keypad-scan code detects that no keys are held and unlocks the keypad-scan wakelock.
- The user-space input-event thread returns from select/poll, locks the process-input-events wakelock, and calls read in the input-event device.
- The input-event driver dequeues the key-event and, since the queue is now empty, unlocks the input-event-queue wakelock.
- The user-space input-event thread returns from read. It determines that the key should not wake up the full system, releases the process-input-events wakelock, and calls select or poll.
The simple sequence diagram below illustrates these steps:
Driver API
A driver can use the wakelock API by adding a wakelock variable to its state and calling wake_lock_init , as illustrated in the snippet below:
When the driver determines that it needs to run (usually in an interrupt handler), it calls wake_lock :
When it no longer needs to run, it calls wake_unlock :
It can also call wake_lock_timeout to release the wakelock after a delay:
This works whether or not the wakelock is already held. It is useful if the driver woke up other parts of the system that do not use wakelocks but still need to run. Avoid this when possible, since it will waste power if the timeout is long or may fail to finish needed work if the timeout is short.
User-space API
Write lockname or lockname timeout to /sys/power/wake_lock lock and, if needed, create a wakelock. The timeout here is specified in nanoseconds. Write lockname to /sys/power/wake_unlock to unlock a user wakelock.
Do not use randomly generated wakelock names as there is no API to free a user-space wakelock.
Types of Wake Locks
Wake Lock | Description |
---|---|
ACQUIRE_CAUSES_WAKEUP | Normally wake locks don’t actually wake the device, they just cause it to remain on once it’s already on. Think of the video player app as the normal behavior. Notifications that pop up and want the device to be on are the exception; use this flag to be like them. |
FULL_WAKE_LOCK | Wake lock that ensures that the screen and keyboard are on at full brightness. |
ON_AFTER_RELEASE | When this wake lock is released, poke the user activity timer so the screen stays on for a little longer. |
PARTIAL_WAKE_LOCK | Wake lock that ensures that the CPU is running. The screen might not be on. |
SCREEN_BRIGHT_WAKE_LOCK | Wake lock that ensures that the screen is on at full brightness; the keyboard backlight will be allowed to go off. |
SCREEN_DIM_WAKE_LOCK | Wake lock that ensures that the screen is on, but the keyboard backlight will be allowed to go off, and the screen backlight will be allowed to go dim. |
Exploring a Wake Lock Example
All power management calls follow the same basic format:
- Acquire handle to the PowerManager service.
- Create a wake lock and specify the power management flags for screen, timeout, etc.
- Acquire wake lock.
- Perform operation (play MP3, open HTML page, etc.).
- Release wake lock.
The snippet below illustrates this process.
PowerManager class
The Android Framework exposes power management to services and applications through the PowerManager class.
User space native libraries (any hardware function in //device/lib/hardware/ meant to serve as supporting libraries for Android runtime) should never call into Android Power Management directly (see the image above). Bypassing the power management policy in the Android runtime will destabilize the system.
All calls into Power Management should go through the Android runtime PowerManager APIs.
Registering Drivers with the PM Driver
You can register Kernel-level drivers with the Android Power Manager driver so that they’re notified immediately before power down or after power up. For example, you might set a display driver to completely power down when a request comes in to power down from the user space (see the Android MSM MDDI display driver for a sample implementation).
To register drivers with the Android PM driver, implement call-back handlers and register them with the Android PM, as illustrated in the snippet below:
It is critical in a drive to return immediately and not wait for anything to happen in the call back.
Early Suspend
The early-suspend API allows drivers to get notified when user-space writes to /sys/power/request_state to indicate that the user visible sleep state should change. Suspend handlers are called in order of low to high (4 — 1 below) and resume handlers are called in order of high to low (1 — 4 below).
- EARLY_SUSPEND_LEVEL_BLANK_SCREEN :
- on suspend: the screen should be turned off but the framebuffer must still be accessible.
- on resume: the screen can be turned back on.
- EARLY_SUSPEND_LEVEL_STOP_DRAWING :
- on suspend: this level notifies user-space that it should stop accessing the framebuffer and it waits for it to complete.
- on resume: it notifies user-space that it should resume screen access. Two methods are provided, console switch or a sysfs interface.
- EARLY_SUSPEND_LEVEL_DISABLE_FB : Turn off the framebuffer
- on suspend: turn off the framebuffer
- on resume: turn the framebuffer back on.
- EARLY_SUSPEND_LEVEL_STOP_INPUT :
- on suspend: turn off input devices that are not capable of wakeup or where wakeup is disabled.
- on resume: turn the same devices back on.
Источник
Русские Блоги
PowerManager и WakeLock
PowerManager Используется для управления состоянием питания устройства.PowerManager.WakeLock Также называется блокировкой пробуждения, это способ поддерживать работу процессора и предотвращать переход устройства в спящий режим.
Нам часто нужно держать приложение выделенным, например, при чтении романа. Или, даже если экран выключен в фоновом режиме, оно может продолжать работать, например, воспроизводить MP3. Здесь нам нужно использовать механизм WakeLock PowerManager.
Если вам просто нужно держать экран включенным, например, в приложении для чтения или в игре, вы можете использовать его в активности.FLAG_KEEP_SCREEN_ONWakelocks больше склонны к фоновым службам, запускающим CPU для выполнения определенных задач перед сном, например, загрузки или воспроизведения mp3.
Официальный документЭто также объясняет, что блокировки пробуждения никогда не используются в действиях, а только FLAG_KEEP_SCREEN_ON .
Четыре блокировки пробуждения
PowerManager.WakeLock Предусмотрено четыре блокировки пробуждения. Но в дополнение к PARTIAL_WAKE_LOCK Остальные уже находятся на уровне API 17deprecated, Поэтому постарайтесь использовать его только в службе PARTIAL_WAKE_LOCK , Используется в деятельности FLAG_KEEP_SCREEN_ON .
Flag Value | CPU | экран | клавиатура |
---|---|---|---|
PARTIAL_WAKE_LOCK | On* | Off | Off |
SCREEN_DIM_WAKE_LOCK | On | Тусклый постепенно темнеет | Off |
SCREEN_BRIGHT_WAKE_LOCK | On | Яркие сохраняют яркость | Off |
FULL_WAKE_LOCK | On | Яркие сохраняют яркость | Яркие сохраняют яркость |
Пожалуйста, обратите внимание, если PARTIAL_WAKE_LOCK , Независимо от состояния экрана или даже того, что пользователь нажимает кнопку питания, ЦП будет продолжать работать. Если это другие блокировки пробуждения, устройство перестанет работать и перейдет в состояние сна после того, как пользователь нажмет кнопку питания. .
В дополнение к указанным выше четырем блокировкам пробуждения есть еще два флага, которые относятся только к режиму отображения экрана.
Flag Value | описание |
---|---|
ACQUIRE_CAUSES_WAKEUP | Как только будет получена блокировка wake lock, экран и клавиатура будут немедленно открыты |
ON_AFTER_RELEASE | При снятии блокировки включения таймер активности сбрасывается, и экран становится ярче, чем обычно. |
как пользоваться
Во-первых, у вас должно быть разрешение на использование блокировки пробуждения.
Также вам могут понадобиться:
Перед этим подумайте, можете ли вы использовать WakefulBroadcastReceiver (ссылкаWakefulBroadcast Заметки для получателяОн автоматически получит блокировку пробуждения PARTIAL_WAKE_LOCK.
Если ситуация не выполняется, вручную создайте блокировку пробуждения.
Попробуйте использовать здесь acquire(long timeout) Установите тайм-аут (также называемый блокировкой тайм-аута)Например, время возврата данных, запрошенных сетью, является неопределенным, что приводит к ожиданию в течение 1 часа для вещей, которые первоначально занимали всего 10 секунд, что приведет к потере энергии. После установки тайм-аута он автоматически освободит сохраненную точку .
Два режима WakeLock
- Неучтенный режим блокировки
- Режим блокировки счета
Проходить setReferenceCounted(boolean value) Чтобы указать. Истина учитывается, ложь не учитывается. По умолчанию используется механизм подсчета.
- Если это не режим подсчета, независимо от предыдущего acquire() Сколько раз звони один раз release() Освободит все замки.
- Если он находится в режиме подсчета, каждый звонок acquire() Будет считать count ++, release() Значение count должно быть таким же.
Источник