Android智能手機(jī)和iPhone、Windows Phone相比,前者比較占用資源是不爭(zhēng)的事實(shí),這也是為何采用該系統(tǒng)的產(chǎn)品隔年就會(huì)有較大的硬件升級(jí)。配置相似的三大系統(tǒng)如果運(yùn)行同樣的程序,Android多少會(huì)有卡頓的感覺(jué),這主要是由內(nèi)存管理機(jī)制和應(yīng)用管理機(jī)制不同造成的。
Android是和Windows操作系統(tǒng)均為典型的多后臺(tái)運(yùn)行系統(tǒng)。當(dāng)我們?cè)贏ndroid手機(jī)上開(kāi)啟(包括后臺(tái)自啟動(dòng))多個(gè)應(yīng)用的時(shí)候,除了活動(dòng)界面顯示應(yīng)用耗費(fèi)著內(nèi)存外,各種在后臺(tái)啟動(dòng)應(yīng)用同樣在耗費(fèi)著內(nèi)存。而且Android是在Linux上運(yùn)行的Java虛擬系統(tǒng),Java未能提供任何操作來(lái)釋放內(nèi)存。這樣Android系統(tǒng)本身和其上的應(yīng)用都會(huì)占用系統(tǒng)大量的可用內(nèi)存,一旦系統(tǒng)可用內(nèi)存不足,Android會(huì)激活回收機(jī)制來(lái)回收內(nèi)存,Android觸發(fā)回收機(jī)制時(shí)系統(tǒng)所有線程都要暫停,此時(shí)手機(jī)就明顯出現(xiàn)操作卡頓、甚至死機(jī)的癥狀(圖1)。

圖1 Android運(yùn)行機(jī)制圖解
iPhone、Windows Phone則使用墓碑式內(nèi)存管理,這種管理機(jī)制的特點(diǎn)是不在前臺(tái)的程序不會(huì)運(yùn)行,但系統(tǒng)也不會(huì)殺掉它,而是盡可能將其保留在內(nèi)存里。但是這些暫停的程序的優(yōu)先級(jí)非常低,就像只是在系統(tǒng)后臺(tái)立了塊墓碑,告訴系統(tǒng)“我”曾經(jīng)啟動(dòng)過(guò),只是現(xiàn)在已經(jīng)暫時(shí)死亡了。這樣當(dāng)系統(tǒng)需要內(nèi)存又發(fā)現(xiàn)可用內(nèi)存不足的時(shí)候,系統(tǒng)就會(huì)優(yōu)先殺掉它們(對(duì)于非社交類的APP,Android 6.0也開(kāi)始啟用“墓碑機(jī)制”,Android和舊版比也可以極大減少內(nèi)存的占用)(圖2)。

圖2 墓碑式內(nèi)存管理
從應(yīng)用管理機(jī)制來(lái)看,Android是開(kāi)放、開(kāi)源的操作系統(tǒng),一方面任何開(kāi)發(fā)者只要遵循開(kāi)發(fā)文檔要求就可以開(kāi)發(fā)出各種“奇葩“的應(yīng)用。如耗費(fèi)內(nèi)存元兇是各種后臺(tái)自動(dòng)啟動(dòng)服務(wù)和應(yīng)用。雖然要實(shí)現(xiàn)自啟動(dòng)必須獲得內(nèi)核服務(wù)授權(quán),但是在Android中只要遵循相應(yīng)的接口和進(jìn)行必要的權(quán)限申明,任何開(kāi)發(fā)者開(kāi)發(fā)的應(yīng)用都可以獲得授權(quán),從而造成各種耗費(fèi)資源后臺(tái)應(yīng)用的出現(xiàn),Android用戶在手機(jī)界面卻看不到這些應(yīng)用存在(而且未ROOT設(shè)備還無(wú)法對(duì)其禁止)。這樣系統(tǒng)可用內(nèi)存被各種各樣應(yīng)用無(wú)端耗費(fèi),從而導(dǎo)致Android耗費(fèi)內(nèi)存一直高居不下(圖3)。

圖3 在Android中實(shí)現(xiàn)自啟動(dòng)的各種各樣的應(yīng)用
另一方面,Android開(kāi)放性還導(dǎo)致諸多應(yīng)用做出越來(lái)越多“出格”的表現(xiàn),那就是Android應(yīng)用的各種連環(huán)啟動(dòng),這會(huì)進(jìn)一步造成內(nèi)存資源的消耗。在Android開(kāi)發(fā)中有個(gè)叫廣播接收器組件,它用來(lái)接收來(lái)自系統(tǒng)和應(yīng)用中的廣播,并在接收后會(huì)激活指定的動(dòng)作,如當(dāng)有電話進(jìn)來(lái),也會(huì)產(chǎn)生一條廣播,就會(huì)通知電話接聽(tīng)或電話號(hào)碼判斷等。但是現(xiàn)在很多應(yīng)用開(kāi)發(fā)者卻將這個(gè)功能發(fā)揮到了極限。比如一些應(yīng)用為了自己能夠隨時(shí)啟動(dòng),利用各種廣播組件來(lái)激活自身的啟動(dòng)。以百度云為例,在安裝完成后可以看到該應(yīng)用有8大項(xiàng)(多達(dá)26個(gè)小項(xiàng))的連環(huán)啟動(dòng)項(xiàng),這樣只要手機(jī)上執(zhí)行下列任何一項(xiàng)操作都會(huì)激活百度云。當(dāng)然這種軟件還有很多。這意味著Android手機(jī)上有非常多應(yīng)用會(huì)在你不經(jīng)意之間就啟動(dòng),自然會(huì)耗費(fèi)很多的內(nèi)存資源了(圖4)。

圖4 查看百度云關(guān)聯(lián)啟動(dòng)項(xiàng)
相比之下,iPhone、Windows Phone則是強(qiáng)制、封閉的系統(tǒng)。以iOS為例,對(duì)于需要在合法(如未越獄的iOS設(shè)備)設(shè)備上運(yùn)行(或者安裝)的應(yīng)用,蘋果公司使用代碼簽名(Code-signing)來(lái)進(jìn)行保護(hù)。這一限制要求所有在iOS設(shè)備上運(yùn)行的代碼都得被蘋果審核通過(guò),并且附有對(duì)應(yīng)的簽名。這樣只要不是在蘋果商店下載的應(yīng)用就無(wú)法在iOS設(shè)備上被正常使用。
另一方面,蘋果公司對(duì)應(yīng)用權(quán)限的限制非常嚴(yán)格。iOS是基于UNIX核心的系統(tǒng),它繼承UNIX系統(tǒng)完善的權(quán)限控制功能,默認(rèn)系統(tǒng)的內(nèi)核啟動(dòng)后就為當(dāng)前登錄用戶分配了適當(dāng)?shù)臋?quán)限(類似Windows下的“標(biāo)準(zhǔn)用戶”)。這個(gè)賬戶封閉了iOS應(yīng)用的提權(quán)請(qǐng)求,用戶登錄后沒(méi)有調(diào)用底層組件的權(quán)限,也沒(méi)有類似Windows 7的UAC組件可以手動(dòng)提權(quán),在系統(tǒng)內(nèi)核方面就限制應(yīng)用的權(quán)限提升。微軟WP系統(tǒng)使用同樣保護(hù)手段,這種集中式強(qiáng)制管理,可以從源頭上阻止各種惡意應(yīng)用進(jìn)入用戶的手機(jī),保證用戶手機(jī)上安裝的應(yīng)用都是合規(guī)開(kāi)發(fā)的,不會(huì)像Android手機(jī)那樣可以隨意安裝各種會(huì)在后臺(tái)耗費(fèi)內(nèi)存的資源(圖5)。

圖5 iOS保護(hù)原理圖解
那么對(duì)于Android系統(tǒng)耗費(fèi)內(nèi)存高癥狀該怎么解決?主要方法自然是禁止應(yīng)用的自啟動(dòng),對(duì)于應(yīng)用自啟動(dòng),本刊已經(jīng)做過(guò)很多介紹。對(duì)于連環(huán)啟動(dòng)中自己確實(shí)需要的啟動(dòng),現(xiàn)在則可以借助“自啟管家”進(jìn)行有針對(duì)性的限制。首先對(duì)自己手機(jī)進(jìn)行ROOT,在手機(jī)上啟動(dòng)“自啟管家”后切換到“應(yīng)用”,點(diǎn)開(kāi)即可看到該應(yīng)用所有的連環(huán)啟動(dòng),現(xiàn)在按提示選擇自己不要的啟動(dòng)項(xiàng),這樣下次使用手機(jī)時(shí)就不會(huì)在不經(jīng)意之間啟動(dòng)那么多耗費(fèi)資源的應(yīng)用了(圖6)。

圖6 使用自啟管家有選擇禁用不必要的連環(huán)啟動(dòng)項(xiàng)
|