Android卡住的部分wakelock

2021-09-05 10:47:32 字數 1453 閱讀 3399

部分wakelock是powermanager api給使用者提供的允許使用者在黑屏後(不管是系統超時還是使用者按下電源鍵)保持cpu執行的機制。應用通過呼叫acquire()和引數partial_wake_lock獲得部分wakelock。如果你的應用獲得了乙個部分wakelock,一直在後台執行(對使用者不可見),那麼這個wakelock就卡住了。這種情況會耗盡電量,因為他會阻止裝置進入低電狀態。部分wakelock只應該在必要的時候使用,用完應立即釋放。

如果你的應用有卡住wakelock的問題,你可以通過本文來發現和解決這一問題。

你可能不知道自己的wakelock卡住了。如果你的應用發布了,android vitals可以幫你發現問題。

當應用有卡住的wakelock時,android vitals可以通過play console通知你的應用存在效能問題。android vitals會報告wakelock卡住一小時,並至少滿足下面一點時:

電量會話是兩次充滿電之間的部分。

意識到存在卡住wakelock的問題後,再定位問題。

wakelock是在早期的android平台中引入的,隨著時間的推移,很多之前需要用wakelock的情況,在新版本上有更好的功能代替了,像jobscheduler和firebase jobdispatcher。這段為解決wakelock問題給出建議,但長期來看,還是要移植應用滿足最好的聯絡。

找到用wakelock的地方,比如newwakelock(int, string)或者wakefulbroadcastreceiver。一些建議:

確保**釋放了所有獲得過的wakelock。確保所有呼叫acquire()的都有對應的release()。下面的例子中wakelock因為異常沒有被釋放:

void

dosomethingandrelease()

throws

myexception

正確的版本是:

void

dosomethingandrelease

()throws

myexception

finally

}

解決了上面的問題後,用下面的工具驗證wakelock是否正確釋放:

一般來說,應用應該盡可能避免使用partial wakelock,因為他太容易引起耗電。之前需要partial wakelock的大部分情形,android提供了新的替換api。還有乙個情況需要使用partial wakelock,即關屏後聽**。如果需要執行任務,考慮下面的替換方案:

應用需要從外部伺服器同步資料,考慮用sync adapter。

如果應用定期執行後台服務,考慮用jobscheduler或者firebase jobdispatcher或者workmanager,目前還在阿爾法階段。定期觸發服務,請看intelligent job-scheduling。

用這些api的好處就是系統會根據電池的狀態批量或推遲這些操作。

如果必須使用部分wakelock,一定要注意一些建議:

wak切割功能和cut的區別

cut 將同一行裡面的資料進行分解 d 指定分隔符 f 提取第幾列 cut d f1,3 filename 根據 號剪下整行,提取出第 一 三個字段awk 對每一行分成多個字段資料進行處理,適合小型資料的處理 f 指定分隔符 0代表整行 awk f etc passwd rootcut 與 awk的...

nfs卡住的問題

最近使用nfs來儲存檔案,但是在客戶端節點遇到了問題。用df h的時候系統直接就卡住了。之前開發時就碰到過nfs客戶端卡住的情況,umount f mnt提示device is busy,並且嘗試訪問掛載目錄 df h等操作都會使終端卡住,ctrl c也不能強行退出。當時忙著趕進度,沒研究這個問題。...

flutter pub get卡住的問題

大概意思就是 把預設的 package 獲取位址改為訪問沒有問題的映象站就可以了。具體操作 export pub hosted url export flutter storage base url 新增兩個環境變數即可 pub hosted url flutter storage base url...