回覆列表
  • 1 # 科技相對論TECH

    首先,安卓系統是基於Lunix

    Android是一種基於Linux的自由及開放原始碼的作業系統。主要使用於移動裝置,如智慧手機和平板電腦,由Google公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用“安卓”。Android作業系統最初由Andy Rubin開發,主要支援手機。2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apache開源許可證的授權方式,釋出了Android的原始碼。第一部Android智慧手機發佈於2008年10月。Android逐漸擴充套件到平板電腦及其他領域上,如電視、數碼相機、遊戲機、智慧手錶等。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2013年的第四季度,Android平臺手機的全球市場份額已經達到78.1%。 2013年09月24日谷歌開發的作業系統Android在迎來了5歲生日,全世界採用這款系統的裝置數量已經達到10億臺。2014第一季度Android平臺已佔所有移動廣告流量來源的42.8%,首度超越iOS。但運營收入不及iOS,目前安卓佔據全球智慧手機系統一大半以上的市場。

    其次,安卓的先天機制導致後臺APP自啟,競相互相喚醒,導致手機變卡變慢。

    Google的這些作為讓Android系統在流暢度上有了實質性的突破,從宏觀上講,Android是越來越不卡越來越流暢,那麼,在如今這麼強大的硬體支援下,為什麼還會讓很多人覺得越用越卡呢?

    自2008年第一部Android手機發布至今,雖然在操作體驗上一直生活在iOS陰影之下,但不可否認,Android是越來越強了,與iOS的差距越來越小,尤其是一向被詬病的流暢度,在Android 5.0之後更是有了質的飛躍,特別是現在的安卓8.0-9.0紳士很絲滑。

    那我們就說一說之前為什麼安卓為什麼這麼卡

    以前,Android的流暢度不如iOS,其實原因也很簡單:

    一是先天不足

    在Linux上跑個虛擬機器,再用JAVA做開發,雖然能減輕開發負擔,獲得浩瀚資源,但在後期最佳化上的成本增加更多,Java沒有提供任何操作來釋放記憶體(iOS的開發語言Object C能自行控制記憶體釋放),是透過系統的記憶體回收機制來進行管理,但記憶體回收是個雙刃劍,GC(Gabage Collection,垃圾回收)時所有執行緒都要暫停,也就是所謂的卡頓。

    二是後天開放帶來的混亂

    強制與封閉,給iOS的應用帶來了高度的統一和標準,而開放的Android必然帶來混亂這樣的負面作用,碎片化是眾所周知的惡果,一些應用為了相容更多舊款裝置,只得繼續使用低level的API,如微信,現在還是使用API level 9,就是為了能在Android 2.3系統上使用,而Android 5.1支援的API level已達到22了,效率上顯然大打折扣,除此之外,開發上的開放性更是一個非常大的隱患,這也是今天要談的主要問題。

    iOS為了流暢度,其實做了非常多的妥協來換取使用者體驗上的好感,比如墓碑式記憶體管理、優先UI渲染等,Google在2012年提出了黃油計劃(Project Butter),開始著手解決Android卡頓這個老大難問題,並從Android 5.0開始,將Dalvik虛擬機器全面轉向ART虛擬機器,後者在安裝應用的時候會進行預編譯,將程式碼轉換為機器語言儲存在本地,這樣在執行程式時就不用每次都編譯一次,執行效率得到大大提升,同時,新的ART模式也降低了每次GC的時間,一些額外的最佳化也可以避免GC的頻繁發生。

    黃油計劃的垂直同步與三重緩衝讓操作更一致順滑

    Google的這些作為讓Android系統在流暢度上有了實質性的突破,從宏觀上講,Android是越來越不卡越來越流暢,那麼,在如今這麼強大的硬體支援下,為什麼還會讓很多人覺得越用越卡呢?

    現在,Android越用越卡:APP在後臺不斷重生

    到了今天,隨著硬體的發展及系統的不斷改良最佳化,Android架構上的先天不足已經是影響甚微,從那些旗艦新機的表現足以證明了,秒開、流暢、順滑……絕不輸於 同級別iPhone,但是,這通常是指出廠狀態下的表現,如果裝上幾十個中國產APP,情況可能會發生些變化——流暢度明顯下降了,使用者開始叫卡了。

    顯然問題出在這些APP上,前面說過,Android的開放是把雙刃劍,在自由的背後往往潛伏著危險,善惡存乎一心,開發商掌控著進退大權,而以華人之尿性,搶佔市場、提升APP活躍度往往是最重要的,既然我不流氓別人也會流氓,我為什麼不更流氓呢?

    Android應用開發有四大元件,廣播接收器(BroadcastReceiver,以下簡稱Receiver)就是其中之一,它用來接收來自系統和應用中的廣播,你也可以理解它是一個監聽器,比如當電量變化時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者儲存進度或進入省電模式等;當有電話進來,也會產生一條廣播,就會通知電話接聽或電話號碼判斷等。

    各色各樣的系統Receiver(採集於ROM Toolbox)

    在Android中,全域性的Receiver就近百種,可以監聽各色各樣的狀態變化,比如開關機、通電斷電、網路狀態變化、電量變化、安裝解除安裝應用、電話撥出呼入、SD卡變化等。開放的Android允許應用程式註冊任意個Receiver, 這也成為流氓應用滋生的溫床,不良的開發者向系統註冊多個靜態Receiver,接受各種廣播通知,然後執行相應的Activity,比如自啟動。

    Android越用越卡的主要原因在於,後臺有大量應用在默默執行,而這些應用根本就是清理不掉的,它們會在收到各種各樣的Receiver通知後並再度啟動,我能想到最好的描述就是“野火燒不盡,春風吹又生”。作為對比,iOS中被殺掉的後臺程序再啟動的方法很有限,簡單的說,iOS是真的能清理記憶體,而Android中許多應用揮之不去,不斷重生,各種程序與服務在後臺偷偷執行,從而引起系統卡頓與耗電,其實又有幾個開發商會為你手機的電池著想呢?

    Android不良應用的重生,主要有兩種途徑:自啟動和關聯喚醒。你想都想不到的自啟動

    自啟動,可能在我們意識裡它就等於開機自動執行,在Windows下倒也沒差,但在Android下你就太小瞧它了,開機自動執行只是眾多自啟動方式中的一種。在Windows中,你關閉某個軟體後,它基本上不會再自行啟動了,然後Android中由於有Receiver這種東東,讓自啟動變得很容易。

    還是來點具體例項,看看國外APP與國內APP的節操對比:

    作為同類型電商APP,eBay只有在收到三種Receiver後可能會啟動,而且這三種都是比較規範的,反觀“手機淘寶”,共有九種自啟動行為,除了eBay那三種外,還可能在收到應用解除安裝等六種Receiver後啟動,我只是想問,我設定時間、解除安裝應用和你淘寶有半毛錢關係?

    很可惜,國外的APP在國內基本沒辦法用,而國內的不管是優秀的APP還是山寨國外的APP,大多數以搶佔市場、提高應用活躍度為主,拼著命變著法子讓自家APP處於活動狀態,一鍵清理記憶體還有什麼用呢,過幾分鐘又如野草般齊刷刷地長了出來。其實“手機淘寶”這個APP還算好的,看個更變態的:

    百度雲有19種自啟行為

    百度雲APP高達19種自啟行為,打電話、發簡訊、充電、連網、換個WIFI等等,這些日常的手機操作,都能讓百度雲不斷重生自啟,與你如影隨行,而且是隱蔽不可見的。

    當你接到電話(呼入電話Receiver)後,還會發生這些事:

    接到電話的同時,在後臺已啟動了“百度雲”“有道雲筆記”等

    當你收到簡訊(接收簡訊Receiver)時,還會發生這些事:

    收到簡訊的同時,後臺會啟動“支付寶”,並且……

    打電話是最基本的手機功能,但是當你打電話/發簡訊時,後臺早已是波濤洶湧。除了一些應用會完成自啟行為外,還可能會喚醒其它的應用,如收到簡訊時“支付寶”會自啟動,“支付寶”啟動後還會喚醒“手機淘寶”,這就是大家平常所說的“全家桶”,也就是APP重生的另一途徑——關聯喚醒。

    打虎親兄弟的關聯喚醒

    關聯喚醒大家多少有些瞭解,也是極具中國特色的產物,簡單地講就是當一款應用啟動後,它會在後臺偷偷啟動另一款應用,基本上這些應用都有裙帶關係,以臭名昭著的百度系、阿里係為代表,真是應了“打虎親兄弟,上陣父子兵”那句話。

    上圖中,當執行“百度地圖”時,後臺會開啟“百度雲”,當執行“手機淘寶時”,“支付寶”也同時在後臺開啟,這些都是你看不見的,你手機中的APP越多,那麼關聯喚醒的APP就會越多。

    如果你不怕死,裝了百度這一系列APP,就會很熱鬧:

    當你開啟“百度地圖”後,百度系的其它APP會連環喚醒(我這個手機上喚醒了八款,因為只裝了這麼多,像百度手機助手、愛奇藝影片都能被喚醒),首先“百度地圖”會喚醒“百度雲”,“百度雲”緊接著會喚醒“手機百度”和“百度影片”,然後“百度影片”不遺餘力地喚醒幾個好兄弟“百度新聞”、“百度音樂”、“百度貼吧”、“百度瀏覽器”和“百度糯米”。

    一人得道,雞犬升天,“全家桶”實在是形容得太貼切了。不過說實在的,關聯喚醒的APP畢竟都沾親帶故,主要集中於那幾大派系,和無處不在的自啟動相比,關聯喚醒的影響相對要小一些。

    面對野火燒不盡的重生式APP,怎麼辦?

    面對這些不斷重生的APP,顯然手動清理記憶體是沒什麼卵用,剛清理了它又啟動了,沒辦法從根本上至少是極大程度上制約這些流氓APP頻繁地被喚醒。好在這種現象已引起了極大關注,有些手機ROM已開始著手從底層來解決這些問題,像最新的魅族Flyme 5就能手動切斷關聯喚醒,算是邁進了一小步。

    不管你用的手機ROM是不是作了針對性改進,都可以參考以下的解決方法,讓負面影響降到最小:

    1、儘量不要安裝使用頻率極低的APP,對於百度系、阿里系、騰訊系等產品,儘量選用可替換的應用,如“百度瀏覽器”、“百度影片”等都可以棄之。

    2、對於高階玩家,推薦Xposed框架 + 綠色守護的解決方案。

    綠色守護除了日常的應用休眠外,其深度休眠能更大程式上保證APP不被關聯喚醒,雖然還是有可能被喚醒,但是不用擔心,被喚醒的APP會被繼續休眠。綠色守護是Android手機必裝神器之一,它更像一個記憶體無限清理工具,啟動多少清理多少(只清理指定的應用),以不變應萬變,能應付各種疑難雜症,有效改善系統的流暢性與續航能力,非常推薦,它需要Xposed框架配合,安裝上有小小難度。

    3、如果你覺得Xposed框架安裝起來比較麻煩,可以直接使用一些第三方管理工具,這裡推薦360衛士極客版,它能主動禁止掉每個APP的自啟動行為和切斷喚醒,理論上效果更好,就是需要針對操作。可能你對360系也比較牴觸,不過用用會覺得也蠻不錯的 ,實在不喜歡,就用LBE試試。

  • 中秋節和大豐收的關聯?
  • 在冒險沙盒遊戲《西部狂徒》裡面做什麼事情會被朋友瘋狂嫌棄?