Google的諸多改進(jìn)讓Android系統(tǒng)在流暢度上有了實(shí)質(zhì)性的突破,從宏觀上講,Android是越來(lái)越不卡越來(lái)越流暢,那么,在時(shí)下如此強(qiáng)大的硬件支持下,為什么還會(huì)讓很多人覺(jué)得越用越卡呢?經(jīng)常聽(tīng)到的一句話就是:“安卓越用越卡,有本事用半年再比比!”,好像真是這樣,竟然反駁不了。
自從2008年第一部Android手機(jī)發(fā)布至今,雖然在操作體驗(yàn)上一直生活在iOS陰影之下,但不可否認(rèn),Android平臺(tái)是越來(lái)越強(qiáng)大了,與iOS的差距越來(lái)越小,尤其是一向被詬病的流暢度,在Android 5.0之后更是有了質(zhì)的飛躍。如今的Android手機(jī),有著八核處理器和4GB內(nèi)存的支持,同樣也可以實(shí)現(xiàn)如絲般順滑的操作體驗(yàn)。
毫無(wú)疑問(wèn),Google的諸多改進(jìn)讓Android系統(tǒng)在流暢度上有了實(shí)質(zhì)性的突破,從宏觀上講,Android是越來(lái)越不卡越來(lái)越流暢,那么,在時(shí)下如此強(qiáng)大的硬件支持下,為什么還會(huì)讓很多人覺(jué)得越用越卡呢?經(jīng)常聽(tīng)到的一句話就是:“安卓越用越卡,有本事用半年再比比!”,好像真是這樣,竟然反駁不了。
以前,Android為什么不如iOS流暢?
以前,Android的流暢度不如iOS,其實(shí)原因也很簡(jiǎn)單:
首先,是先天不足,在Linux上跑個(gè)虛擬機(jī),再用JAVA做開(kāi)發(fā),雖然能減輕開(kāi)發(fā)負(fù)擔(dān),獲得浩瀚資源,但在后期優(yōu)化上的成本增加更多,在上期的《Android手機(jī)需要清內(nèi)存嗎?》中提過(guò),Java沒(méi)有提供任何操作來(lái)釋放內(nèi)存(iOS的開(kāi)發(fā)語(yǔ)言O(shè)bject C能自行控制內(nèi)存釋放),是通過(guò)系統(tǒng)的內(nèi)存回收機(jī)制來(lái)進(jìn)行管理,但內(nèi)存回收是個(gè)雙刃劍,GC(Garbage Collection,垃圾回收)時(shí)所有線程都要暫停,也就是所謂的卡頓。
其次,是后天開(kāi)放帶來(lái)的混亂,強(qiáng)制與封閉,給iOS的應(yīng)用帶來(lái)了高度的統(tǒng)一和標(biāo)準(zhǔn),而開(kāi)放的Android必然帶來(lái)混亂這樣的負(fù)面效果。碎片化是眾所周知的惡果,一些應(yīng)用為了兼容更多舊款設(shè)備,只得繼續(xù)使用低level的API,如微信,現(xiàn)在還使用的是API level 9,就是為了能在Android 2.3系統(tǒng)上使用,而Android 5.1支持的API level已達(dá)到22了,效率上顯然大打折扣,除此之外,開(kāi)發(fā)上的開(kāi)放性更是一個(gè)非常大的隱患,這也是今天要談的主要問(wèn)題。
iOS為了流暢度,其實(shí)做了非常多的妥協(xié)來(lái)?yè)Q取用戶體驗(yàn)上的好感,比如墓碑式內(nèi)存管理、優(yōu)先UI渲染等,Google在2012年提出了黃油計(jì)劃(Project Butter),開(kāi)始著手解決Android卡頓這個(gè)老大難問(wèn)題,并從Android 5.0開(kāi)始,將Dalvik虛擬機(jī)全面轉(zhuǎn)向ART虛擬機(jī),后者在安裝應(yīng)用的時(shí)候會(huì)進(jìn)行預(yù)編譯,將代碼轉(zhuǎn)換為機(jī)器語(yǔ)言存儲(chǔ)在本地,這樣在運(yùn)行程序時(shí)就不用每次都編譯一次,執(zhí)行效率得到大大提升,同時(shí),新的ART模式也降低了每次GC的時(shí)間,一些額外的優(yōu)化也可以避免GC的頻繁發(fā)生。
Google的這些努力讓Android系統(tǒng)在流暢度上有了實(shí)質(zhì)性的突破,總的來(lái)說(shuō),Android是越來(lái)越不卡越來(lái)越流暢,那么,在如今這么強(qiáng)大的硬件支持下,為什么依然會(huì)讓很多人覺(jué)得越用越卡呢?
現(xiàn)在,Android越用越卡:APP在后臺(tái)不斷重生
到了今天,隨著硬件的發(fā)展及系統(tǒng)的不斷改良優(yōu)化,Android架構(gòu)上的先天不足已經(jīng)是影響甚微,這從那些大廠旗艦新機(jī)的表現(xiàn)就足以證明了,秒開(kāi)、流暢、順滑……絕不輸于同級(jí)別的iPhone。但是,這通常是指新機(jī)出廠狀態(tài)下的表現(xiàn),如果裝上幾十個(gè)國(guó)產(chǎn)APP,情況就很可能會(huì)發(fā)生些變化——流暢度明顯下降了,用戶開(kāi)始感覺(jué)卡了。
顯然,問(wèn)題出在這些APP上,前面說(shuō)過(guò),Android的開(kāi)放是把雙刃劍,在自由的背后往往潛伏著危險(xiǎn),善惡存乎一心,開(kāi)發(fā)商掌控著進(jìn)退大權(quán),而以國(guó)產(chǎn)軟件開(kāi)發(fā)商的秉性,搶占市場(chǎng)、提升APP的活躍度往往是最重要的,既然我不流氓別人也會(huì)流氓,我為什么不更流氓呢?
Android應(yīng)用開(kāi)發(fā)有四大組件,廣播接收器(BroadcastReceiver,以下簡(jiǎn)稱Receiver)就是其中之一,它用來(lái)接收來(lái)自系統(tǒng)和應(yīng)用中的廣播,你也可以理解它是一個(gè)監(jiān)聽(tīng)器,比如當(dāng)電量變化時(shí),系統(tǒng)會(huì)產(chǎn)生一條廣播,接收到這條廣播就能在電量低時(shí)告知用戶保存進(jìn)度或進(jìn)入省電模式等;當(dāng)有電話進(jìn)來(lái),也會(huì)產(chǎn)生一條廣播,就會(huì)通知電話接聽(tīng)或電話號(hào)碼判斷等。
在Android中,全局的Receiver就近百種,可以監(jiān)聽(tīng)各色各樣的狀態(tài)變化,比如開(kāi)關(guān)機(jī)、通電斷電、網(wǎng)絡(luò)狀態(tài)變化、電量變化、安裝卸載應(yīng)用、電話呼出呼入、SD卡變化等。開(kāi)放的Android允許應(yīng)用程序注冊(cè)任意個(gè)Receiver, 這也成為流氓應(yīng)用滋生的溫床,不良的開(kāi)發(fā)者向系統(tǒng)注冊(cè)多個(gè)靜態(tài)Receiver,接受各種廣播通知,然后執(zhí)行相應(yīng)的Activity,比如自啟動(dòng)。
Android越用越卡的主要原因在于,后臺(tái)有大量應(yīng)用在默默運(yùn)行,而這些應(yīng)用根本就是清理不掉的,它們會(huì)在收到各種各樣的Receiver通知后并再度啟動(dòng),我能想到最好的描述就是“野火燒不盡,春風(fēng)吹又生”。作為對(duì)比,iOS中被殺掉的后臺(tái)進(jìn)程再啟動(dòng)的方法很有限,簡(jiǎn)單來(lái)說(shuō),iOS是真的能清理內(nèi)存,而Android中許多應(yīng)用揮之不去,不斷重生,各種進(jìn)程與服務(wù)在后臺(tái)偷偷運(yùn)行,從而引起系統(tǒng)卡頓與耗電,其實(shí)又有幾個(gè)開(kāi)發(fā)商會(huì)為你手機(jī)的電池著想呢?
Android不良應(yīng)用的重生,主要有兩種途徑:自啟動(dòng)和關(guān)聯(lián)喚醒。
你想都想不到的自啟動(dòng)
對(duì)于自啟動(dòng),可能在我們意識(shí)里它就等同于開(kāi)機(jī)自動(dòng)運(yùn)行,在Windows環(huán)境下倒也不錯(cuò),但在Android環(huán)境中還這么理解可就太小瞧它了,開(kāi)機(jī)自動(dòng)運(yùn)行只是眾多自啟動(dòng)方式中的一種。在Windows中,你關(guān)閉某個(gè)軟件后,它基本上不會(huì)再自行啟動(dòng)了,然而Android中由于有Receiver這種機(jī)制,讓APP自啟動(dòng)變得很容易。
光說(shuō)不夠形象,我們還是來(lái)點(diǎn)具體實(shí)例,看看國(guó)外APP與國(guó)內(nèi)APP的節(jié)操對(duì)比:
作為同類型的電商APP,eBay只有在收到三種Receiver后可能會(huì)啟動(dòng),而且這三種都是比較規(guī)范的,反觀“手機(jī)淘寶”,共有九種自啟動(dòng)行為,除了eBay那三種外,還可能在收到應(yīng)用卸載等六種Receiver后啟動(dòng),我們不禁要問(wèn),用戶設(shè)置時(shí)間、卸載應(yīng)用和你淘寶應(yīng)用有半毛錢關(guān)系?
很可惜,國(guó)外的APP在國(guó)內(nèi)基本沒(méi)辦法用,而國(guó)內(nèi)的產(chǎn)品不管是優(yōu)秀的APP還是山寨國(guó)外的APP,大多數(shù)以搶占市場(chǎng)、提高應(yīng)用活躍度為主,拼著命變著法子讓自家APP處于活動(dòng)狀態(tài),一鍵清理內(nèi)存還有什么用呢,過(guò)幾分鐘又如野草般齊刷刷地長(zhǎng)了出來(lái)。其實(shí)“手機(jī)淘寶”這個(gè)APP還算好的,更變態(tài)的可謂大有人在:
由上圖可見(jiàn),百度云APP具有高達(dá)19種自啟動(dòng)行為,包括:打電話、發(fā)短信、充電、連網(wǎng)、換個(gè)WIFI等等,這些日常的手機(jī)操作,都能讓百度云不斷重生自啟,與你如影隨行,而且是隱蔽不可見(jiàn)的。
另外,當(dāng)你接到電話(呼入電話Receiver)后,還會(huì)發(fā)生下面這些事:
當(dāng)你收到短信(接收短信Receiver)時(shí),還會(huì)發(fā)生這些事:
打電話本是最基本的手機(jī)應(yīng)用功能,但是當(dāng)你打電話/發(fā)短信時(shí),后臺(tái)早已是波濤洶涌。除了一些應(yīng)用會(huì)完成自啟行為外,還可能會(huì)喚醒其它的應(yīng)用,如收到短信時(shí)“支付寶”會(huì)自啟動(dòng),“支付寶”啟動(dòng)后還會(huì)喚醒“手機(jī)淘寶”,這就是大家平常所說(shuō)的“全家桶”,也就是APP重生的另一途徑——關(guān)聯(lián)喚醒。
打虎親兄弟的關(guān)聯(lián)喚醒
關(guān)聯(lián)喚醒大家多少有些了解,也是極具中國(guó)特色的產(chǎn)物,簡(jiǎn)單地講就是當(dāng)一款應(yīng)用啟動(dòng)后,它會(huì)在后臺(tái)偷偷啟動(dòng)另一款應(yīng)用,基本上這些應(yīng)用都有裙帶關(guān)系,以我們耳熟能詳?shù)陌俣认?、阿里系為代表,真是?yīng)了“打虎親兄弟,上陣父子兵”那句話。
上圖中,當(dāng)運(yùn)行“百度地圖”時(shí),后臺(tái)會(huì)打開(kāi)“百度云”,當(dāng)運(yùn)行“手機(jī)淘寶時(shí)”,“支付寶”也同時(shí)在后臺(tái)開(kāi)啟,這些都是你看不見(jiàn)的,你手機(jī)中的APP越多,那么可能被關(guān)聯(lián)喚醒的APP就會(huì)越多。
如果你不怕卡到“死”,裝了百度這一系列APP,就會(huì)出現(xiàn)以下很熱鬧的情形:
當(dāng)你打開(kāi)“百度地圖”后,百度系的其它APP會(huì)連環(huán)喚醒(我這個(gè)手機(jī)上喚醒了八款,因?yàn)橹谎b了這么多,像百度手機(jī)助手、愛(ài)奇藝視頻都能被喚醒),首先“百度地圖”會(huì)喚醒“百度云”,“百度云”緊接著會(huì)喚醒“手機(jī)百度”和“百度視頻”,然后“百度視頻”不遺余力地喚醒幾個(gè)好兄弟“百度新聞”、“百度音樂(lè)”、“百度貼吧”、“百度瀏覽器”和“百度糯米”。對(duì)于手機(jī)系統(tǒng)來(lái)說(shuō),這樣的局面真的是很無(wú)助。
一人得道,雞犬升天,“全家桶”實(shí)在是形容得太貼切了。不過(guò)說(shuō)實(shí)在的,關(guān)聯(lián)喚醒的APP畢竟都沾親帶故,主要集中于那幾大派系,和無(wú)處不在的自啟動(dòng)相比,關(guān)聯(lián)喚醒的影響相對(duì)還要小一些。
面對(duì)野火燒不盡的重生式APP,怎么辦?
面對(duì)這些不斷重生的APP,手動(dòng)清理內(nèi)存顯然是起不到什么太大作用,剛清理了它又啟動(dòng)了,沒(méi)辦法從根本上至少是很大程度上制約這些流氓APP頻繁地被喚醒。好在這種現(xiàn)象已引起了極大關(guān)注,有些手機(jī)ROM已開(kāi)始著手從底層來(lái)解決這些問(wèn)題,像最新的魅族Flyme 5就能手動(dòng)切斷關(guān)聯(lián)喚醒,算是邁進(jìn)了一小步。
當(dāng)然,不管你用的手機(jī)ROM是不是作了針對(duì)性改進(jìn),都可以參考以下的解決方法,讓自啟動(dòng)的負(fù)面影響降到最?。?/p>
1、盡量不要安裝使用頻率極低的APP,對(duì)于百度系、阿里系、騰訊系等產(chǎn)品,盡量選用可替換的應(yīng)用,如“百度瀏覽器”、“百度視頻”等都可以考慮棄之不用。
2、對(duì)于高級(jí)玩家,推薦Xposed框架 + 綠色守護(hù)的解決方案。
綠色守護(hù)除了日常的應(yīng)用休眠外,其深度休眠能更大程序上保證APP不被關(guān)聯(lián)喚醒,雖然還是有可能被喚醒,但是不用擔(dān)心,被喚醒的APP會(huì)被繼續(xù)休眠。綠色守護(hù)是Android手機(jī)必裝“神器”之一,它更像一個(gè)內(nèi)存無(wú)限清理工具,啟動(dòng)多少清理多少(只清理指定的應(yīng)用),以不變應(yīng)萬(wàn)變,能應(yīng)付各種疑難雜癥,有效改善系統(tǒng)的流暢性與續(xù)航能力,非常值得推薦,只是它需要Xposed框架配合,安裝上對(duì)普通用戶小有難度。
3、如果你覺(jué)得Xposed框架安裝起來(lái)比較麻煩,還可以直接使用一些第三方管理工具,這里推薦360衛(wèi)士極客版,它能主動(dòng)禁止掉每個(gè)APP的自啟動(dòng)行為和切斷喚醒,理論上效果更好,就是需要有針對(duì)的進(jìn)行操作。可能你對(duì)360系也比較抵觸,不過(guò)用用會(huì)覺(jué)得也蠻不錯(cuò)的,實(shí)在不喜歡,就用LBE試試。
Android手機(jī)為什么越用越卡,相信看完這篇文章的朋友心中自會(huì)有答案,Android系統(tǒng)上先天不足的影響現(xiàn)在已經(jīng)微不足道了,主要原因還是開(kāi)放性造成的混亂,國(guó)產(chǎn)APP的不良行為(各種自啟、關(guān)聯(lián)喚醒)成為越用越卡的罪魅禍?zhǔn)?,通過(guò)上面的解決方法可以讓負(fù)面影響最小化,你的手機(jī)能再現(xiàn)流暢順滑。但是要從根本上解決這些問(wèn)題,我們真的需要一個(gè)安靜的APP,不要在后臺(tái)各種“為非作歹”,幾時(shí)Android的應(yīng)用能像iOS應(yīng)用那般規(guī)范標(biāo)準(zhǔn),一統(tǒng)天下就指日可待了。另外,除了各種應(yīng)用在后臺(tái)自啟或喚醒外,國(guó)內(nèi)APP的消息推送機(jī)制也是一大奇葩,同樣會(huì)影響到系統(tǒng)的流暢與續(xù)航,限于篇幅,我們下次再聊這個(gè)話題。