Android進程保活那些梗

前言

什么?面試官又問了進程?;??你又是一臉尷尬地說不知道?然后又讓你回去等消息?
好吧,不能老這樣,學而時習之,習而記筆記,今天整理一下進程?;钅切┕?,下次面試不再懵逼。

概念

一些必須的基礎概念QA。

Q: ?;??什么意思?
A:意思是:讓app進程沒有那么容易被系統(tǒng)殺死.

Q:系統(tǒng)為什么要殺進程?
A:Android有LMK(low memory killer)機制---------當系統(tǒng)的可用內(nèi)存剩余太少的時候,系統(tǒng)就會根據(jù) 進程回收機制來 殺掉一些進程,來騰出內(nèi)存空間給需要內(nèi)存的app。

Q:系統(tǒng)什么時候殺進程?
A: 不同的手機,存在不同的內(nèi)存閾值,比如我打開SDK自帶的模擬器,輸入命令(并不是所有手機上都能使用此命令,因為大部分真機不開放su權(quán)限):

image.png

就會得到 上面的5個數(shù)字,這幾個數(shù)字的意思就是 當系統(tǒng)的可用內(nèi)存下降到 其中一個值 乘以 4KB的大小的時候,就會殺掉一批進程。

貼一張進程優(yōu)先級的官方圖:

image.png

上面5個數(shù)字,從左到右對應了 前臺進程,可見進程服務進程,后臺進程,空進程
當可用內(nèi)存低于 18432*4KB=72M的時候,就會去殺死前臺進程,以保證系統(tǒng)正常運行, 而 低于 80640*4KB= 315M 的時候,就會殺死空進程.

Q:怎么查看進程的被殺優(yōu)先級?
A: Android系統(tǒng)中的進程都有一個adj值,它代表 進程的被殺優(yōu)先級,這個值數(shù)字越高越容易被系統(tǒng)殺掉!查看這個值的方法為(也不用到真機上試驗了,大部分真機都不開放該目錄的訪問權(quán)限,要試驗就用模擬器吧,雖然模擬器也不一定行):

image.png

Android系統(tǒng)中的進程adj值,是AMS(ActivityManagerService)去計算的,AMS通過一系列參數(shù)(比如應用的當前狀態(tài)等)的計算,最終得出adj值,并決定要不要kill掉這個進程.
ps:作為應用層面的開發(fā)工程師,我們不去做ROM,對這一塊,知其然就行了,就算想去深究,也用不到實處。

Q: ?;钣心膸追N常用方式?優(yōu)缺點都是啥?
A:上面說了,要想讓進程沒那么容易被殺,就要想辦法提高進程優(yōu)先級,比如 .
常見保活方式兩類:
第一類欺騙系統(tǒng),在我們的app退到后臺之后,讓系統(tǒng)以為 app還在前臺
1像素?;?/strong>/前臺服務保活
第二類: 如果還是app進程還是不幸被殺,那就想辦法再啟動它,整個可稱之為 拉活,然后你的應用就變成了僵尸病毒,殺一次復活一次,囧 !
粘性廣播拉活/賬戶同步拉活/JobScheduler拉活

Q:說句公道話
A:所謂保活,就是 利用安卓系統(tǒng)的bug,欺騙系統(tǒng),讓系統(tǒng)以為我們的app優(yōu)先級處于安全范圍內(nèi),不去殺,或者 讓系統(tǒng)以為我們的app已經(jīng)死了,但是其實還沒死。說到底,都是流氓手段,試想,如果你的手機上全都是 無限?;畹腶pp,你的手機應該會報廢吧。但是大家知道,國人都是很精明的,國內(nèi)手機廠商也是,你要app開發(fā)商要?;?,那我手機廠商就堵死你?;畹囊磺型緩剑ㄈA為,小米,oppo,vivo)。
但是盡管如此有些面試官(我們就不糾結(jié)是哪些人了)還是會去問這些問題,既然有市場需求,我們還是不能免俗,學一學總歸沒有壞處。

如何保活

?;罘绞?:1像素?;?/h5>

在屏幕熄滅的時候,偷偷創(chuàng)建一個Activity,它是全透明的,內(nèi)容只是左上角有一個像素,這樣,我們的app就會在屏幕熄滅時,被系統(tǒng)認為是前臺進程,處于最安全的級別。然后在 屏幕亮起的時候,偷偷關閉這個1像素Activity,假裝無事發(fā)生....

保活方式2:前臺服務?;?/h5>

同樣是欺騙系統(tǒng)的手段,它偷偷地開啟一個ForegroundService(不知道這是個啥玩意?玩過網(wǎng)易云音樂吧?你把app退到后臺,音樂依然在播放,在通知欄你可以看到它的前臺服務,對就是那玩意)。但是并不是所有app都想讓人看到它在通知欄里面有這么一個消息,所以, 讓這個消息消失吧。
4.3以下,沒有這個通知欄的消息,4.3到7.0,會看到整個消息,但是谷歌寫了一個bug,我們可以開啟兩個serviceId一樣的前臺進程,然后關閉其中一個,然后通知欄里面的消息就消失了。而7.0以后,也就是8.0開始,谷歌把bug修復了,所以說,前臺服務?;钤?.0以上的手機上,永遠會有這么一個通知欄的消息,如果你覺得無所謂,那就可以不在意,如果你是偷偷摸摸的?;?,不想讓人發(fā)現(xiàn),還是不要使用這個方法的好 。

如果實在是保不住呢?那就拉活吧

拉活方式1: 粘性廣播拉活

放棄吧,谷歌對于廣播的控制越來越嚴格,基本上GG,不用想了

拉活方式2: 賬戶同步拉活

這是谷歌自己的賬戶同步機制,利用這個機制,可以很穩(wěn)定地實現(xiàn)進程拉活,但是 既然是利用系統(tǒng)的機制來拉活,控制權(quán)就不在我們自己手上,什么時候活,不知道。而且,國內(nèi)對于原生系統(tǒng)的改造力度很大,有些手機上注定就是不能賬戶拉活,沒辦法。

拉活方式3: JobService拉活

類似定時器,開啟一個Service,它是一個由系統(tǒng)調(diào)用完成的定時器,定期檢測進程是不是活的,不是活的就嘗試拉活。

參考代碼:https://github.com/18598925736/MyKeep

就寫到這里吧

從上面的文字中,大家應該可以看出,在國內(nèi)環(huán)境,要做保活,實在是惡心,各種改系統(tǒng)的手機廠家,要求我們做很多兼容設定,其實心里話,不是很想做?;畹男枨?。但是,拉活保活的概念,我們還是要有的。

上面的github地址,是上面5個 ?;罾罘绞降氖纠a,我不保證能夠運行(因為手機系統(tǒng)兼容性),但是有興趣的可以拿去參考看一看。最后,聽說,jetpack上有?;畹膸炜梢允褂茫€沒去看過,以后有空再說吧 。歐了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容