关于android:译功耗问题之Partial-Wake-Locks

68次阅读

共计 3575 个字符,预计需要花费 9 分钟才能阅读完成。

和你一起一生学习,这里是程序员 Android

本篇文章次要介绍 Android 开发中的局部知识点,通过浏览本篇文章,您将播种以下内容:

一、发现问题
二、解决问题
三、验证问题
四、最佳实际

Partial wake locks 是 PowerManager API 中的一种机制。可让开发人员在设施显示屏敞开(无论是因为零碎超时还是用户按下电源按钮)之后,持续让 CPU 放弃运行状态。

您的利用通过 acquire()) 应用 PARTIAL_WAKE_LOCK 标记调用来获取局部唤醒锁。

如果局部唤醒锁 在您的应用程序在后盾运行时被长时间 Hold, 则会 stuck(用户看不到应用程序的任何局部)。

这种状况会耗尽设施的电池电量,因为它会阻止设施进入低功耗模式。倡议 Partial wake locks 应仅在必要时应用,并且再不须要时立刻开释。

如果您的利用有 Partial wake locks 卡住,则能够应用下文中的领导来诊断和解决问题。

一、发现问题

您可能并不总是晓得 AppPartial wake locks 卡住了。如果您曾经公布了应用程序,则 Android vitals 可帮忙您理解问题。

Android vitals

当您的应用程序显示卡住的局部唤醒锁时,Android vitals 能够通过 Play Console 提醒您,从而帮忙进步应用程序的性能。Android vitals 次要报告 partial wake locks 卡住至多一个小时以上的问题,比方:

  • 至多占整个电池耗费的0.70%

或者

  • 仅在后盾运行时,至多有 0.10% 的电池电量耗费

电池电量是指两次充斥电的距离,显示的电池续航次数是该应用程序所有测量用户的汇总。无关 Google Play 如何收集 Android 生命数据的信息,请参阅 Play Console 文档。

一旦晓得您的应用程序卡住了局部唤醒锁,下一步就是解决该问题。

二、解决问题

唤醒锁是在 Android 平台的晚期版本中引入的,然而随着工夫的推移,以前须要唤醒锁的许多用例当初能够通过诸如 WorkManager 更新的 API 更好地解决问题。

本节蕴含修复唤醒锁的技巧,但从久远来看,请思考迁徙您的应用程序,以遵循 第四局部最佳实际 中的倡议。

在代码中标识并修复须要唤醒锁的地位,例如 newWakeLock(int ,String)WakefulBroadcastReceiver(Android O 已弃用)

  • newWakeLock(int ,String)
 PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
 wl.acquire();
 // ... do work...
 wl.release();
 

1. 倡议在唤醒锁标记包名、类名、办法名

这样不便您能够轻松地在源码中标识创立唤醒锁的地位。以下是一些其余提醒:

  • 疏忽名称中的任何个人身份信息(PII),例如电子邮件地址。否则,设施将记录日志,_UNKNOWN 而不是唤醒锁名称。
  • 不要以编程形式获取类或办法的名称,例如通过调用 getName()),因为 Proguard 可能会混同它们。而是应用硬编码的字符串。
  • 不要增加计数器或惟一标识符来唤醒锁定标签。零碎将无奈聚合通过雷同办法创立的唤醒锁,因为它们都具备惟一的标识符。

2. 确保您的代码开释了它获取的所有唤醒锁

精确的应用 acquire())及 release()),防止异样导致无奈是否唤醒锁。

  • 举例因为未捕捉的异样导致未开释的唤醒锁
    void doSomethingAndRelease() throws MyException {wakeLock.acquire();
        doSomethingThatThrows();
        wakeLock.release();  // does not run if an exception is thrown}

正确的写法应该如下

    void doSomethingAndRelease() throws MyException {
        try {wakeLock.acquire();
            doSomethingThatThrows();} finally {wakeLock.release();
        }
    }

3. 确保唤醒锁在不再须要时被开释

如果您应用唤醒锁来容许后台任务实现,请确保该工作实现时及时开释唤醒锁。如果唤醒锁放弃的工夫比预期的要长而不被开释,则可能意味着您的后台任务破费的工夫比预期的要多。

三、验证问题

解决了代码中的问题后,请应用以下 Android 工具验证您的利用正确开释了唤醒锁:

1.dumpsys

dumpsys 提供设施上零碎服务状态的信息。能够通过应用 adb 命令看电源服务的状态(包含唤醒锁列表)adb shell dumpsys power

C:\Users\Administrator>adb shell dumpsys power 
POWER MANAGER (dumpsys power)

Power Manager State:
  ... ...
  mBatteryLevel=46   // 电量信息
  mBatteryLevelWhenDreamStarted=0
  mDockState=0
  mStayOn=false
  mProximityPositive=false //Psensor
  mBootCompleted=true
  mSystemReady=true
  ... ... 

Settings and Configuration:
  
  ... ...
  mScreenBrightnessSettingMinimum=30  // 屏幕连读参数
  mScreenBrightnessSettingMaximum=255
  mScreenBrightnessSettingDefault=102
  mScreenBrightnessForVrSettingDefault=86
  mScreenBrightnessForVrSetting=86
  mDoubleTapWakeEnabled=false
  mIsVrModeEnabled=false
  ... ...

Suspend Blockers: size=4  // 唤醒中断源
  PowerManagerService.WakeLocks: ref count=0
  PowerManagerService.Display: ref count=0
  PowerManagerService.Broadcasts: ref count=0
  PowerManagerService.WirelessChargerDetector: ref count=0
  ... ...

2.Battery Historian

Battery Historian 一种将 Android Bugreport 的输入解析为与电源相干的事件的可视示意的工具。
比方:遇到功耗问题,咱们能够执行以下命令抓取 bugreport,并通过 BatteryHistorian 剖析唤醒源。
具体操作步骤如下:

adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats --enable full-wake-history
adb bugreport bugreport.zip

BatteryHistorian 具体应用办法,请点击下方链接。
BatteryHistorian 应用详解

四、最佳实际

通常,利用应防止局部唤醒锁定,因为这样很容易耗尽用户的电池。Android为须要局部唤醒锁的用例提供了代替 API。局部唤醒锁的另一个用例是确保屏幕敞开时音乐应用程序持续播放。如果您应用唤醒锁来运行工作,请思考在 background processing guide.
形容的代替办法。
如果必须应用局部唤醒锁,请遵循以下倡议:

  • 确保您的应用程序的某些局部保留在前台。例如,如果您须要运行服务,请 start a foreground service。直观地向用户表明您的利用仍在运行。
  • 确保获取和开释唤醒锁的逻辑尽可能简略。当您的唤醒锁逻辑与混同多种状态,超时,执行程序池和 / 或回调事件相关联时,该逻辑中的任何轻微谬误都可能导致唤醒锁的保留工夫超出预期。这些谬误很难诊断和调试。

至此,本篇已完结。转载网络的文章,小编感觉很优良,欢送点击浏览原文,反对原创作者,如有侵权,恳请分割小编删除,欢迎您的倡议与斧正。同时期待您的关注,感谢您的浏览,谢谢!

情谊举荐:
Android 干货分享

至此,本篇已完结。转载网络的文章,小编感觉很优良,欢送点击浏览原文,反对原创作者,如有侵权,恳请分割小编删除,欢迎您的倡议与斧正。同时期待您的关注,感谢您的浏览,谢谢!

正文完
 0