lint工具删除无用资源最佳示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lint工具删除无用资源最佳示例相关的知识,希望对你有一定的参考价值。


lint删除无用图片最佳示例

1、使用lint命令生成报告
lint --check UnusedResources --html D:\95xiu510_bqt\95xiu5.1.0\mlint_bqt.txt D:\95xiu510_bqt\95xiu5.1.0
技术分享
执行结果
技术分享
产生的报告文件
技术分享
技术分享

2、处理生成的报告文件
首先,更改后缀名为.html(目的是去除里面的HTML标记)
其次,找到这里,点击展开
        技术分享
最后,复制上面.html文件中的内容到一个新的.txt文件中

3、根据要删除的文件类型设置筛选条件(已能智能处理layout文件和drawable文件)

4、至少设置以下三个参数
  1. String projectPath = "D:\\95_bqt\\95xiu5.0.9";//工程路径,注意,
  2. String fileName = "mlint_bqt.txt";//文件名
  3. String copyPath = "D:\\_95copy"; //备份路径
注意:根据要删除的文件类型,要先在备份目录中建几个文件夹,名字分布是xml、layout、hdpi、xhdpi等

5、执行java代码即可


源码

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * 删除android工程中未使用的drawable资源,并备份删除的文件<br/>
 * 注意:必须先把文件夹创建了才能往文件夹里写文件,否者报异常java.io.FileNotFoundException<br/>
 * 所以,一定要先在备份目录中建几个文件夹,名字分布是xml、layout、hdpi等<br/>
 * 日志格式:<br/>
 * 检索出的行===res\drawable\yellow_bg_item_selector_withline.xml: 
        The resource R.drawable.yellow_bg_item_selector_withline appears to be unused <br/>
 * 要删除文件的相对路径:res\drawable\yellow_bg_item_selector_withline.xml <br/>
 * 要删除文件的绝对路径:D:\95xiu_bqt\95xiu5.0.9\res\drawable\yellow_bg_item_selector_withline.xml <br/>
 * ---------------------------------------------yellow_bg_item_selector_withline.xml删除成功! <br/>
 * @author 白乾涛
 */  
public class DeleteFile {
    public static void main(String[] args) throws Exception {
        String projectPath = "D:\\95bobo_bqt\\95bobo2.0.9";//工程路径
        String fileName = "mlint_bqt_content_only.txt";//文件名
        String copyPath = "D:\\95bobo_copy"//备份路径,定要先在备份目录中建几个文件夹,名字是xml、layout、hdpi等
        //        String projectPath = "D:\\95xiu_bqt\\95xiu5.0.9";//工程路径
        //        String fileName = "mlint_bqt_content_only.txt";//文件名
        //        String copyPath = "D:\\95xiu_copy"; //备份路径,要先在备份目录中建几个文件夹,名字是xml、layout、hdpi等
        delete(projectPath, fileName, copyPath);
    }
    /**
     * 删除文件,简化方法
     * @param projectPath    Android工程所在地址
     * @param fileName        lint产生的文件名,要带后缀名
     * @param copyPath        要删除的文件的备份路径
     */
    private static void delete(String projectPath, String fileName, String copyPath) {
        boolean b = true;
        String filePath = projectPath + "\\" + fileName;//lint产生的文件放在Android工程根目录下
        String encoding = "UTF-8";
        delete(b, projectPath, filePath, copyPath, encoding);
    }
    /**
     * 删除文件
     * @param b        false 不删除文件,仅显示要删除的文件列表;true 删除
     * @param projectPath    Android工程所在跟目录
     * @param filePath            lint产生的【文件】所在路径,要带后缀名
     * @param    copyPath        要删除的文件的备份路径
     * @param encoding        编码格式
     */
    private static void delete(boolean b, String projectPath, String filePath, String copyPath, String encoding) {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new RuntimeException("文件或路径不存在");
        }
        if (!file.isFile()) {
            throw new RuntimeException("对应路径不是一个文件");//带后缀的文件路径,而非文件所在文件夹路径
        }
        InputStreamReader read = null;
        try {
            read = new InputStreamReader(new FileInputStream(file), encoding);//考虑编码格式  
        } catch (Exception e) {
            e.printStackTrace();
        }
        BufferedReader bufferedReader = new BufferedReader(read);
        String line = null;
        try {
            //逐行检查lint产生的文件
            while ((line = bufferedReader.readLine()) != null) {
                if ((line.contains("res\\drawable") || line.contains("res\\layout")) 
&& line.contains("appears to be unused")) {
                    //res\layout\activity_check.xml: The resource R.layout.activity_check appears to be unused
                    //res\drawable-xhdpi\anim_f16_effect0.png: The resource R.drawable.anim_f16_effect0 appears to be unused
                    //res\drawable\attend_enable.xml: The resource R.drawable.attend_enable appears to be unused
                    System.out.println("检索出的行=====" + line);
                    //因为文件已经被我处理过了,所以不需要怎么处理就能把需要的字符串弄出来
                    int start = line.indexOf("res");//第一次出现的位置(如果没有则返回 -1)
                    int end = line.indexOf(":", start + 1);//从指定位置开始查找第一次出现的位置
                    if (start != -1 && end != -1) {
                        //筛选出文件的相对路径
                        String mPath = line.substring(start, end);//包含start,不包含end
                        System.out.println("要删除文件的相对路径:=====" + mPath);
                        //筛选出文件中的layout、DPI,以放在不同子文件夹中
                        String child_path = null;
                        if (mPath.contains("res\\layout") && mPath.contains(".xml")) {
                            child_path = "layout";
                        } else {
                            int start2 = mPath.indexOf("-");
                            int end2 = mPath.indexOf("\\", start2 + 1);
                            if (start2 != -1 && end2 != -1) {
                                //把路径中的hdpi、xhdpi弄出来
                                child_path = mPath.substring(start2 + 1, end2);
                                System.out.println("要删除文件的子文件夹:=====" + child_path);
                            } else {
                                child_path = "xml";
                            }
                        }
                        //拼接文件的绝对路径
                        String mFilePath = projectPath + "\\" + mPath;//经检测,Windows平台用\或/都没问题,标准为\
                        System.out.println("要删除文件的绝对路径:=====" + mFilePath);
                        if (b) {
                            File mFile = new File(mFilePath);
                            //必须做健壮性判断
                            if (mFile.exists() && mFile.isFile()) {
                                //备份文件
                                copy(mFilePath, copyPath, child_path, mFile.getName());
                                //删除文件
                                if (mFile.delete())
                                    System.out.println("---------------------------------------------" + mFile.getName() + "删除成功!");
                                else
                                    System.out.println("---------------------------------------------" + mFile.getName() + "删除失败!");
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            read.close();
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("---------------------------------------------------------------------------------------------已完成!");
    }
    /**
     * 备份要删除的文件
     * @param pathFrom   源文件路径
     * @param pathTo         备份文件路径
     * @param    child_path     备份的子文件路径
     * @param    fileName     备份的文件名
     */
    public static void copy(String pathFrom, String pathTo, String child_path, String fileName) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream(pathFrom);
            fos = new FileOutputStream(pathTo + "\\" + child_path + "\\" + fileName);
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}




















以上是关于lint工具删除无用资源最佳示例的主要内容,如果未能解决你的问题,请参考以下文章

Android 性能优化:使用 Lint 优化代码去除多余资源

androidStudio去除无用、多余、未引用、未关联的资源的方式

检索源码 删除无用Properties的小工具

工利其器Android Lint篇——为Android量身定做的静态代码审查工具

C++学习(四一五)android lint

iOS ipa包瘦身---删除无用图片资源