項目需求一改再改,UI一調再調,結果就是項目中一堆已經用不到但卻沒有清理的垃圾資源,不說工程大小問題,對新進入項目的人或看其餘模塊的代碼的人來講,這些沒清理的資源可能也可能會帶來困擾,因此最好仍是清理掉這些垃圾,對於一個稍微大一點的工程來講,手工清理明顯是不現實的,這就須要一個方法作這些事情。java
要清理沒用的資源,首要的工做固然是找到他們,咱們知道Anroid SDK中有一個工具叫lint,能夠幫助咱們查看工程中存在的問題,其中有一項功能就是查找沒用到的資源,這樣這一步就簡單了,直接對須要清理的工程執行如下命令:app
lint --check "UnusedResources" [project_path] > result.txt工具
執行完以上命令後工程中關於UnusedResources的問題就都保存到result.txt了,先來看一下result.txt的內容佈局
res/values/arrays.xml:202: Warning: The resource R.array.msg_my_friend_category_items appears to be unused [UnusedResources]
^M 插件
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
res/layout/back_up_level_list.xml: Warning: The resource R.layout.back_up_level_list appears to be unused [UnusedResources]
res/layout/backup_list.xml: Warning: The resource R.layout.backup_list appears to be unused [UnusedResources]
res/layout/backup_listview_item.xml: Warning: The resource R.layout.backup_listview_item appears to be unused [UnusedResources]
能夠看到列出了沒用到的layout及沒用到的values值等信息。有了這些信息,接下來須要作的就是分析這些信息了,手工分析不太現實,由於這個文件可能會很是大,好比我執行上述命令後文件就有2212行,這種事情,固然是交給計算機解決了。code
仔細看生成的文本中的內容會發現結果是按行輸出的,每一個問題是單獨的一行,並且每一行中的內容也頗有規律xml
file_path[:line]: Warning: info [UnusedResources}ip
因此仍是能夠很方便地獲得哪一個文件甚至哪行有問題的,我處理的時候只清理了沒用的文件,像上面的res/values/arrays.xml:202就沒有管,下面看下怎麼清除沒用到的資源文件。資源
String projectPath = "***"; BufferedReader reader = new BufferedReader(new FileReader("/home/angeldevil/result.txt")); String line; int count = 0; while((line = reader.readLine()) != null) { if (line.contains("UnusedResources") && !line.contains("res/value") && !line.contains("appcompat")) { count++; int end = line.indexOf(":"); if (end != -1){ String file = line.substring(0, end); String f = projectPath +file; System.out.println(f); new File(f).delete(); } } }
程序很是簡單,就幾行代碼,就是讀取result.txt文件的每一行,根據本身須要的條件過濾掉不須要處理的行(好比我只想清理anim、drawable及layout,因此過濾掉res/value目錄下的信息,而且忽略appcompat相關的信息),每一行":"前的字符串就是文件名,找到了文件名就好處理了,直接刪除,或者打印出來,或者寫到一個文件裏以再次確認是否確認要刪除,當把結果寫到一個文件後咱們就能夠查看這個文件是否有如今沒用到但仍不想刪除的文件,若是有,處理方法也很簡單,去掉這一行或簡單地作個標記,如前面打#,而後再讀取這個文件把沒作標記的行對應的文件刪除就好了。字符串
看起來很簡單,可是有幾點須要注意:
首先仍是要找到未用到的文件,仍是利用工具,我用的是UCDetector,即Unused Code Detector,使用方法就不說了,直接Google一下。
安裝Eclipse的UCDetector插件,對工程執行檢查,這個須要的時間可能會很長,我當時檢查了兩個小時。。同lint同樣,結果會輸出到一個文本文件中,一樣是每一個問題一行,因此只要行分析就好了,好比這樣:
com..SampleAdapter.
(SampleAdapter.java:18) Class "SampleAdapter" has 0 references SampleAdapter org.ucdetector.analyzeMarkerReference .SampleAdapter.
com.(SampleAdapter.java:56) Change visibility of Member class "SampleAdapter.ViewHolder" to private - May cause compile errors! SampleAdapter.ViewHolder org.ucdetector.analyzeMarkerVisibilityPrivate
能夠看到,檢測結果中包含不少信息,如某個類沒被用到,某個方法的可見性太大等,一樣的,如今只處理沒用到的類文件,其餘無論了。
String reportPath = "**/ucdetector_reports/UCDetectorReport_001.txt"; BufferedReader reader = new BufferedReader(new FileReader(reportPath)); String line; int count = 0; while((line = reader.readLine()) != null) { if (line.contains("Class") && line.contains("has 0 references") && !line.contains("Method")[ && other conditions]) { count++; int end = line.indexOf(".<init>"); if (end != -1){ String className = line.substring(0, end); System.out.println(className); } } }
經過以上代碼基本上就能找到沒用到的類了,仍是建議不直接刪除而是把結果輸出出來,由於結果輸出來之後你會發現不少文件你是不想刪除的,如:
com.nostra13.universalimageloader.core.assist.DiscCacheUtil.
(DiscCacheUtil.java:31) Class "DiscCacheUtil" has 0 references DiscCacheUtil org.ucdetector.analyzeMarkerReference Sergey Tarasevich (nostra13[at]gmail[dot]com)
某些類庫中的文件也可能會被檢測出來,對於這種直接在if條件中過濾掉就行了,也可能本身的一些文件暫時沒用到但不想刪除,從結果中過濾就行了。
清理資源就兩個步驟:
經過UCDetector和lint基本上就能夠檢測到項目中UnusedResource相關的問題了,通常像方法可見性,某個方法沒用到這種問題,不處理也罷,改到相應的文件時手工處理算了,主要處理的就是某些文件或類沒被用到,有檢測報告,分析下報告就好了。這種報告通常是每行報告一個問題而且每行的文字是有規律的(工具生成的確定有規律),按規律過濾出咱們須要的信息就好了