您的位置:首页 > 产品设计 > UI/UE

清理Android中无用的drawable资源和values资源

2015-11-28 20:57 363 查看
对于Android项目来说,项目需求改的多了、UI变化多了可能会导致很多无用的图片资源或者values资源,这些无用的资源导致最终的apk文件增大。肿么办?当然是删除了。。。怎么删除?难道一个一个寻找没用的资源,然后删除么?NONONO,作为一名伟大的(苦逼的)程序猿怎么能够在这种小事上浪费时间。。。当然要写代码自动化处理这种事情了。

本人也是非计算机专业,搞这个问题的时候也参考了一些网上的方法,总结了一个个人认为比较靠谱的方法,效率不是最高的但是思路绝对是很清晰,适合想自己DIY的童鞋参考,下面我就介绍一下思路。

1.首先是如何分析哪些资源没用,这个当然不是一个一个去手工搜索,Android SDK自带了一个分析工具,在sdk目录tools\lint.bat,运行这个命令就可以得到你想要的结果——哪些资源是没用的。在cmd窗口里输入命令“lint --check UnusedResources 路径 > result.txt” 就会在当前cmd命令的路径下输出一个名为result.txt的文件,分析的结果就在这个文件中。sdk的环境变量要配置好,没有配置的话就要输入lint的全路径,比如:D:\sdk\tools\lint。我们来看一下分析的部分结果:

结果总共可分为三类,1.drawable资源,2.layout资源,3.values资源。如下面的图所示:

drawable资源



values资源



layout资源



首先分析drawable资源和layout资源,它们的输出格式为:资源相对路径 + : + 废话。我们可以按行读取,以:分割,取出文件路径,然后删除文件,代码写法是:



代码中的注释还是挺清楚的,显示将cmd用java执行cmd命令,得到输入流,逐行读取,按照上面的分析取出文件名,拼出文件路径后用文件路径生成File,执行file的delete方法删除文件。

对于values就有点麻烦了,分析结果是告诉你哪个资源文件中的第几行无用。我的想法是:先将文件路径和行数截取出来,然后逐行读取目标文件A并写入一个临时文件B,A文件与B文件在同一个目录,遇到目标行数则直节写入换行符或者跳过,写入换行符是为了A文件和B文件总行数一致,方便对比。A文件读取完毕以后B文件中是将无用资源删掉后的最终文件,将A文件删除,B文件重命名为A即可。下面是代码:



以上就是我的思路,自己测试过了,没有什么问题,需要多执行几遍才能将无用资源删除彻底。

问题分析:目的虽然达到了,但是对于values资源的清理明显不是效率最高的。因为lint工具分析的结果输出并没有什么规律可言,一段drawable的,一段values的,一段layout的,并且values中同一个文件中并不是直接将所有无用资源一次性列出来,比如a.xml中第2行和第5行有两个无用的字符串,会分别给出res\values\a.xml:2和res\values\a.xml:5,按照我的处理方法会反复的对a.xml进行“读、写临时文件、删除原文件、重命名临时文件”这个步骤。其实可以对输出的结果进行预处理一下,将values相关的内容分离出来,按照文件名进行整理,同一个文件的无用资源行数整合到一起,直接一次性修改完毕。

其实这个问题也不是什么大问题,对于一个android项目来说,删除无用资源的时候多读写几遍也无所谓。假如你有代码洁癖的话,可以将优化后的代码贴在留言区大家一起参考 =。=

童鞋们有什么好的想法可以留言大家一起参考


代码:https://github.com/dreamlizhengwei/AndroidCleanDrawableAndValues
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: