系列文章目錄
Android專案中多次操作SharedPreferences導致ANR場景的解決
文章目錄
- 系列文章目錄
- 專案背景:
- 以定位來獲取廣告的方式為例:
- 所遇到的挑戰:
- 解決問題的步驟:
- 問題的解決
- 最近朋友推了一篇位元組的博客(以下文字以及圖片來源于位元組今日頭條團隊),
- 友盟平臺相關SDK初體驗:
- 總結
專案背景:
隨著時代的進步,移動端廣告的投放變得越來越多樣化,為了接近市場,不少公司自己研發了SDK去收集用戶的一些資訊以及行為用于分析,根據分析結果使用自定義廣告(自定義View)的方式繼續向用戶進行展示,以提高展示率和點擊率,
目前關于廣告商方面的選擇,國內的廣告變現普遍較低,首選應該是接入谷歌廣告,隨著業務的發展,在一段時間后,公司開始轉變成廣告接收方,并靠自己的SDK來進行廣告的投放,以及優化,
以定位來獲取廣告的方式為例:
- 首先利用用戶的定位等權限來獲取經緯度

-
將經緯度上傳至國內某定位SDK,獲取具體資訊,

-
最后根據定位資訊來獲取廣告并預加載為廣告展示做準備,

所遇到的挑戰:
在專案功能完成后準備上架前,會對專案進行一系列的測驗,但是ANR問題在測驗程序中很難完成復現,在使用多個機型測驗的程序中幾乎沒有ANR問題的記錄,但是在用戶的實際使用程序中,由于Android碎片化的嚴重,加上用戶的一些操作的習慣等,會導致出現ANR的問題,面對一些大型的廠家,ANR出現時會彈窗引導用戶關閉軟體,會導致使用體驗不好,造成用戶的流失,
解決問題的步驟:
在專案一個多月的例外收集中,出現過幾次ANR的問題,
- 分析例外收集中ANR日志將問題鎖定在SharedPreferences 上,排查程序比較麻煩,在鎖定了問題后,開始對問題進行分析,
- 查看Android檔案:在專案中,團隊使用SharedPreferences讀寫組態檔,均采用了官方的推薦做法,呼叫apply來提交,呼叫這個方法時,先寫入記憶體中,再將任務加入佇列中,會在異步執行緒中做落盤的操作,這個操作理論上來說是沒有問題的,也是google官方推薦的做法,
- 閱讀原始碼:

在此程序中發現谷歌官方注釋:
If another editor on this SharedPreferences does a regular commit() while a apply() is still outstanding, the commit() will block until all async commits are completed as well as the commit itself.
翻譯:如果SharedPreferences上的另一個編輯器執行常規的commit(),而apply()仍然未完成,則commit()將阻塞,直到所有異步提交以及提交本身都完成, - 鎖定問題:主執行緒呼叫了
QueuedWork.waitToFinish(),沒有待執行的任務,直接執行 finisher,進行阻塞等待, 直到寫入檔案成功后恢復執行, 這時候如果等待時間過長, 在一些市面上性能差的中低端機型上就會很容易出現ANR, (8.0以下)
問題的解決
當時的優化:
1.減小sp對應的檔案的大小,按照分類去讀寫對應的sp檔案,
2.sp的讀寫輕量的、小的配置資訊,將類似JSON的資料交給其他方式保存,
3.當需要多次呼叫Put系列方法,當邏輯確認不需要立即讀取時,在最后一次呼叫commit或apply即可,
最近朋友推了一篇位元組的博客(以下文字以及圖片來源于位元組今日頭條團隊),
- 思路:如果能讓sPendingWorkFinishers.poll()回傳為null,則這里的等待行為直接就跳過去了,sPendingWorkFinishers是個ConcurrentLinkedQueue集合,可以直接動態代理這個集合,覆寫poll方法,讓其永遠回傳null,這個時候UI永遠不會等待子執行緒寫入檔案完畢,事實證明這種方式簡單有效,

- 針對這種寫入等待的ANR問題,還有一種就是全域替換寫入方式,通過插樁的方式,替換所有的API實作,采用其他的存盤方式,這種方式修復成本和風險較大,但是后期可以隨機的替換存盤方式,使用比較靈活,
友盟平臺相關SDK初體驗:
由于ANR的比較難復現,于是寫一個方法,反復對SharedPreferences進行操作,以達到類似情況的復現,
出現問題,通過友盟U-APM平臺定位:

找到問題后,進行文中思路的操作即可,
總結
在情景中,由于Android太過碎片化,又不得直接舍棄低版本用戶,采用接入類似友盟U-APM平臺的方式去更快的解決問題是必不可少的,但對于一些小型手機的低版本可能還是會出現ANR的問題,針對類似收集用戶行為的情景,可采取進行多種方式去進行收集,例如對于低版本的系統,降低對收集資料的完整性等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330368.html
標籤:其他
