当前位置:   article > 正文

Android lint删除无用资源文件_android lint去除无用资源

android lint去除无用资源

Android项目经过长期的迭代开发,项目当中有大量无用的冗余资源,如果不整理将会导致apk包比较大。

在这里,我使用的是Android sdk tools中自带的Lint工具。


一、直接在Eclipse中使用。

右键需要清理的项目 -> Android Tools -> Run Lint:Check For Common Errors 这时就会打开Lint warning 视图,在这里就可以清理各种无用的资源、代码。

这种方式比较简单,但是需要你自己手动清理,如果项目比较大,就会繁琐无比。

二、Dos下使用命令行。

1,进入Dos,如果没有配置环境变量,那就cd到lint批处理文件所在目录

2,lint --check "UnusedResources" project路径 > 存放路径/result.txt 

使用这行命令,lint会把需要清理的project检索,生成一个结果文件,可以打开这个文件,发现都是一些无用资源的路径信息。

3,解析result结果文件,删除无用资源。

解析的方式就多种多样了,既可以写一个批处理,也可以是exe,当然,最简单的还是写个java类:

  1. private static String encoding = "UTF-8"; // 字符格式
  2. private static String projectPath = "";//Android工程所在地址
  3. private static String filePath = "";//result的所在路径
  4. public static void main(String[] args) {
  5. try {
  6. init(false);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. private static void init(boolean autoDelete) throws Exception {
  12. File file = new File(filePath, "result.txt");//获取result.txt 文件 生成地址
  13. if (file.isFile() && file.exists()) { // 判断文件是否存在
  14. InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
  15. BufferedReader bufferedReader = new BufferedReader(read);
  16. String line = null;
  17. while ((line = bufferedReader.readLine()) != null) {
  18. if (line.contains("UnusedResources") && !line.contains("res"+File.separator+"value") && !line.contains("appcompat")
  19. && !line.contains("res"+File.separator+"xml")) {
  20. int end = line.indexOf(":");
  21. if (end != -1) {
  22. String file_end = line.substring(0, end);
  23. String f = projectPath + file_end;
  24. System.out.println(f);
  25. if (autoDelete) {
  26. new File(f).delete();
  27. System.out.println("删除成功");
  28. }
  29. }
  30. }
  31. }
  32. read.close();
  33. }
  34. }
这里可以先设置aotoDelete为false,这样执行后只会打印需要删除的资源,检查发现没有问题后,再改为true就会自动删除了。


最后,提供一种更好的解决方法,result文件的生成以及无用资源的删除,都在一个java类中搞定:

  1. public static final String separator = File.separator;
  2. public static void clearRes(boolean autoDelete, String lintPath,
  3. String projectPath, String[] dirArray) {
  4. Process process = null;
  5. InputStream is = null;
  6. InputStreamReader isr = null;
  7. BufferedReader br = null;
  8. FileWriter fw = null;
  9. String cmd = lintPath + " --check UnusedResources " + projectPath;
  10. int fileCount = 0;
  11. long fileSize = 0;
  12. try {
  13. SimpleDateFormat formatter = new SimpleDateFormat(
  14. "yyyy-MM-dd-HH-mm-ss");
  15. Date curDate = new Date(System.currentTimeMillis());
  16. String dateStr = formatter.format(curDate);
  17. fw = new FileWriter(projectPath + separator + dateStr + ".txt",
  18. true);
  19. Runtime runtime = Runtime.getRuntime();
  20. String line = null;
  21. process = runtime.exec(cmd);
  22. is = process.getInputStream();
  23. isr = new InputStreamReader(is);
  24. br = new BufferedReader(isr);
  25. while ((line = br.readLine()) != null) {
  26. for (String dir : dirArray) {
  27. if (line.startsWith("res" + separator + dir)) {
  28. int index = line.indexOf(":");
  29. if (index > 0) {
  30. String filePath = projectPath + separator
  31. + line.substring(0, index);
  32. if (null != filePath && !"".equalsIgnoreCase(filePath)) {
  33. filePath = filePath.replaceAll("/", "\\\\");
  34. }
  35. ++fileCount;
  36. File file = new File(filePath);
  37. fileSize += file.length();
  38. System.out.println("unused file: " + filePath);
  39. if (autoDelete) {
  40. boolean success = file.delete();
  41. System.out.println(filePath + " " + success);
  42. fw.write(filePath + " " + success + "\n");
  43. fw.flush();
  44. }
  45. }
  46. break;
  47. }
  48. }
  49. }
  50. String result = "delete file " + fileCount + ",save space "
  51. + fileSize / 1024 + "KB.";
  52. System.out.println(result);
  53. fw.write(result);
  54. fw.flush();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. } finally {
  58. if (br != null) {
  59. try {
  60. br.close();
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. if (fw != null) {
  66. try {
  67. fw.close();
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. if (process != null) {
  73. process.destroy();
  74. }
  75. }
  76. }
  77. public static void main(String[] args) {
  78. if (args.length < 2) {
  79. System.out
  80. .println("Please config program arguments. Correct arguments contain both absolute path of lint.bat and that of android project.");
  81. return;
  82. }
  83. String lintPath = args[0];
  84. String projectPath = args[1];
  85. String[] dirArray = { "drawable", "layout", "anim", "color" };
  86. CURes.clearRes(true, lintPath, projectPath, dirArray);
  87. }

这个程序需要传入两个参数:lint命令路径和工程路径。例如

D:/software/adt-bundle-windows-x86_64/sdk/tools/lint.bat

E:/work_space/myproject

注意lint路径需要把lint.bat也加上,传入路径必须是正斜杠。

(以上代码,都经过验证和使用,完全可以直接运行)


新发现个小问题,eclipse在使用过lint后会出现打包apk失败,这是因为开启了lint的自动检测,

去eclipse  Preferences   选择 Android 下 Lint Error Checking   
去掉勾选项  "Run full error check when exporting app and abort if fatal errors are found "

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/365733
推荐阅读
相关标签
  

闽ICP备14008679号