部分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解決了上面的問題後,用下面的工具驗證wakelock是否正確釋放:dosomethingandrelease
()throws
myexception
finally
}
一般來說,應用應該盡可能避免使用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...