操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    今天的話題比較敏感,關(guān)于 進(jìn)程如何保活。

    一方面非常之多的 應(yīng)用有這方面的需求并實(shí)際應(yīng)用,另一方面很多應(yīng)用在保活這條道上一路走到黑,罔顧對(duì)能耗與用戶體驗(yàn)的影響,也是造成 平臺(tái)被用戶詬病的原因之一,因此一開始收到這篇投稿,是否推送給大家也是有猶豫。

    我其實(shí)比較能理解保活背后的動(dòng)因,只需一些簡(jiǎn)單的代碼,就能給產(chǎn)品關(guān)鍵指標(biāo)帶來非常大的提升,這筆賬不難算,無怪乎幾乎所有大廠都在應(yīng)用各種保活方案。

    另外一個(gè)比較現(xiàn)實(shí)的問題是 原生的推送方案因?yàn)楸娝苤脑蛟趪?guó)內(nèi)無法普及,也導(dǎo)致各種三方推送服務(wù)不得不想方設(shè)法謀求永生,很多IM應(yīng)用也有這方面的強(qiáng)需求,相信大部分人都不希望錯(cuò)過微信消息提醒。

    我個(gè)人以為,一味去譴責(zé)所有做保活方案的同行們,未免過于苛責(zé),至少應(yīng)該先涉法了解其中的技術(shù)細(xì)節(jié),各種方案的優(yōu)劣,對(duì)系統(tǒng)、對(duì)用戶的影響,盡可能在現(xiàn)實(shí)需要與用戶體驗(yàn)之間謀求平衡ps 查看進(jìn)程啟動(dòng)時(shí)間,盡量說服對(duì)技術(shù)不了解的同事們。比如絕大多數(shù)應(yīng)用我不認(rèn)為有必要保活,該生生該死死,交給系統(tǒng)決定就好。

    今天 Clock 同學(xué)的這篇文章,就來自于他的學(xué)習(xí)總結(jié),比較全面地介紹各種進(jìn)程保活方案,早前微信的同學(xué)也發(fā)過一篇保活文章,其中提到過拆分進(jìn)程的保活方案,因與業(yè)務(wù)結(jié)合較為緊密,本文并無介紹。有興趣的同學(xué)也可自行搜索了解。

    Clock 同學(xué)的文章傳閱度都很高,是我認(rèn)識(shí)的比較善于寫文章的同學(xué)之一,有興趣的同學(xué)也可以看看他之前的投稿文章:

    早前,我在知乎上回答了這樣一個(gè)問題:怎么讓 程序一直后臺(tái)運(yùn)行,像 一樣不被殺死?

    關(guān)于 平臺(tái)的進(jìn)程保活這一塊,想必是所有 開發(fā)者矚目的內(nèi)容之一。你到網(wǎng)上搜 進(jìn)程保活,可以搜出各種各樣神乎其技的做法,絕大多數(shù)都是極其不靠譜。前段時(shí)間,還出現(xiàn)了一個(gè)很火的“黑科技”進(jìn)程保活庫(kù),聲稱可以做到進(jìn)程永生不死。

    懷著學(xué)習(xí)和膜拜的心情進(jìn)去圍觀,結(jié)果發(fā)現(xiàn)很多人提了 Issue 說各種各樣的機(jī)子無法成功保活。

    看到這里,我瞬間就放心了。坦白的講,我是真心不希望有這種黑科技存在的,它只會(huì)滋生更多的流氓應(yīng)用,拖垮我大 平臺(tái)的流暢性。

    扯了這么多,接下來就直接進(jìn)入本文的正題,談?wù)勱P(guān)于進(jìn)程保活的知識(shí)。提前聲明以下四點(diǎn)

    保活手段

    當(dāng)前業(yè)界的進(jìn)程保活手段主要分為 黑、白、灰 三種,其大致的實(shí)現(xiàn)思路如下:

    黑色保活:不同的app進(jìn)程,用廣播相互喚醒(包括利用系統(tǒng)提供的廣播進(jìn)行喚醒)

    linux ps 命令查看進(jìn)程_linux 命令行啟動(dòng)進(jìn)程_ps 查看進(jìn)程啟動(dòng)時(shí)間

    白色保活:?jiǎn)?dòng)前臺(tái)

    灰色保活:利用系統(tǒng)的漏洞啟動(dòng)前臺(tái)

    黑色保活

    所謂黑色保活,就是利用不同的app進(jìn)程使用廣播來進(jìn)行相互喚醒。舉個(gè)3個(gè)比較常見的場(chǎng)景:

    場(chǎng)景1:開機(jī),網(wǎng)絡(luò)切換、拍照、拍視頻時(shí)候,利用系統(tǒng)產(chǎn)生的廣播喚醒a(bǔ)pp

    場(chǎng)景2:接入第三方SDK也會(huì)喚醒相應(yīng)的app進(jìn)程,如微信sdk會(huì)喚醒微信,支付寶sdk會(huì)喚醒支付寶。由此發(fā)散開去,就會(huì)直接觸發(fā)了下面的 場(chǎng)景3

    場(chǎng)景3:假如你手機(jī)里裝了支付寶、淘寶、天貓、UC等阿里系的app,那么你打開任意一個(gè)阿里系的app后,有可能就順便把其他阿里系的app給喚醒了。(只是拿阿里打個(gè)比方,其實(shí)BAT系都差不多)

    沒錯(cuò),我們的手機(jī)就是一步一步的被上面這些場(chǎng)景給拖卡機(jī)的。

    針對(duì)場(chǎng)景1,估計(jì)已經(jīng)開始意識(shí)到這些問題,所以在最新的 N取消了 (拍照),(拍視頻),(網(wǎng)絡(luò)切換)等三種廣播,無疑給了很多app沉重的打擊。我猜他們的心情是下面這樣的

    而開機(jī)廣播的話,記得有一些定制ROM的廠商早已經(jīng)將其去掉。

    針對(duì)場(chǎng)景2和場(chǎng)景3,因?yàn)檎{(diào)用SDK喚醒a(bǔ)pp進(jìn)程屬于正常行為,此處不討論。但是在借助LBE分析app之間的喚醒路徑的時(shí)候,發(fā)現(xiàn)了兩個(gè)問題:

    很多推送SDK也存在喚醒a(bǔ)pp的功能

    app之間的喚醒路徑真是多,且錯(cuò)綜復(fù)雜

    我把自己使用的手機(jī)測(cè)試結(jié)果給大家圍觀一下(我的手機(jī)是小米4C,刷了原生的.1系統(tǒng),且已經(jīng)獲得Root權(quán)限才能查看這些喚醒路徑)

    linux 命令行啟動(dòng)進(jìn)程_ps 查看進(jìn)程啟動(dòng)時(shí)間_linux ps 命令查看進(jìn)程

    15組相互喚醒路徑

    全部喚醒路徑

    我們直接點(diǎn)開 簡(jiǎn)書 的喚醒路徑進(jìn)行查看

    可以看到以上3條喚醒路徑,但是涵蓋的喚醒應(yīng)用總數(shù)卻達(dá)到了23+43+28款,數(shù)目真心驚人。請(qǐng)注意,這只是我手機(jī)上一款app的喚醒路徑而已,到了這里是不是有點(diǎn)細(xì)思極恐。

    當(dāng)然,這里依然存在一個(gè)疑問,就是LBE分析這些喚醒路徑和互相喚醒的應(yīng)用是基于什么思路,我們不得而知。所以我們也無法確定其分析結(jié)果是否準(zhǔn)確,如果有LBE的童鞋看到此文章,不知可否告知一下思路呢?但是,手機(jī)打開一個(gè)app就喚醒一大批,我自己可是親身體驗(yàn)到這種酸爽的……

    白色保活

    白色保活手段非常簡(jiǎn)單,就是調(diào)用系統(tǒng)api啟動(dòng)一個(gè)前臺(tái)的進(jìn)程,這樣會(huì)在系統(tǒng)的通知欄生成一個(gè),用來讓用戶知道有這樣一個(gè)app在運(yùn)行著,哪怕當(dāng)前的app退到了后臺(tái)。

    如下方的LBE和QQ音樂這樣:

    灰色保活

    灰色保活,這種保活手段是應(yīng)用范圍最廣泛。它是利用系統(tǒng)的漏洞來啟動(dòng)一個(gè)前臺(tái)的進(jìn)程,與普通的啟動(dòng)方式區(qū)別在于,它不會(huì)在系統(tǒng)通知欄處出現(xiàn)一個(gè),看起來就如同運(yùn)行著一個(gè)后臺(tái)進(jìn)程一樣。這樣做帶來的好處就是,用戶無法察覺到你運(yùn)行著一個(gè)前臺(tái)進(jìn)程(因?yàn)榭床坏剑?但你的進(jìn)程優(yōu)先級(jí)又是高于普通后臺(tái)進(jìn)程的。那么如何利用系統(tǒng)的漏洞呢,大致的實(shí)現(xiàn)思路和代碼如下:

    linux 命令行啟動(dòng)進(jìn)程_linux ps 命令查看進(jìn)程_ps 查看進(jìn)程啟動(dòng)時(shí)間

    public class GrayService extends Service {

    ? ?private final static int GRAY_SERVICE_ID = 1001;

    ? ?@Override
    ? ?public int onStartCommand(Intent intent, int flags, int startId) {

    ? ? ? ?if (Build.VERSION.SDK_INT < 18) {
    ? ? ? ? ? ?//API < 18 ,此方法能有效隱藏Notification上的圖標(biāo)
    ? ? ? ? ? ?startForeground(GRAY_SERVICE_ID, new Notification());
    ? ? ? ?} else {
    ? ? ? ? ? ?Intent innerIntent = new Intent(this, GrayInnerService.class);
    ? ? ? ? ? ?startService(innerIntent);
    ? ? ? ? ? ?startForeground(GRAY_SERVICE_ID, new Notification());
    ? ? ? ?}
    ? ? ? ?
    ? ? ? ?return super.onStartCommand(intent, flags, startId);
    ? ?}
    ? ?
    ? ?...
    ? ?...
    ? ?
    ? ?/**
    ? ? * 給 API >= 18 的平臺(tái)上用的灰色保活手段
    ? ? */
    ? ?public static class GrayInnerService extends Service {
    ? ?
    ? ? ? ?@Override
    ? ? ? ?public int onStartCommand(Intent intent, int flags, int startId) {
    ? ?
    ? ? ? ? ? ?startForeground(GRAY_SERVICE_ID, new Notification());
    ? ? ? ? ? ?stopForeground(true);
    ? ? ? ? ? ?stopSelf();
    ? ? ? ? ? ?return super.onStartCommand(intent, flags, startId);
    ? ? ? ?}
    ? ?}
    }

    代碼大致就是這樣,能讓你神不知鬼不覺的啟動(dòng)著一個(gè)前臺(tái)。其實(shí)市面上很多app都用著這種灰色保活的手段,什么?你不信?好吧,我們來驗(yàn)證一下。流程很簡(jiǎn)單,打開一個(gè)app,看下系統(tǒng)通知欄有沒有一個(gè) ,如果沒有ps 查看進(jìn)程啟動(dòng)時(shí)間,我們就進(jìn)入手機(jī)的adb shell模式,然后輸入下面的shell命令

    dumpsys activity services PackageName

    打印出指定包名的所有進(jìn)程中的信息,看下有沒有 =true 的關(guān)鍵信息。如果通知欄沒有看到屬于app的 且又看到 =true 則說明了,此app利用了這種灰色保活的手段。

    下面分別是我手機(jī)上微信、qq、支付寶、陌陌的測(cè)試結(jié)果,大家有興趣也可以自己驗(yàn)證一下。

    微信

    手Q

    支付寶

    陌陌

    其實(shí)察覺到了此漏洞的存在,并逐步進(jìn)行封堵。這就是為什么這種保活方式分 API >= 18 和 API < 18 兩種情況,從.0的類的函數(shù)源代碼中可以看到這樣的一行注釋

    ps 查看進(jìn)程啟動(dòng)時(shí)間_linux ps 命令查看進(jìn)程_linux 命令行啟動(dòng)進(jìn)程

    當(dāng)某一天 API >= 18 的方案也失效的時(shí)候,我們就又要另謀出路了。需要注意的是,使用灰色保活并不代表著你的就永生不死了,只能說是提高了進(jìn)程的優(yōu)先級(jí)。如果你的app進(jìn)程占用了大量的內(nèi)存,按照回收進(jìn)程的策略,同樣會(huì)干掉你的app。感興趣于灰色保活是如何利用系統(tǒng)漏洞不顯示 的童鞋,可以研究一下系統(tǒng)的 、 等相關(guān)源代碼,因?yàn)椴皇潜疚牡闹攸c(diǎn),所以不做詳述。

    嘮叨的分割線

    到這里基本就介紹完了 黑、白、灰 三種實(shí)現(xiàn)方式,僅僅從代碼層面去講保活是不夠的,我希望能夠通過系統(tǒng)的進(jìn)程回收機(jī)制來理解保活,這樣能夠讓我們更好的避免踩到進(jìn)程被殺的坑。

    進(jìn)程回收機(jī)制

    熟悉系統(tǒng)的童鞋都知道,系統(tǒng)出于體驗(yàn)和性能上的考慮,app在退到后臺(tái)時(shí)系統(tǒng)并不會(huì)真正的kill掉這個(gè)進(jìn)程,而是將其緩存起來。打開的應(yīng)用越多,后臺(tái)緩存的進(jìn)程也越多。在系統(tǒng)內(nèi)存不足的情況下,系統(tǒng)開始依據(jù)自身的一套進(jìn)程回收機(jī)制來判斷要kill掉哪些進(jìn)程,以騰出內(nèi)存來供給需要的app。這套殺進(jìn)程回收內(nèi)存的機(jī)制就叫 Low ,它是基于Linux內(nèi)核的 OOM (Out-Of- )機(jī)制誕生。

    了解完 Low ,再科普一下。什么是?它是linux內(nèi)核分配給每個(gè)系統(tǒng)進(jìn)程的一個(gè)值,代表進(jìn)程的優(yōu)先級(jí),進(jìn)程回收機(jī)制就是根據(jù)這個(gè)優(yōu)先級(jí)來決定是否進(jìn)行回收。對(duì)于的作用,你只需要記住以下幾點(diǎn)即可:

    那么我們?nèi)绾尾榭催M(jìn)程的值呢,需要用到下面的兩個(gè)shell命令

    ps | grep PackageName //獲取你指定的進(jìn)程信息

    這里是以我寫的demo代碼為例子,紅色圈中部分別為下面三個(gè)進(jìn)程的ID

    UI進(jìn)程:com.clock.

    普通后臺(tái)進(jìn)程:com.clock.:bg

    灰色保活進(jìn)程:com.clock.:gray

    當(dāng)然,這些進(jìn)程的id也可以通過獲得

    ps 查看進(jìn)程啟動(dòng)時(shí)間_linux ps 命令查看進(jìn)程_linux 命令行啟動(dòng)進(jìn)程

    接著我們來再來獲取三個(gè)進(jìn)程的

    cat /proc/進(jìn)程ID/oom_adj

    從上圖可以看到UI進(jìn)程和灰色保活進(jìn)程的=0,而普通后臺(tái)進(jìn)程=15。到這里估計(jì)你也能明白,為什么普通的后臺(tái)進(jìn)程容易被回收,而前臺(tái)進(jìn)程則不容易被回收了吧。

    但明白這個(gè)還不夠,接著看下圖

    上面是我把a(bǔ)pp切換到后臺(tái),再進(jìn)行一次的檢驗(yàn),你會(huì)發(fā)現(xiàn)UI進(jìn)程的值從0變成了6,而灰色保活的進(jìn)程則從0變成了1。這里可以觀察到,app退到后臺(tái)時(shí),其所有的進(jìn)程優(yōu)先級(jí)都會(huì)降低。但是UI進(jìn)程是降低最為明顯的,因?yàn)樗加玫膬?nèi)存資源最多,系統(tǒng)內(nèi)存不足的時(shí)候肯定優(yōu)先殺這些占用內(nèi)存高的進(jìn)程來騰出資源。所以,為了盡量避免后臺(tái)UI進(jìn)程被殺,需要盡可能的釋放一些不用的資源,尤其是圖片、音視頻之類的。

    從官方文檔中,我們也能看到優(yōu)先級(jí)從高到低列出了這些不同類型的進(jìn)程: 、 、 、 、Empty 。而這些進(jìn)程的分別是多少,又是如何掛鉤起來的呢?推薦大家閱讀下面這篇文章:

    總結(jié)(文末有福利)

    絮絮叨叨寫完了這么多,最后來做個(gè)小小的總結(jié)。回歸到開篇提到QQ進(jìn)程不死的問題,我也曾認(rèn)為存在這樣一種技術(shù)。可惜我把手機(jī)root后,殺掉QQ進(jìn)程之后就再也起不來了。有些手機(jī)廠商把這些知名的app放入了自己的白名單中,保證了進(jìn)程不死來提高用戶體驗(yàn)(如微信、QQ、陌陌都在小米的白名單中)。如果從白名單中移除,他們終究還是和普通app一樣躲避不了被殺的命運(yùn),為了盡量避免被殺,還是老老實(shí)實(shí)去做好優(yōu)化工作吧。

    所以,進(jìn)程保活的根本方案終究還是回到了性能優(yōu)化上,進(jìn)程永生不死終究是個(gè)徹頭徹尾的偽命題!

    文章到此結(jié)束,相關(guān)簡(jiǎn)單的實(shí)踐代碼請(qǐng)看

    為了感謝看完本文的童鞋,特地獻(xiàn)上福利圖片一張。。。。。。。。。請(qǐng)注意:

    如果你屏幕旁有人在,請(qǐng)謹(jǐn)慎往下觀看!!!!!!!!!

    如果你屏幕旁有人在,請(qǐng)謹(jǐn)慎往下觀看!!!!!!!!!

    如果你屏幕旁有人在,請(qǐng)謹(jǐn)慎往下觀看!!!!!!!!!

    福利

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有