和你一起一生学习,这里是程序员 Android
本篇文章次要介绍 Android
开发中的局部知识点,通过浏览本篇文章,您将播种以下内容:
一、发现问题
二、解决问题
三、验证问题
四、最佳实际
Partial wake locks 是 PowerManager API 中的一种机制。可让开发人员在设施显示屏敞开(无论是因为零碎超时还是用户按下电源按钮)之后,持续让 CPU
放弃运行状态。
您的利用通过 acquire()) 应用 PARTIAL_WAKE_LOCK 标记调用来获取局部唤醒锁。
如果局部唤醒锁 在您的应用程序在后盾运行时被长时间 Hold, 则会 stuck(用户看不到应用程序的任何局部)。
这种状况会耗尽设施的电池电量,因为它会阻止设施进入低功耗模式。倡议 Partial wake locks
应仅在必要时应用,并且再不须要时立刻开释。
如果您的利用有 Partial wake locks
卡住,则能够应用下文中的领导来诊断和解决问题。
一、发现问题
您可能并不总是晓得 App
被 Partial 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 干货分享
至此,本篇已完结。转载网络的文章,小编感觉很优良,欢送点击浏览原文,反对原创作者,如有侵权,恳请分割小编删除,欢迎您的倡议与斧正。同时期待您的关注,感谢您的浏览,谢谢!