android 垃圾清理 檔案清理
說明
在總篇中提到過垃圾清理,本篇將著重介紹針對快取、解除安裝殘留、無用資料等“靜態內容”的清理,有關於系統程序的清理以及手機加速的相關功能,將放到《手機加速篇》中介紹研究。
什麼是垃圾
關於系統垃圾的定義
現在很多手機管理軟體中都有垃圾清理的功能,本篇也來對垃圾清理做一個簡單的分析和介紹。在正式分析之前,讓我們首先看一下“什麼叫系統垃圾?”。在百度本科中,關於“系統垃圾”是這樣定義的:系統垃圾,就是系統不再需要的檔案的統稱。當你瀏覽過網頁,安裝後又解除安裝掉的程式殘留檔案及登錄檔的鍵值。這些都是對系統毫無作用的檔案,只能給系統增加負擔,所以叫垃圾。
關於系統垃圾其實就一句話”所有我們所不再需要的資源、檔案、快取,就是垃圾”。我們清理系統垃圾就是要清理掉這些不再需要的檔案。
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許可權的前提下,遍歷掃描應用的上述快取目錄,如果發現則刪除即可。下面兩段是計算快取大小和清理快取的部分示例程式碼:
計算快取大小部分的程式碼片段:
清理快取部分的程式碼片段:
利用系統介面實現應用快取清理
用過Android手機的朋友相信都知道在手機的“設定->應用”中的應用詳情頁裡面有“清除快取”的功能,下面是在我我個人的手機上一個應該的截圖:
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. 在清理垃圾檔案時一定要抱著這樣的態度:寧可錯,不可過。
最後,希望本文能夠給所有對垃圾清理和手機管理感興趣的朋友帶來一點幫助,將榮幸之至。有任何問題歡迎交流和討論。下一篇將介紹《手機加速》