如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片

在我们迭代项目的过程中,经常会启用某些功能,或者修改某些界面的问题,那么问题来了,这样很容易出现大量的冗余.java文件,冗余资源文件,一些冗余的界面文件等。那么问题既然出现了,那么如何去解决呢,这就是今天着重要去解决的问题?

first:

eclipse有个检查冗余java文件的插件,名叫UCDetector:

下载地址为:http://sourceforge.net/projects/ucdetector/files/latest/download?source=files

官网地址:http://www.ucdetector.org/index.html

一些使用方法:下载完后,将下载的jar文件放置在\eclipse\dropins文件夹下面,然后重新启动eclipse即可安装完这个插件。

一下是从其他网站复制的这个工具使用的截图:

第一个(使用):

第二个(设置以及):

第三个(设置后重启eclipse):

第五个(使用):

当然你可以根据提示,删除冗余的java文件(推荐这种,比较谨慎点,万一那个类你不想删呢);除了这种,还有另外一种更加炫计的方法:

https://github.com/jasonross/Android-CU(果然github上好多好东东,过多推荐)

一下是readme.md文件中的简介:

CU是clear unused的缩写,本项目主要用来清理Android工程中无用的代码文件和资源文件。

CURes.java用于清理资源文件,借助于ADT SDK自带的lint工具,相对路径为\sdk\tools\lint.bat。

CUSrc.java用于清理.java文件,需要Eclipse插件UCDetector配合。

使用

清除无用文件,需要交替运行CURes.javaCUSrc.java,直到没有可删除文件为止。

运行CURes.java

  • 运行参数为lint.bat文件绝对路径和android工程目录,如 D:adt/sdk/tools/lint.bat D:/nova
  • String[] dirArray为要删除资源文件的相对目录,默认为res目录下。一般来说,values不需要删除,故不添加。
  • 运行结果保存在当前目录下,文件名为格式化后的时间戳。

运行CUSrc.java

  • 设置UCDetector,忽略不需要扫描的文件,如Activity
  • 使用UCDetector扫描项目生成txt报告
  • 运行程序需要两个参数,UCDetector生成的报告路径,项目的路径,如D:/UCDetector/report.txt D:/nova
  • 运行结果会保存在当前目录下的UnusedJava.txt文件中。

注意

  • 清除资源时,如果使用字符串形式调用layout等资源文件,无法被lint识别,会造成误删。
  • 清除代码时,如果使用字符串形式调用fragment等控件或者使用反射时,无法被UCDetector识别,会造成误删。

其实项目中有三个java文件,一个CURes.java,一个CUSrc.java,还有ClearDrawble.java文件

来来来,先看下人家是怎么干的:

CURes.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CURes {

    public static final String separator = File.separator;

  //这里是清理无用res文件的方法,使用到了lint.bat工具    public static void clearRes(String lintPath, String projectPath, String[] dirArray) {
        Process process = null;
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        FileWriter fw = null;     //使用到了lint.bat工具检索项目中无用的资源文件  

       String cmd = lintPath + " --check UnusedResources " + projectPath;
        int fileCount = 0, singleCount;
        long fileSize = 0;

        try {           //生成日志文件,主要记录删除那些无用的资源文件            SimpleDateFormat formatter = new SimpleDateFormat("CURes-yyyy-MM-dd-HH-mm-ss");
            Date curDate = new Date(System.currentTimeMillis());
            String dateStr = formatter.format(curDate);
            fw = new FileWriter(dateStr + ".txt", true);

            Runtime runtime = Runtime.getRuntime();
            String line = null;

            do {
                singleCount = 0;          //执行lint无用资源文件

                  process = runtime.exec(cmd);
                is = process.getInputStream();
                isr = new InputStreamReader(is);
                br = new BufferedReader(isr);

                while ((line = br.readLine()) != null) {
                    boolean needDel = false;
                    for (String dir : dirArray) {
                        if (line.startsWith("res" + separator + dir)) {
                            needDel = true;
                            break;
                        }
                    }
                    if (needDel) {
                        int index = line.indexOf(":");
                        if (index > 0) {
                            String filePath = projectPath + separator + line.substring(0, index);
                            ++fileCount;
                            ++singleCount;
                            File file = new File(filePath);
                            fileSize += file.length();
                            //删除无用资源文件的代码                            boolean success = file.delete();
                            System.out.println(filePath + " " + success);
                            fw.write(filePath + " " + success + "\n");
                            fw.flush();
                        }
                    }
                }

            } while (singleCount != 0);

            String result = "delete file " + fileCount + ",save space " + fileSize / 1024 + "KB.";
            System.out.println(result);
            fw.write(result);
            fw.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (process != null) {
                process.destroy();
            }
        }
    }

    public static void main(String[] args) {

        //一下三行可以删除,没用        if (args.length < 2) {
            System.out.println("Please config program arguments. Correct arguments contain both absolute path of lint.bat and that of android project.");
            return;
        }
        //删除无用资源文件的的重要代码,请注意,lintPath值得是你的lint.bat文件地址,记得把╲╲换成/,否则会出现问题,projectPath是值得你的android项目地址       //一下args[0] args[1]代码都可以替换为stirng内容的地址           String lintPath = args[0];
        String projectPath = args[1];
        String[] dirArray = { "drawable", "layout", "anim", "color" };
        CURes.clearRes(lintPath, projectPath, dirArray);
    }
}

  

ok,然后我们看看如何删除无用.java文件的:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class CUSrc {
  //注意此处代码是清理无用java文件的,逻辑分下往下继续走    private static String clearUnusedJavaFile(String inFileName, String localProjectPath)
            throws IOException {

        File infile = new File(inFileName);
     //生成无用代码的日志文件        RandomAccessFile outfile = new RandomAccessFile("UnusedJava.txt", "rw");
        int index = -1;

     //分析项目中src文件夹下面的无用资源文件,localProjectPath为android项目的绝对路径           String path = localProjectPath + "/src/";
        BufferedReader bf = new BufferedReader(new FileReader(infile));
        String content = "";
        StringBuilder sb = new StringBuilder();

        while ((content = bf.readLine()) != null) {

            index = content.indexOf(".<init>");
            if (index != -1
                    && (content.indexOf("\tClass") == (content.indexOf(")") + 1) || content.indexOf("\tInterface") == (content.indexOf(")") + 1))) {
                String temp = path + content.substring(0, index).replace(‘.‘, ‘/‘) + ".java";
  

    

          //删除冗余代码,并生成日志文件内容               sb.append(temp).append("\t" + new File(temp).delete()).append(
                    "\t" + System.currentTimeMillis()).append("\r\n");
            }

        }
        outfile.seek(outfile.length());
        outfile.writeBytes(sb.toString());
        bf.close();
        outfile.close();

        return sb.toString();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        if (args.length == 2) {
            String inputFile = args[0];
            String localProjectPath = args[1];
            try {
                String str = clearUnusedJavaFile(inputFile, localProjectPath);
                System.out.print(str);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.print("something wrong");
            }

        } else {
            System.out.println("arguments wrong!!");
        }

    }

}

  

分析完毕,吃饭去喽。

时间: 2024-10-26 05:03:18

如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片的相关文章

[VS] - &quot;包含了重复的“Content”项。.NET SDK 默认情况下包括你项目中的“Content”项。&quot; 之解决

背景 VS 2017 升级至  VS 2017 v15.3 后,.Net Core 1.1 应用编译报错: Error: 包含了重复的"Content"项..NET SDK 默认情况下包括你项目中的"Content"项.可以从项目文件中删除这些项,或者如果希望将其显示包含在项目文件中,则可以将"EnableDefaultContentItems"属性设置为"false". Error : Duplicate 'Content'

一个自动清理Android项目无用资源的工具类

此工具在我的github上.地址:https://github.com/NashLegend/AndroidResourceCleaner 很多人都知道androidunusedresources.jar这个工具,它可以把Android项目中无用的资源列出来.然而它所做的也就止于此了,在列出所有的无用资源以后,开发者们还得手动删除这些文件,这实在是一个没技术含量却又烦人的体力活,但是作为程序员,自然是有解决办法的,我们为什么不写一个程序,让程序来实现这个功能呢? 这个功能要实现的功能应该是这样的

Android项目中gen文件下R文件无法生成的解决的方法

帮一个网友解决R文件无法生成的问题,搜集了些材料特整理例如以下,刚開始学习的人參考他人代码时极易出现此种问题,一般都是xml文件出错,无法被正确解析. gen文件夹无法更新,或者gen文件夹下的R.JAVA文件无法生成 1.gen文件夹的用处 android gen文件夹下的R.java并非由用户创建,而是androidproject本身将android的资源进行自己主动"编号"(ID)值. 2.gen文件夹下R文件无法更新/生成的原因 1)res文件夹下的layout下的xml文件名

Android项目中gen文件下R文件无法生成的解决办法

帮一个网友解决R文件无法生成的问题,搜集了些材料特整理如下,初学者参考他人代码时极易出现此种问题,一般都是xml文件出错,无法被正确解析. gen目录无法更新,或者gen目录下的R.JAVA文件无法生成 1.gen目录的用处 android gen目录下的R.java并不是由用户创建,而是android工程本身将android的资源进行自动"编号"(ID)值. 2.gen目录下R文件无法更新/生成的原因 1)res目录下的layout下的xml文件名有错.按照android的命名规范是

解决IDEA下运行android项目 No resource found that matches the given name &#39;Theme.AppCompat.Light&#39;.

1.右击项目选择 解决IDEA下运行android项目 No resource found that matches the given name 'Theme.AppCompat.Light'.

android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

1.下载工具 xstream 下载最新版本地址: https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/ 下载完成后 把jar包导入到自己的android项目中 2.asset 文件夹 下的 aa.xml 文件 <?xml version="1.0" encoding="UTF-8"?><product>    <name>

什么情况下才要重写Objective-C中的description方法

特别注意: 千万不要在description方法中同时使用%@和self,同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法 1.NSLog回顾   大家都知道,我们可以用NSLog函数来输出字符串和一些基本数据类 1 int age = 11; 2 NSLog( @" age is %d", age); * 第2行的%d代表会输出一个整型数据,右边的变量age会代替%d的位置进行输出 * 输出结果

eclipse下创建android项目src和layout下为空

在eclipse中创建android项目,src目录和layout目录下为空,现在开始解决这个问题(这只是一个开始). 在网上查找答案,说是eclipse版本和adt版本不兼容. 第一步;查看eclipse的版本号. Help-->About Eclipse--->选择eclipse的logo图标 第二步:查看adt插件的版本号 Help->About Eclipse--->点击,installation Detail 第三步:如果版本号兼容,那么就更新adt版本 Help---&

怎样在不处理的情况下在ABBYY FineReader中添加图像

可使用快速扫描窗口中的快速打开.扫描并保存为图像或任务自动化任务在没有进行预处理和 OCR 的ABBYY FineReader 中扫描或打开图像.如果你发现文档非常大,而你只需要识别其中的几个页面,就可以派上用场. 若有疑问可直接访问:http://www.abbyychina.com/FRshiyongjiqiao/fr-buchuli-tianjia.html 1. 在色彩模式下拉列表中,选择全彩色或黑白模式. 重要!当文档转换为黑白之后,您不能恢复彩色. 2. 单击所需的自动化任务: o