Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android手機 >> Android刷機教程 >> htc刷機 >> HTC HERO進程管理機制優化

HTC HERO進程管理機制優化

編輯:htc刷機

  前言

  由於我不是開發者,所以寫這個題目的時候總有些惶恐,怕寫出問題,本文內容是筆者通過論壇的學習和自己實踐總結出來的一些經驗,可能有不對的地方還望指正。本文的主要資料來源自 XDA的一個帖子:How to configure Android’s *internal* taskkiller

  理論

  Android采取了一種有別於Linux的進程管理策略,有別於Linux的在進程活動停止後就結束該進程,Android把這些進程都保留在內存中,直到系統需要更多內存為止。這些保留在內存中的進程通常情況下不會影響整體系統的運行速度,並且當用戶再次激活這些進程時,提升了進程的啟動速度。

  那Android什麼時候結束進程?結束哪個進程呢?之前普遍的認識是Android是依據一個名為LRU(last recently used 最近使用過的程序)列表,將程序進行排序,並結束最早的進程。XDA的樓主又進一步對這個管理機制進行研究,有了如下發現:

  系統會對進程的重要性進行評估,並將重要性以“oom_adj”這個數值表示出來,賦予各個進程;(系統會根據“oom_adj”來判斷需要結束哪些進程,一般來說,“oom_adj”的值越大,該進程被系統選中終止的可能就越高)

  前台程序的“oom_adj”值為0,這意味著它不會被系統終止,一旦它不可訪問後,會獲得個更高的“oom_adj”,作者推測“oom_adj”的值是根據軟件在LRU列表中的位置所決定的; 
Android不同於Linux,有一套自己獨特的進程管理模塊,這個模塊有更強的可定制性,可根據“oom_adj”值的范圍來決定進程管理策略,比如可以設定“當內存小於X時,結束“oom_adj”大於Y的進程”。這給了進程管理腳本的編寫以更多的選擇。

  Android將進程分為六大類:

  前台進程(foreground):目前正在屏幕上顯示的進程和一些系統進程。舉例來說,Dialer Storage,Google Search等系統進程就是前台進程;再舉例來說,當你運行一個程序,如浏覽器,當浏覽器界面在前台顯示時,浏覽器屬於前台進程(foreground),但一旦你按home回到主界面,浏覽器就變成了後台程序(background)。我們最不希望終止的進程就是前台進程。

  可見進程(visible):可見進程是一些不再前台,但用戶依然可見的進程,舉個例來說:widget、輸入法等,都屬於visible。這部分進程雖然不在前台,但與我們的使用也密切相關,我們也不希望它們被終止(你肯定不希望時鐘、天氣,新聞等widget被終止,那它們將無法同步,你也不希望輸入法被終止,否則你每次輸入時都需要重新啟動輸入法)

  次要服務(secondary server):目前正在運行的一些服務(主要服務,如撥號等,是不可能被進程管理終止的,故這裡只談次要服務),舉例來說:谷歌企業套件,Gmail內部存儲,聯系人內部存儲等。這部分服務雖然屬於次要服務,但很一些系統功能依然息息相關,我們時常需要用到它們,所以也太希望他們被終止

  後台進程(hidden):雖然作者用了hidden這個詞,但實際即是後台進程(background),就是我們通常意義上理解的啟動後被切換到後台的進程,如浏覽器,閱讀器等。當程序顯示在屏幕上時,他所運行的進程即為前台進程(foreground),一旦我們按home返回主界面(注意是按home,不是按back),程序就駐留在後台,成為後台進程(background)。後台進程的管理策略有多種:有較為積極的方式,一旦程序到達後台立即終止,這種方式會提高程序的運行速度,但無法加速程序的再次啟動;也有較消極的方式,盡可能多的保留後台程序,雖然可能會影響到單個程序的運行速度,但在再次啟動已啟動的程序時,速度會有所提升。這裡就需要用戶根據自己的使用習慣找到一個平衡點

  內容供應節點(content provider):沒有程序實體,進提供內容供別的程序去用的,比如日歷供應節點,郵件供應節點等。在終止進程時,這類程序應該有較高的優先權

  空進程(empty):沒有任何東西在內運行的進程,有些程序,比如BTE,在程序退出後,依然會在進程中駐留一個空進程,這個進程裡沒有任何數據在運行,作用往往是提高該程序下次的啟動速度或者記錄程序的一些歷史信息。這部分進程無疑是應該最先終止的。

實踐

  說完理論,說些實踐的東西,怎樣管理這六類進程,如何來設置進程管理模塊是這部分說的內容。

  首先是軟件,推薦使用MinFreeManager,市場上就有下載,用於設置這六類進程的管理策略。

  軟件運行後有六個輸入框,在輸入框中只能輸入數字,這些數字代表了這類進程的處理策略,比如Foreground App下的輸入框顯示6,就表示,當可用內存低於6MB時,終止Foreground App。下面的類似,如Empty App下的輸入框顯示24,則表示,當內存低於24MB時,終止Empty App。

  從軟件數值的設置不難看出結束進程的有限順序:Empty>Content Provider>Hidden>Secondary Server>Visible>Foreground。

  但默認設置確存在一些問題:

  各類進程的管理策略的閥值相當接近:6,8,16,20,22,24,最大的相差也不到8MB,在實際程序運行中,很容易導致多種類型的進程同時被關閉。如可用內存在25時,突然啟動照相程序,系統可用內存急速,可能會導致空進程、內容供應節點、後台進程、次要服務等同時被關閉 
閥值上限較低:一般手機啟動後,可用內存在50-100左右,但隨著手機的使用,可用內存會逐步減少,最後降低到24MB左右,則系統開始啟動進程管理機制,開始結束進程,但這個閥限制設在了24MB,相對來說偏低。其結果會導致系統使用一段時間後,整體速度變慢。很明顯的就是,當手機長時間使用後,開啟電話撥號,相冊,照相機等應用時,系統的反應速度極慢。

  基於以上幾個問題,不難看出,我們修改的目標也將非常明確,主要解決兩個矛盾:

拉開各進程的閥值層次,使得進程管理機制能更有效得工作 
提升閥值上限,空出更多的空余內存,以提升系統整體的運行速度
進程管理策略設置原則:

前台進程、可見進程和次要服務是與用戶體驗息息相關的內容,這部分的進程管理策略要相對保守,給這些進程留下足夠的運行空間 
壓搾無用進程,騰出內存空間給主要程序使用

下面筆者總結了幾種設置方式,適應不同的使用需要:

游戲玩家/重度浏覽器使用者配置: 
用戶特點:長時間專注於某一特定的,高內存需求的程序,對多任務的需求不高 
配置參數: 
Foreground:6 
Visible:8 
Secondary Server:16 
Hiden App:80 
Content Provider:90 
Empty:100
配置理念:壓搾後台進程,內容供應節點和空進程,將內存盡可能多得留給前台進程和系統,提升游戲速度和浏覽器體驗 
優點:程序啟動和運行的速度最快 
缺點:多任務處理不理想,開啟程序較多時,後台進程會被終止

多任務配置: 
用戶特點:同時運行多個應用程序,需要經常在多個程序間切換 
配置參數: 
Foreground:6 
Visible:8 
Secondary Server:16 
Hiden App:20 
Content Provider:60 
Empty:100
配置理念:壓搾空進程,給內容供應節點留有一定空間,最大限度提升後台程序的使用空間,提升多任務的處理能力 
優點:運行多個程序時,由於可支配內存較多,後台程序不容易被終止 
缺點:程序啟動的速度和整體系統的運行速度可能會比游戲玩家配置略慢一些,由於經常運行多任務,平時系統的響應速度會受到一定影響

輕度用戶/女生專用配置 
用戶特點:手機的主要功能是短信和電話,偶爾用用相機自拍 
配置參數: 
Foreground:6 
Visible:8 
Secondary Server:16 
Hiden App:24 
Content Provider:32 
Empty:48
配置理念:壓搾空進程,給內容供應節點留有一定空間,最大限度提升後台程序的使用空間,提升多任務的處理能力 
優點:比較均衡的配置,提升了系統的可用內存,使得系統的整體速度得到了提高,拉開了各級進程的管理策略層次,使得管理機制更有效率 
缺點:比較均衡的配置,無明顯缺點

總結

  闡述完了內存管理的機制,並推薦了一些配置參數,但這些參數並不一定適用於所有人,大家也可以根據自己實際的使用習慣調整這些參數的設置。

本文轉自機鋒網

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved