在講方法前,先來說說一下它的原理,如果沒興趣是也可以直接拉到最下面看作法
Android中的程序是託管的,當系統記憶體資源不足時會發出java.lang.OutOfMemoryError時(即OOM),此時會依照優先順序自動進行程序的回收。 而回收的標準則是透過oom_adj、oom_score、oom_score_adj的值來決定
- oom_score: kernel根據oom_score_adj值,結合該處理程序使用的記憶體量算出的值,後面無論是oom killer還是lmkd都是根據這個值來決定殺哪些處理程序的。
- oom_score_adj: 取值為-1000---1000,如果賦值為-1000將關閉oom killer對他的管理(如init、surfaceflinger等native 處理程序)。它和oom_adj都是kernel留給使用者空間更改處理程序被殺優先順序的介面
Android將程序分為不同等級,它們依優先順序由高到低依序是:
ADJ等級 | 優先權 | 行程類型 |
NATIVE_ADJ | -1000 | 由init處理程序fork出來的native處理程序,並不受system管控 |
SYSTEM_ADJ | -900 | 僅指system_server處理程序 |
PERSISTENT_PROC_ADJ | -800 | 系統persistent處理程序,在AndroidManifest.xml中申明 |
PERSISTENT_SERVICE_ADJ | -700 | 關聯著system_server或persistent的處理程序 |
FOREGROUND_APP_ADJ | 0 | 前台處理程序。正在展示是APP,存在互動介面 |
VISIBLE_APP_ADJ | 100 | 可見處理程序 |
PERCEPTIBLE_APP_ADJ | 200 | 可感知處理程序。比如後台音樂播放,過startForeground設定 |
BACKUP_APP_ADJ | 300 | 備份處理程序 |
HEAVY_WEIGHT_APP_ADJ | 400 | 後台的重量級程序。system/rootdir/init.rc檔案中設定 |
SERVICE_ADJ | 500 | 服務處理程序(Service process) |
HOME_APP_ADJ | 600 | Home處理程序 |
PREVIOUS_APP_ADJ | 700 | 上一個處理程序 |
SERVICE_B_ADJ | 800 | B List中的Service |
CACHED_APP_MIN_ADJ | 900 | 不可見處理程序的adj最小值 |
CACHED_APP_MAX_ADJ | 906 | 不可見處理程序的adj最大值 |
那該怎樣才能知道目前的程序的優先權呢? 我以Chromecast build-in這個process為例子
透過ps -A的指令得知com.google.android.apps.mediashell的pid是15223
u0_a44 15223 13234 1222180 59504 SyS_epoll_wait 0 S com.google.android.apps.mediashell
再透過下列指令
console:/ # cat /proc/15223/oom_score_adj
100 |
就能知道這個process對應的是VISIBLE_APP_ADJ(100),進而能預計當啟動LowMemoryKiller時是否很容易就會被kill掉。
因此要怎樣調整你開發的APP俱有不被隨意kill的優先權呢?
聰明的你在看過前面表格的說明,應該也會有發現到。如果你是有system權限的開發者,意即你的app是放在 /system/app 下的應用,只需要在其AndroidManifest.xml檔案中設定persistent屬性,即能取得PERSISTENT_PROC_ADJ(-800)。
<application android:name="MyApp" android:persistent="true" <!-- add here --> android:label="@string/dialerIconLabel" android:icon="@drawable/ic_launcher_phone"> ... </application>
ADJ優先順序小於0的,基本上就不太會被kill了,即使被殺死了也會被重啟的處理程序。
參考資料:
https://www.jianshu.com/p/4ee14aa23f07
https://juejin.cn/post/6920207613531717645
https://bbs.huaweicloud.com/blogs/321964
Place your comment