清除Android工程中沒用到的資源

來源:互聯網
上載者:User

標籤: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相關的資訊),每一行":"前的字串就是檔案名稱,找到了檔案名稱就好處理了,直接刪除,或者列印出來,或者寫到一個檔案裡以再次確認是否確認要刪除,當把結果寫到一個檔案後我們就可以查看這個檔案是否有現在沒用到但仍不想刪除的檔案,如果有,處理方法也很簡單,去掉這一行或簡單地做個標記,如前面打#,然後再讀取這個檔案把沒做標記的行對應的檔案刪除就行了。

看起來很簡單,但是有幾點需要注意:

  1. 有些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開頭的檔案。
  2. lint的分析貌似是不完全準確的,或者說不夠智能,比如有一個drawable只被一個layout引用,而這個layout又是Unused的,lint可能不會發現這個drawable是Unused,這就需要我們多次重複執行前面的步驟,直到count為0。
  3. lint只能分析資源檔,即res目錄下的檔案,如果要分析Java檔案還需要其他方法,而且,有可能某個資源檔被某Java檔案引用,而這個Java檔案又是Unused,這樣這個資源檔就會逃過lint的檢查,所以我們最好先清理了Java檔案再清理資源檔。
總結

清理資源就兩個步驟:

  1. 找到未用到的資源
  2. 按需清理這些資源

通過UCDetectorlint基本上就可以檢測到項目中UnusedResource相關的問題了,一般像方法可見度,某個方法沒用到這種問題,不處理也罷,改到相應的檔案時手工處理算了,主要處理的就是某些檔案或類沒被用到,有檢測報告,分析下報告就行了。這種報告一般是每行報告一個問題並且每行的文字是有規律的(工具產生的肯定有規律),按規律過濾出我們需要的資訊就行了

 

清除Android工程中沒用到的資源

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.