自2008年第一部Android手機(jī)發(fā)布至今秽五,雖然在操作體驗(yàn)上一直生活在iOS陰影之下乖订,但不可否認(rèn)板壮,Android是越來越強(qiáng)了,與iOS的差距越來越小枝嘶,尤其是一向被詬病的流暢度帘饶,在Android 5.0之后更是有了質(zhì)的飛躍。如今的Android手機(jī)群扶,在八核處理器4GB內(nèi)存加持下及刻,一樣也可以做到如絲般的順滑,然而……竞阐、
“安卓越用越卡缴饭,有本事用半年再比比!”骆莹,好像真是這樣颗搂,竟然反駁不了。
以前幕垦,Android為什么不如iOS流暢丢氢?
以前傅联,Android的流暢度不如iOS,其實(shí)原因也很簡單:
一是先天不足疚察,在Linux上跑個(gè)虛擬機(jī)纺且,再用JAVA做開發(fā),雖然能減輕開發(fā)負(fù)擔(dān)稍浆,獲得浩瀚資源,但在后期優(yōu)化上的成本增加更多猜嘱,在上次的《Android手機(jī)需要清內(nèi)存嗎衅枫?》中提過,Java沒有提供任何操作來釋放內(nèi)存(iOS的開發(fā)語言O(shè)bject C能自行控制內(nèi)存釋放)朗伶,是通過系統(tǒng)的內(nèi)存回收機(jī)制來進(jìn)行管理弦撩,但內(nèi)存回收是個(gè)雙刃劍,GC(Gabage Collection论皆,垃圾回收)時(shí)所有線程都要暫停益楼,也就是所謂的卡頓。
二是后天開放帶來的混亂点晴,強(qiáng)制與封閉感凤,給iOS的應(yīng)用帶來了高度的統(tǒng)一和標(biāo)準(zhǔn),而開放的Android必然帶來混亂這樣的負(fù)面作用粒督,碎片化是眾所周知的惡果陪竿,一些應(yīng)用為了兼容更多舊款設(shè)備,只得繼續(xù)使用低level的API屠橄,如微信族跛,現(xiàn)在還是使用API level 9,就是為了能在Android 2.3系統(tǒng)上使用锐墙,而Android 5.1支持的API level已達(dá)到22了礁哄,效率上顯然大打折扣,除此之外溪北,開發(fā)上的開放性更是一個(gè)非常大的隱患桐绒,這也是今天要談的主要問題。
iOS為了流暢度之拨,其實(shí)做了非常多的妥協(xié)來換取用戶體驗(yàn)上的好感掏膏,比如墓碑式內(nèi)存管理、優(yōu)先UI渲染等敦锌,Google在2012年提出了黃油計(jì)劃(Project Butter)馒疹,開始著手解決Android卡頓這個(gè)老大難問題,并從Android 5.0開始乙墙,將Dalvik虛擬機(jī)全面轉(zhuǎn)向ART虛擬機(jī)颖变,后者在安裝應(yīng)用的時(shí)候會進(jìn)行預(yù)編譯生均,將代碼轉(zhuǎn)換為機(jī)器語言存儲在本地,這樣在運(yùn)行程序時(shí)就不用每次都編譯一次腥刹,執(zhí)行效率得到大大提升马胧,同時(shí),新的ART模式也降低了每次GC的時(shí)間衔峰,一些額外的優(yōu)化也可以避免GC的頻繁發(fā)生佩脊。
Google的這些作為讓Android系統(tǒng)在流暢度上有了實(shí)質(zhì)性的突破,從宏觀上講垫卤,Android是越來越不卡越來越流暢威彰,那么,在如今這么強(qiáng)大的硬件支持下穴肘,為什么還會讓很多人覺得越用越卡呢歇盼?
現(xiàn)在,Android越用越卡:APP在后臺不斷重生
到了今天评抚,隨著硬件的發(fā)展及系統(tǒng)的不斷改良優(yōu)化豹缀,Android架構(gòu)上的先天不足已經(jīng)是影響甚微,從那些旗艦新機(jī)的表現(xiàn)足以證明了慨代,秒開邢笙、流暢、順滑……絕不輸于 同級別iPhone侍匙,但是鸣剪,這通常是指出廠狀態(tài)下的表現(xiàn),如果裝上幾十個(gè)國產(chǎn)APP丈积,情況可能會發(fā)生些變化——流暢度明顯下降了筐骇,用戶開始叫卡了。
顯然問題出在這些APP上江滨,前面說過铛纬,Android的開放是把雙刃劍,在自由的背后往往潛伏著危險(xiǎn)唬滑,善惡存乎一心告唆,開發(fā)商掌控著進(jìn)退大權(quán),而以國人之尿性晶密,搶占市場擒悬、提升APP活躍度往往是最重要的,既然我不流氓別人也會流氓稻艰,我為什么不更流氓呢懂牧?
Android應(yīng)用開發(fā)有四大組件,廣播接收器(BroadcastReceiver尊勿,以下簡稱Receiver)就是其中之一僧凤,它用來接收來自系統(tǒng)和應(yīng)用中的廣播畜侦,你也可以理解它是一個(gè)監(jiān)聽器,比如當(dāng)電量變化時(shí)躯保,系統(tǒng)會產(chǎn)生一條廣播旋膳,接收到這條廣播就能在電量低時(shí)告知用戶保存進(jìn)度或進(jìn)入省電模式等;當(dāng)有電話進(jìn)來途事,也會產(chǎn)生一條廣播验懊,就會通知電話接聽或電話號碼判斷等。
在Android中尸变,全局的Receiver就近百種义图,可以監(jiān)聽各色各樣的狀態(tài)變化,比如開關(guān)機(jī)振惰、通電斷電、網(wǎng)絡(luò)狀態(tài)變化垄懂、電量變化骑晶、安裝卸載應(yīng)用、電話呼出呼入草慧、SD卡變化等桶蛔。開放的Android允許應(yīng)用程序注冊任意個(gè)Receiver, 這也成為流氓應(yīng)用滋生的溫床漫谷,不良的開發(fā)者向系統(tǒng)注冊多個(gè)靜態(tài)Receiver仔雷,接受各種廣播通知,然后執(zhí)行相應(yīng)的Activity舔示,比如自啟動(dòng)碟婆。
Android越用越卡的主要原因在于,后臺有大量應(yīng)用在默默運(yùn)行惕稻,而這些應(yīng)用根本就是清理不掉的竖共,它們會在收到各種各樣的Receiver通知后并再度啟動(dòng),我能想到最好的描述就是“野火燒不盡俺祠,春風(fēng)吹又生”公给。作為對比,iOS中被殺掉的后臺進(jìn)程再啟動(dòng)的方法很有限蜘渣,簡單的說淌铐,iOS是真的能清理內(nèi)存,而Android中許多應(yīng)用揮之不去蔫缸,不斷重生腿准,各種進(jìn)程與服務(wù)在后臺偷偷運(yùn)行,從而引起系統(tǒng)卡頓與耗電拾碌,其實(shí)又有幾個(gè)開發(fā)商會為你手機(jī)的電池著想呢释涛?
Android不良應(yīng)用的重生加叁,主要有兩種途徑:自啟動(dòng)和關(guān)聯(lián)喚醒。
你想都想不到的自啟動(dòng)
自啟動(dòng)唇撬,可能在我們意識里它就等于開機(jī)自動(dòng)運(yùn)行它匕,在Windows下倒也沒差,但在Android下你就太小瞧它了窖认,開機(jī)自動(dòng)運(yùn)行只是眾多自啟動(dòng)方式中的一種豫柬。在Windows中,你關(guān)閉某個(gè)軟件后扑浸,它基本上不會再自行啟動(dòng)了烧给,然后Android中由于有Receiver這種東東,讓自啟動(dòng)變得很容易喝噪。
國內(nèi)的不管是優(yōu)秀的APP還是山寨國外的APP础嫡,大多數(shù)以搶占市場、提高應(yīng)用活躍度為主酝惧,拼著命變著法子讓自家APP處于活動(dòng)狀態(tài)榴鼎,一鍵清理內(nèi)存還有什么用呢,過幾分鐘又如野草般齊刷刷地長了出來晚唇。
百度云APP高達(dá)19種自啟行為巫财,打電話、發(fā)短信哩陕、充電平项、連網(wǎng)、換個(gè)WIFI等等悍及,這些日常的手機(jī)操作闽瓢,都能讓百度云不斷重生自啟,與你如影隨行心赶,而且是隱蔽不可見的鸳粉。
打電話是最基本的手機(jī)功能,但是當(dāng)你打電話/發(fā)短信時(shí)园担,后臺早已是波濤洶涌届谈。除了一些應(yīng)用會完成自啟行為外,還可能會喚醒其它的應(yīng)用弯汰,如收到短信時(shí)“支付寶”會自啟動(dòng)艰山,“支付寶”啟動(dòng)后還會喚醒“手機(jī)淘寶”,這就是大家平常所說的“全家桶”咏闪,也就是APP重生的另一途徑——關(guān)聯(lián)喚醒曙搬。
打虎親兄弟的關(guān)聯(lián)喚醒
關(guān)聯(lián)喚醒大家多少有些了解,也是極具中國特色的產(chǎn)物,簡單地講就是當(dāng)一款應(yīng)用啟動(dòng)后纵装,它會在后臺偷偷啟動(dòng)另一款應(yīng)用征讲,基本上這些應(yīng)用都有裙帶關(guān)系,以臭名昭著的百度系橡娄、阿里系為代表诗箍,真是應(yīng)了“打虎親兄弟,上陣父子兵”那句話挽唉。
當(dāng)運(yùn)行“百度地圖”時(shí)滤祖,后臺會打開“百度云”,當(dāng)運(yùn)行“手機(jī)淘寶時(shí)”瓶籽,“支付寶”也同時(shí)在后臺開啟匠童,這些都是你看不見的,你手機(jī)中的APP越多塑顺,那么關(guān)聯(lián)喚醒的APP就會越多汤求。
當(dāng)你打開“百度地圖”后,百度系的其它APP會連環(huán)喚醒(我這個(gè)手機(jī)上喚醒了八款严拒,因?yàn)橹谎b了這么多扬绪,像百度手機(jī)助手、愛奇藝視頻都能被喚醒)糙俗,首先“百度地圖”會喚醒“百度云”勒奇,“百度云”緊接著會喚醒“手機(jī)百度”和“百度視頻”预鬓,然后“百度視頻”不遺余力地喚醒幾個(gè)好兄弟“百度新聞”巧骚、“百度音樂”、“百度貼吧”格二、“百度瀏覽器”和“百度糯米”
一人得道劈彪,雞犬升天,“全家桶”實(shí)在是形容得太貼切了顶猜。不過說實(shí)在的沧奴,關(guān)聯(lián)喚醒的APP畢竟都沾親帶故,主要集中于那幾大派系长窄,和無處不在的自啟動(dòng)相比滔吠,關(guān)聯(lián)喚醒的影響相對要小一些。