標籤:android style blog io color ar 使用 java sp
要清理沒用的資源,首要的工作當然是找到他們,我們知道Anroid SDK中有一個工具叫lint,可以協助我們查看工程中存在的問題,其中有一項功能就是尋找沒用到的資源,這樣這一步就簡單了,直接對需要清理的工程執行以下命令:
lint --check "UnusedResources" [project_path] > result.txt
或
第一步:
使用android-sdk-windows\tools\lint.bat工具
先將檢測結果匯出到文字檔
代碼:lint 工程目錄 >d:/Temp/res.txt
將指定工程目錄下的工程檢測結果匯出到res.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]
java代碼
import java.io.BufferedReader;import java.io.File;import java.io.FileReader; public class Main { public static void main(String[] args) { /* if(args.length<3) { System.out.printf("delunuse [?????¼] [?????????]\r\n"); return; } delUnused(args[1],args[2]); */ delUnused("D:/androids/iTalk/","D:/androids/iTalk/italk_unused.txt"); } /* (non-Java-doc) * @see java.lang.Object#Object() */ public Main() { super(); } public static void delUnused(String projectPath,String projectLogFile) { try { BufferedReader reader = new BufferedReader(new FileReader(projectLogFile)); 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); //if(!file.equals("color.xml") && !file.equals(color.xml) && !file.equals(color.xml)) { String f = projectPath +file; System.out.println("del "+f); new File(f).delete(); } } } } } catch (Exception e) { e.printStackTrace(); System.out.printf(e.getMessage()); } } }
或
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相關的資訊),每一行":"前的字串就是檔案名稱,找到了檔案名稱就好處理了,直接刪除,或者列印出來,或者寫到一個檔案裡以再次確認是否確認要刪除,當把結果寫到一個檔案後我們就可以查看這個檔案是否有現在沒用到但仍不想刪除的檔案,如果有,處理方法也很簡單,去掉這一行或簡單地做個標記,如前面打#,然後再讀取這個檔案把沒做標記的行對應的檔案刪除就行了。
看起來很簡單,但是有幾點需要注意:
- 有些layout檔案,可能你之前用了他們,並在相應的Java檔案中用了這個layout布局中的id,如對某些ID的控制項設定了onClickListener,並在onClick的switch...case中引用了這些ID,但最後又不用這個Layout了,這時這個layout就是UnusedResource,但是以前引用它的Java代碼中對這個layout中的某些ID的引用還沒清除,此時刪掉這個Layout就會報錯,你可以選擇清理報錯的Java代碼,因為它們其即時Dead Code。或者每次清理一部分資源檔,如先清理layout,再清理drawable,對於每一項也可以根據檔案名稱的規則每次再清理一小部分,如只清理res/layout中以item_of開頭的檔案。
- lint的分析貌似是不完全準確的,或者說不夠智能,比如有一個drawable只被一個layout引用,而這個layout又是Unused的,lint可能不會發現這個drawable是Unused,這就需要我們多次重複執行前面的步驟,直到count為0。
- lint只能分析資源檔,即res目錄下的檔案,如果要分析Java檔案還需要其他方法,而且,有可能某個資源檔被某Java檔案引用,而這個Java檔案又是Unused,這樣這個資源檔就會逃過lint的檢查,所以我們最好先清理了Java檔案再清理資源檔。
總結
清理資源就兩個步驟:
- 找到未用到的資源
- 按需清理這些資源
通過UCDetector和lint基本上就可以檢測到項目中UnusedResource相關的問題了,一般像方法可見度,某個方法沒用到這種問題,不處理也罷,改到相應的檔案時手工處理算了,主要處理的就是某些檔案或類沒被用到,有檢測報告,分析下報告就行了。這種報告一般是每行報告一個問題並且每行的文字是有規律的(工具產生的肯定有規律),按規律過濾出我們需要的資訊就行了
清除Android工程中沒用到的資源