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

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

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

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

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

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

圖6 使用自啟管家有選擇禁用不必要的連環啟動項
|