1. 程式人生 > >手機管理應用研究【3】—— 垃圾清理篇

手機管理應用研究【3】—— 垃圾清理篇

dma 系統垃圾 存在 分析 獲得 /dev/ 進行 指定 相互

歡迎轉載。轉載請註明: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代碼裏去做,實現都是類似的。[email protected]/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. 映射表的建立:須要對使用頻率和用戶量較高的應用建立映射表。這裏最好有後臺提前掃描應用建立,然後下發給client;也能夠client先上報信息到後臺,後臺修正。映射表的建立是識別的關鍵。

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”,這個文件夾存放的是系統圖片的緩存。清理緩存主要就是清理這個文件夾。應用文件夾也可能有縮略圖文件。但不easy識別,所以不建議清理,能夠放在清理殘留數據時一起清理。


清理失效文件與空白文件


推斷標準:

A. 文件的長度為0則覺得是空白文件,能夠刪除

B. 目錄中不包括不論什麽文件或目錄,則覺得是空白目錄。能夠刪除。

C. 除了上面兩種情況外。還能夠掃描文件的創建時間,非常長時間未使用的文件覺得是無效文件。



大文件清理


對於大文件的識別比較簡單,僅僅推斷文件大小是否超過一定的閥值(比如:豌豆莢覺得大小超過10M即為大文件)就可以。但這裏有兩個須要註意的點:

A. 大文件通常是視頻文件或者應用數據(比如百度map的數據)。對於這些文件在清理是建議默為“不選中”狀態。

B. 能夠充分利用2.2.1中建立的映射關系,對大文件是否建議刪除提供更加準確的建議。

對於廣告文件等的識別和處理這裏不再贅述了,原理都與上面的類似。



總結


通過本篇中的方法基本上能夠實現對Android系統中垃圾文件的全面清理。這裏要強調的是:

A. 垃圾清理是把雙刃劍,一定要有合適的策略。否則反而影響用戶體驗。

B. 在清理垃圾文件時一定要抱著這種態度:寧可錯,不可過。

最後。希望本文可以給全部對垃圾清理和手機管理感興趣的朋友帶來一點幫助。將榮幸之至。有不論什麽問題歡迎交流和討論。下一篇將介紹《手機加速》



手機管理應用研究【3】—— 垃圾清理篇