轉載請註明:http://blog.csdn.net/zhgxhuaa
說明
在總篇中提到過垃圾清理,本篇將着重介紹針對緩存、卸載殘留、無用數據等“靜態內容”的清理,有關於系統進程的清理以及手機加速的相關功能,將放到《手機加速篇》中介紹研究。
什麼是垃圾
關於系統垃圾的定義
現在很多手機管理軟件中都有垃圾清理的功能,本篇也來對垃圾清理做一個簡單的分析和介紹。在正式分析之前,讓我們首先看一下“什麼叫系統垃圾?”。在百度本科中,關於“系統垃圾”是這樣定義的:系統垃圾,就是系統不再需要的文件的統稱。當你瀏覽過網頁,安裝後又卸載掉的程序殘留文件及註冊表的鍵值。這些都是對系統毫無作用的文件,只能給系統增加負擔,所以叫垃圾。
關於系統垃圾其實就一句話”所有我們所不再需要的資源、文件、緩存,就是垃圾”。我們清理系統垃圾就是要清理掉這些不再需要的文件。
Android中有哪些可以清理的垃圾
首先看一下在目前流行的手機管理軟件總,都將那些作爲可以清理的垃圾,下面是使用率比較高的四款手機管理軟件的垃圾清理部分截圖:
結合這些手機管理軟件,對Android手機中可以清理的垃圾總結如下:
A. 應用緩存文件
B. 應用卸載殘留
C. 無用的安裝包
D. 內存數據
E. 系統垃圾(日誌、縮略圖、空文件夾等)
F. 廣告文件
G. 大文件(文件大小大於某個值的文件)
H. SD卡上的無用文件
在清理這些垃圾文件時,有的需要root權限,有的不需要,接下來將統一做一下介紹分析。
Android應用數據管理策略
在瞭解了關於垃圾文件的定義後,下面介紹一些Android中關於應用數據的管理策略:
Android中數據存儲可以簡單的分爲內置存儲(主要指應用data目錄)和外置存儲(主要是SD卡)兩種情況。Android對這兩種不同情況的管理策略是不一樣的。對於內置存儲中的數據採用進程隔離的原則存儲,外置存儲則採用全局共享的原則存儲。
對於清理內置存儲中的應用私有數據一般來說是需要root權限的,對於清理外置存儲中的數據一般來說是不需要特殊權限的。
快速清理與深度清理
在很多手機管理類軟件中都會發現有“快速清理”和“深度清理”,這裏簡單說一下:
- 所謂快速清理,其實往往就是指在垃圾掃描時只掃描兩到三層目錄,暫時不做一些需要深度遍歷等的耗時操作。
- 所謂深度清理,往往就是指對所有可清理的垃圾進行全面掃描,對目錄進行深度遍歷。
這裏有一點要說的是,二者的看似涇渭分明,實則是可以相互融合的,一個可行測策略是:
在管理軟件啓動後,選擇系統空閒時間,定時做深度掃描,在用戶手動觸發時做快速掃描。不過這裏又引出另外一個問題是:在空閒時掃描要有合適的策略,什麼時候開始,什麼時候暫停,必須保證在不影響應用正常使用的前提下進行。
系統垃圾清理
應用緩存清理
對於應用緩存的清理,本文將介紹兩種實現方案,分別爲:自己實現應用緩存清理和利用系統接口實現應用緩存清理,接下來將分別介紹。
自己實現應用緩存清理
要清理應用緩存,首先要了解應用的緩存是怎麼存放的。一般來說,Android中應用的緩存包括如下部分:
A. /data/data/ package_name /cache(應用緩存)
B. /mnt/sdcard/Android/ package_name /cache(外部應用緩存,FROYO以後支持)
C. /data/data/package_name/database/webview.db*(WebView緩存)
D. /data/data/package_name/database/webviewCache.db*(WebView緩存)
E. 其他一些/data/data/ package_name /*cache目錄(應用緩存)
F. /data/data/package_name/files(比較嚴格的清理策略時也可以選擇清理)
對於保存在/data/data/ package_name目錄下文件,應用本身及與其共享userId的應用擁有全部的讀寫執行權限,其他應用是沒有讀寫權限的,如下:
通過上面的分析,我們得出了清理應用緩存的第一種方案:
在獲得root權限的前提下,遍歷掃描應用的上述緩存目錄,如果發現則刪除即可。下面兩段是計算緩存大小和清理緩存的部分示例代碼:
計算緩存大小部分的代碼片段:
清理緩存部分的代碼片段:
當然,這裏的掃描和清理工作也可以通過JNI放到C代碼裏去做,實現都是類似的。在通過C代碼是否緩存時可以參見@frameworks/native/cmds/installd/commands.c中的free_cache函數。
利用系統接口實現應用緩存清理
用過Android手機的朋友相信都知道在手機的“設置->應用”中的應用詳情頁裏面有“清除緩存”的功能,下面是在我我個人的手機上一個應該的截圖:
OK,到這裏,問題來了,我們是否可以利用系統接口實現應用”清除緩存“功能呢?Android系統中應用詳情頁位於@/packages/apps/Settings/src/com/android/settings/applications/InstalledAppDetails.java中。
InstalledAppDetails中清理應用緩存部分的代碼如下所示:
在PackageManager中關於deleteApplicationCacheFiles的實現如下:
這裏我們要注意如下幾點:
A. deleteApplicationCacheFiles接口是hide的,在代碼中不能直接調用。
B. 使用deleteApplicationCacheFiles接口需要聲明DELETE_CACHE_FILES權限。
C. 通過deleteApplicationCacheFiles接口是無法清除系統應用緩存的。
D. 緩存清理結果通過IPackageDataObserver接口完成回調。
除了deleteApplicationCacheFiles接口,PackageManager中還有如下兩個接口可以選擇調用:
下面是採用第二種緩存清理方式的部分示例代碼,如下:
下面是獲取各個應用緩存大小的部分示例代碼:
兩種實現方案對比
在介紹了兩種應用緩存清理方式以後,這裏做一個簡單的對比,以供使用時進行選擇:
A. 從範圍:第一種方式清理範圍更廣,更徹底。第二種方式只能清理非系統應用,第一種方式可以清理所有應用,甚至應用自定義緩存文件。
B. 從權限:第一種方式需要root權限,第二種方式只需要在AndroidManifest中指定DELETE_CACHE_FILES即可。
C. 從安全:採用第一種方式時要有合適的策略,避免清理掉不應該清理的緩存。
綜上,第一種方式的清理範圍更廣更徹底一些,在取得root權限的情況下,建議採用第一種方式。
應用卸載殘留清理
如在1.3中所介紹,應用安裝後的數據存放有內置存儲和外置存儲兩種方式。對應內置存儲中的數據在應用刪除時會自動被刪除,這裏可以不用關心。但是許多Android應用程序會在移動終端的存儲卡上創建自己應用程序專用的目錄,用來存放緩存文件、臨時文件或者通過網絡下載的視頻、音頻、書籍等媒體文件。但是,當Android應用程序被卸載時,殘留在存儲卡上的文件不會被刪除,而其中大部分文件對於用戶來說是無用處的,屬於垃圾文件。如果用戶頻繁的安裝和卸載新軟件,就會在存儲卡產生大量的應用程序殘留文件,不但佔用存儲卡空間,而且使存儲卡的文件管理變得困難起來。因此,實現Android應用程序殘留目錄的識別與清理是十分必要的。
應用卸載殘留清理的一個關鍵點就是:應用殘留目錄的識別。這裏有兩種可行的方案:
方案一:維護文件映射信息
在文件或者數據庫中應用包名(唯一)與SD卡上文件的一個映射信息,可以採用應用包名爲Key,因爲不同應用的包名是唯一的,不會重複;採用SD卡上的文件作爲Value,建立映射如下所示:
Key |
Value |
應用包名(唯一) |
文件夾 |
在檢測到應用卸載事件後判斷該應用是否有對應的文件存在,有則提示用戶刪除。採用這種方案時需要如下幾個問題:
A. 映射表的建立:需要對使用頻率和用戶量較高的應用建立映射表。這裏最好有後臺提前掃描應用建立,然後下發給客戶端;也可以客戶端先上報信息到後臺,後臺修正。映射表的建立是識別的關鍵。
B. 錯誤識別問題:一般來說不同應用的數據放在不同的文件夾中,不會有重複。但在實際中難免會出現重複的情況。對於這種情景有兩種處理方式:
1) 映射關係細化到文件,刪除完文件後再判斷上層文件夾是否爲空,爲空則刪除。
2) 有多個應用的映射關係重複時判斷所有應用都已卸載再刪除文件夾。
方案二:記錄應用安裝過程
該方案的普遍性並不如第一種方案強,但也可作爲一種實現方案作爲參考。方案如下:
1) 在通過管理軟件進行安裝時,通過log記錄安裝應用所產生的文件。在應用運行時,監控SD文件的變化,發現變化時,當前應用(運行時棧頂)即文件的創建者,同樣在log中記錄這種對應關係。
2) 在通過管理軟件卸載應用時,根據log信息執行逆過程。
無用安裝包清理
無用安裝包的清理比較簡單。判斷無用安裝包的標準是:
A. 存儲目錄中存在APK文件,但是該APK已被安裝
B. APK文件已損壞
掃描安裝包有兩種處理方式:
A. 深度掃描:掃描SD卡上的所有目錄
B. 快速掃描,只掃描手機管理軟件(豌豆莢、360手機助手、應用寶等)和瀏覽器(UCWeb、QQ瀏覽器)和Download目錄。
要清理其他下載文件也可以按照這個思路來實現。
系統垃圾清理
系統垃圾清理包括臨時文件、縮略圖、系統日誌、失效文件、空白文件等的清理,下面做一下介紹。
清理系統日誌
日誌文件分爲系統日誌和應用日誌兩部分,其各自的存放位置分別爲:
1) 系統日誌的存放位置如下(不同手機可能會有所差異):
A. /data/local/tmp/*
B. /data/tmp/*
C. /data/system/usagestats/*
D. /data/system/appusagestates/*
E. /data/system/dropbox/*
F. /data/tombstones/*
G. /data/anr/*
H. /dev/log/main
2) 應用日誌存放位置可以判斷的有:SD卡上後綴名爲“.log”或者“*log.txt”等結尾的文件。
清理圖片縮略圖
在SD卡上的DICM目錄下有一個隱藏的目錄,名字叫“.thumbnails”,這個目錄存放的是系統圖片的緩存。清理緩存主要就是清理這個目錄。應用目錄也可能有縮略圖文件,但不容易識別,所以不建議清理,可以放在清理殘留數據時一起清理。
清理失效文件與空白文件
判斷標準:
A. 文件的長度爲0則認爲是空白文件,可以刪除
B. 文件夾中不包含任何文件或文件夾,則認爲是空白文件夾,可以刪除。
C. 除了上面兩種情況外,還可以掃描文件的創建時間,很長時間未使用的文件認爲是無效文件。
大文件清理
對於大文件的識別比較簡單,只判斷文件大小是否超過一定的閥值(例如:豌豆莢認爲大小超過10M即爲大文件)即可。但這裏有兩個需要注意的點:
A. 大文件一般是視頻文件或者應用數據(例如百度map的數據),對於這些文件在清理是建議默爲“不選中”狀態。
B. 可以充分利用2.2.1中建立的映射關係,對大文件是否建議刪除提供更加準確的建議。
對於廣告文件等的識別和處理這裏不再贅述了,原理都與上面的類似。
總結
通過本篇中的方法基本上可以實現對Android系統中垃圾文件的全面清理。這裏要強調的是:
A. 垃圾清理是把雙刃劍,一定要有合適的策略,否則反而影響用戶體驗。
B. 在清理垃圾文件時一定要抱着這樣的態度:寧可錯,不可過。
最後,希望本文能夠給所有對垃圾清理和手機管理感興趣的朋友帶來一點幫助,將榮幸之至。有任何問題歡迎交流和討論。下一篇將介紹《手機加速》