1. 程式人生 > >Android程序保活相關實踐

Android程序保活相關實踐

最近測試APP時接到個需求:1畫素保活

打眼一看,應該跟安卓程序有關係,索性找點詳細的資料來了解下:

系統什麼時候殺掉一個程序?為什麼殺掉這個程序?怎樣最大程度保活一個程序?詳細的講解可以參考這個連結------https://www.cnblogs.com/Doing-what-I-love/p/5530291.html

大概的意思是,安卓系統中所有的應用程式程序及系統服務程序(SystemServer)都是由Zygote程序fork出來,而這個SystemServer負責啟動系統中的2個重要服務PackageManagerService和ActivityManagerService。當ActivityManagerService啟動一個應用程式的時候會通過Socket與Zygote通訊,fork一個子程序作為即將啟動的應用程式的程序;而應用程式程序啟動過程,指定新的程序的入口函式是ActiveThread的main函式,為程序內的Binder物件提供了Binder程序間通訊機制的基礎設施(Binder執行緒池)

就是這樣了。

Android的記憶體回收機制(Low Memory Killer)------Linux的是(Out of Memory Killer)

1,程序的oom_adj值由ActivityManagerService根據執行在程序裡面的元件的狀態來計算

2,程序的oom_adj的取值範圍[-16,15],值越小,表示越不容易殺死

3, 記憶體緊張時,LMK根據oom的值來決定回收哪個程序

4,PackageManagerService和ActivityManagerService在特定情況下也會進行程序回收

5,LMK回收策略,當系統記憶體小於i時,在oom值大於等於j的程序中,選擇一個oom值最大且消耗記憶體最多的程序來回收

應用程式程序的oom_adj值

  SYSTEM_ADJ(-16):System Server程序
  PERSISTENT_PROC_ADJ(-12):android:persistent屬性為true的系統App程序,如PhoneApp
  FOREGROUND_APP_ADJ(0):包含前臺Activity的程序
  VISIBLE_APP_ADJ(1):包含可見Activity的程序
  PERCEPTIBLE_APP_ADJ(2):包含狀態為Pausing、Paused、Stopping的Activity的程序,以及執行有Foreground Service的程序
  HEAVY_WEIGHT_APP_ADJ(3):重量級程序, android: cantSaveState屬性為true的程序,目前還不開放
  BACKUP_APP_ADJ(4):正在執行備份操作的程序
  SERVICE_ADJ(5):最近有活動的Service程序
  HOME_APP_ADJ(6):HomeApp程序
  PREVIOUS_APP_ADJ(7):前一個App執行在的程序
  SERVICE_B_ADJ(8):SERVICE_ADJ程序數量達到一定值時,最近最不活動的Service程序
  HIDDEN_APP_MIN_ADJ(9)和HIDDEN_APP_MAX_ADJ(15):含有不可見Activity的程序,根據LRU原則賦予[9,15]中的一個值
  Init程序的oom_adj值被設定為-16,由Init程序所啟動的daemon和service程序的oom_adj值也等於-16
  如果執行在程序A中的Content Provider或者Service被繫結到程序B,並且程序B的oom_adj值比程序A的oom_adj小,那麼程序A的oom_adj值就會被設定為程序B的oom_adj值,但是不能小於FOREGROUND_APP_ADJ
  一遍操作後,也只能看見幾個值,其他的就參考吧。

ActivityManagerService在以下幾種情況下會更新oom值:

  1,停止Activity

  2,設定程序數量限制

  3,登出Broadcast Receiver

  4,結束Broadcast Receiver

  5,WindowManagerService在處理視窗的過程中發生Out Of Memroy時,也會通知ActivityManagerService殺掉那些包含有視窗的應用程式程序

用待測的app查看了下oom的值,具體顯示如下:(進shell,檢視對應app的程序id,根據id檢視對應的oom值)

 

加上了1畫素保活的功能後,又重新試了下各個情況的oom值:

切後臺鎖屏後跟前臺展示值相同,都為0

按home鍵檢視值為2,已經看不到7和9的值了

初步判斷設定成功

剩下的問題就是分析下log中activity的生命週期了