Android中的程序保活(不死程序)
Android中的程序保活方式主要分為以下三種:
- 黑色保活:不同的app程序,用廣播相互喚醒(包括利用系統提供的廣播進行喚醒)
- 白色保活:啟動前臺Service
- 灰色保活:利用系統的漏洞啟動前臺Service
黑色保活
利用不同的app程序使用廣播來進行相互喚醒。舉個3個比較常見的場景:
- 1.開機,網路切換、拍照、拍視訊時候,利用系統產生的廣播喚醒app
- 2.接入第三方SDK也會喚醒相應的app程序,如微信sdk會喚醒微信,支付寶sdk會喚醒支付寶。由此發散開去,就會直接觸發了下面的 3
- 3.比如你手機裡裝了支付寶、淘寶、天貓等阿里系的app,那麼你開啟任意一個阿里系的app後,有可能就順便把其他阿里系的app給喚醒了
白色保活
白色保活手段非常簡單,就是呼叫系統api啟動一個前臺的Service程序,這樣會在系統的通知欄生成一個Notification,用來讓使用者知道有這樣一個app在執行著,哪怕當前的app退到了後臺。如音樂播放器就是如此
灰色保活
這種保活手段是應用範圍最廣泛。它是利用系統的漏洞來啟動一個前臺的Service程序,與普通的啟動方式區別在於,它不會在系統通知欄處出現一個Notification,看起來就如同執行著一個後臺Service程序一樣。這樣做帶來的好處就是,使用者無法察覺到你執行著一個前臺進(因為看不到Notification),但你的程序優先順序又是高於普通後臺程序的。那麼如何利用系統的漏洞呢,大致的實現思路如下:
API < 18,啟動前臺Service時直接傳入new Notification();
API >= 18,同時啟動兩個id相同的前臺Service,然後再將後啟動的Service做stop處理
熟悉Android系統的都知道,系統出於體驗和效能上的考慮,app在退到後臺時系統並不會真正的kill掉這個程序,而是將其快取起來。開啟的應用越多,後臺快取的程序也越多。在系統記憶體不足的情況下,系統開始依據自身的一套程序回收機制來判斷要kill掉哪些程序,以騰出記憶體來供給需要的app。
這套殺程序回收記憶體的機制就叫 Low Memory Killer ,它是基於Linux核心的 OOM Killer(Out-Of-Memory killer)
根據程序的重要性,可以劃分為5級:
- 前臺程序 (Foreground process)
- 可見程序 (Visible process)
- 服務程序 (Service process)
- 後臺程序 (Background process)
- 空程序 (Empty process)
瞭解完 Low Memory Killer,再科普一下oom_adj。什麼是oom_adj?它是linux核心分配給每個系統程序的一個值,代表程序的優先順序,程序回收機制就是根據這個優先順序來決定是否進行回收。對於oom_adj的作用,你只需要記住以下幾點即可:
程序的oom_adj越大,表示此程序優先順序越低,越容易被殺回收;越小,表示程序優先順序越高,越不容易被殺回收
普通app程序的oom_adj>=0,系統程序的oom_adj才可能<0
有些手機廠商把這些知名的app放入了自己的白名單中,保證了程序不死來提高使用者體驗(如微信、QQ、陌陌都在小米的白名單中)。如果從白名單中移除,他們終究還是和普通app一樣躲避不了被殺死。