Android 功耗分析之wakelock

本文详细介绍了Android中的WakeLock机制,包括它的定义、作用、分类和使用方法。WakeLock用于防止系统休眠,确保任务在灭屏状态下也能执行。文章还探讨了如何设置和释放WakeLock,以及如何进行调试,包括应用层和系统层的debug技巧,以解决潜在的内存泄露和性能问题。
摘要由CSDN通过智能技术生成

生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。—海明威

WakeLock是什么

WakeLock是Android框架层提供的一套机制,应用使用该机制可以达到控制Android设备状态的目的。这里的设备状态主要指屏幕的打开关闭,cpu的保持运行。简单的理解WakeLock是让系统保持”清醒”的一种手段.

WakeLock作用

当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能得不到正常执行,比如网络下载中断,后台播放音乐暂停等。WakeLock正是为了解决这类问题,应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。

WakeLock有那些分类

WakeLock是PowerManager的内部类,其代码路径位于:

frameworks/base/core/java/android/os/PowerManager.java

WakeLock 分类如下:

  • PARTIAL_WAKE_LOCK: 灭屏,关闭键盘背光的情况下,CPU依然保持运行。
  • 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的flag如下:

  • ACQUIRE_CAUSES_WAKEUP: 点亮屏幕,比如应用接收到通知后,屏幕亮起。
  • ON_AFTER_RELEASE: 释放WakeLock后,屏幕不马上熄灭。
  • UNIMPORTANT_FOR_LOGGING: 隐藏的flag,系统级别才会用到。

WakeLock的设置过程

WakeLock从用户空间下发设置操作,然后进入kernel空间,最终写入到了/sys/power/wake_lock文件节点。
下面来从源码的角度跟踪下acquire WakeLock的过程。

  1. frameworks/base/core/java/android/os/PowerManager.java
    acquire—>acquireLocked—->PowerManagerService.acquireWakeLock

  2. frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
    acquireWakeLock—>acquireWakeLockInternal—->updatePowerStateLocked—->updateSuspendBlockerLocked—->mWakeLockSuspendBlocker.acquire—->PowerManagerService$SuspendBlockerImpl.acquire—->nativeAcquireSuspendBlocker

  3. frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp
    nativeAcquireSuspendBlocker—->acqu

PowerManager.WakeLock 是一个 Android 中的类,用于管理设备电源的锁定状态。它允许应用程序在一些特殊的情况下保持设备处于唤醒状态,以确保应用程序可以继续运行。 在 Android 中,设备通常会在一段时间后进入休眠状态,以节省电量。在这种情况下,CPU 和其他一些硬件组件会进入低功耗模式,此时应用程序的运行也会受到限制。 PowerManager.WakeLock 的作用就是可以防止设备进入休眠状态,以保持设备的唤醒状态。这样,应用程序可以继续执行一些需要持续运行的操作,如后台下载、音乐播放、定时任务等。 使用 PowerManager.WakeLock 需要以下几个步骤: 1. 获取 PowerManager 的实例: ```java PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); ``` 2. 创建 WakeLock 对象: ```java PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTag"); ``` 这里的第一个参数表示锁定级别,常见的有: - PARTIAL_WAKE_LOCK:部分唤醒锁定,保持 CPU 运行,但允许屏幕关闭。 - SCREEN_DIM_WAKE_LOCK:屏幕亮度唤醒锁定,保持 CPU 运行和屏幕亮度降低。 - SCREEN_BRIGHT_WAKE_LOCK:屏幕高亮度唤醒锁定,保持 CPU 运行和屏幕高亮度。 - FULL_WAKE_LOCK:全唤醒锁定,保持 CPU 运行和屏幕高亮度。 第二个参数是一个标签,用于标识唤醒锁定的用途。 3. 获取唤醒锁: ```java wakeLock.acquire(); ``` 这个方法会请求获取唤醒锁定,使设备保持唤醒状态。 4. 释放唤醒锁: ```java wakeLock.release(); ``` 当不再需要保持设备唤醒状态时,需要调用 release 方法释放唤醒锁定。 需要注意的是,使用 PowerManager.WakeLock 要谨慎,确保在不需要时及时释放锁定,以免造成电池消耗过大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值