韌館-LearnHouse

[Android]確保APP或Service不被Kill (LowMemoryKiller) 的方法

在講方法前,先來說說一下它的原理,如果沒興趣是也可以直接拉到最下面看作法

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_ADJ0前台處理程序。正在展示是APP,存在互動介面
VISIBLE_APP_ADJ100可見處理程序
PERCEPTIBLE_APP_ADJ200可感知處理程序。比如後台音樂播放,過startForeground設定
BACKUP_APP_ADJ300備份處理程序
HEAVY_WEIGHT_APP_ADJ400後台的重量級程序。system/rootdir/init.rc檔案中設定
SERVICE_ADJ500服務處理程序(Service process)
HOME_APP_ADJ600Home處理程序
PREVIOUS_APP_ADJ700上一個處理程序
SERVICE_B_ADJ800B List中的Service
CACHED_APP_MIN_ADJ900不可見處理程序的adj最小值
CACHED_APP_MAX_ADJ906不可見處理程序的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

2024年3 月 posted by admin in 程式&軟體 and have No Comments

Place your comment

Please fill your data and comment below.
名稱:
信箱:
網站:
您的評論: