Lint工具去除Android工程里不再需要的资源
摘要:
在项目开发过程中常常会不断改UI设计,于是在定稿要发布的前夕,发现有好多不再需要的资源文件存在,发布的包会把这些无用的资源都包含在里面,造成APK的下载包过大。可以通过Android SDK自带的工具进行无用资源的批量删除,下面就工具的使用流程和注意事项进行介绍。
第一步:lint检测无效资源
在Android SDK里启动android-sdk-windows\tools\lint.bat工具【有个小技巧:在文件夹Shift+右键 –> w键 -> Enter 即可打开cmd并进入当前文件夹目录】
将检测结果导出到文本文件,代码:lint 工程目录 > 导出的文件名,如 lint D:\Codes\Android\WCC_v2 > D:\Codes\Android\RemoveUnusedResources\result.txt
即可将WCC_v2下的工程检测结果导出到result.txt文件里
第二步:自动化删除无效文件
创建一个Java工程RemoveUnusedResources【C#也可】,关键代码如下:
public static void main(String[] args) { // TODO Auto-generated method stub String projectPath = "D:\\Codes\\Android\\WCC_v2\\"; try { BufferedReader reader = new BufferedReader(new FileReader("result.txt")); String line; int count = 0; double totalSize = 0; while((line = reader.readLine()) != null) { if (line.contains("UnusedResources") && !line.contains("res\\value") && !line.contains("appcompat") && !line.contains("umeng") ) { count++; int end = line.indexOf(":"); if (end != -1){ String file = line.substring(0, end); String f = projectPath +file; System.out.println(f); // File curFile = new File(f); // curFile.delete(); totalSize += FileSizeUtil.getFileOrFilesSize(f, FileSizeUtil.SIZETYPE_KB); //curFile.length(); // // new File(file).delete(); } } } System.out.println(String.valueOf(count)); System.out.println(String.valueOf(totalSize/1024)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
注意事项:
- Lint只能分析资源文件,即Res目录下的文件,这样会导致有可能某个资源文件被某Java文件引用,而这个Java文件是Unused的,但资源文件就不会被lint检测出来,所以如果要做彻底的瘦身发布,要先优化Java代码在lint去资源。
- Lint的分析不够职能,比如有一个drawable文件只被一个layout文件引用,但layout是Unused,lint就不会检测出该drawable为Unused文件,所以要反复删除再lint检测几次,直到检测到的count数目为0.
- 如果工程里引用了其他第三方库,如友盟后台,lint会认为umeng的drawable文件都是Unused resources,所以在删除时一定要避免删除掉第三方库自带的文件。
参考: