2017年9月30日 星期六

Android get app icon crash if recycle the bitmap

在實做取得 app icon 的時候發現記憶體使用率會飆高而且常常降不下來, 想說可能是 birmap 吃掉記憶體,所以在使用完 bitmap 後就用 recycle 來讓 GC 可以做記憶體回收,但是發現呼叫 recycle 之後再次要取得 app icon 時常常會出現 exception 說使用到已經 recycle 的 bitmap,就在想會不會是系統已經做了 app icon 的 cache,所以每次取到的 app icon 有可能是跟之前一樣的 object,這篇的說法也印證了我的猜想,系統的確會內部自己做 cache

既然不能 recycle bitmap,但記憶體又這麼高,該怎麼辦?這時發現 Android 有提供一個 LruCache 物件來做 cache,很適合 bitmap 使用,試著用用看,結果...在這樣系統跟我都做了 cache 的情況下,記憶體使用率真的變低了

為什麼兩邊都做 cache 反而記憶體會下降,我認為 Android 系統內部的 cache 機制大概有問題 ,既然系統已經內部有做 app icon 的 cache 了,應用程式端就不需要再自己做 cache 才對,cache 的使用效能與記憶體管理系統自己要注意,而不是讓應用程式來煩惱,那還不如你系統就不要做 cache,這樣我記憶體使用率可以再降一點

為了這個問題還去查了一下 PackageManager 的原始碼,才發現 PackageManager 的實作提供者有兩個 ApplicationPackageManager 和 PackageManagerService 這些物件又互相 call 來 call 去對方的 method,看了有點頭昏

恩...繼上次 activity context create PackageManager memory leak 後又一個 Android 的坑 

沒有留言:

張貼留言