清除Android工程中没用到的资源

要清理没用的资源,首要的工作当然是找到他们,我们知道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相关的问题了,一般像方法可见性,某个方法没用到这种问题,不处理也罢,改到相应的文件时手工处理算了,主要处理的就是某些文件或类没被用到,有检测报告,分析下报告就行了。这种报告一般是每行报告一个问题并且每行的文字是有规律的(工具生成的肯定有规律),按规律过滤出我们需要的信息就行了

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。