天天看点

Android Lint 去除重复资源 之 idea探究

Android Lint是很好的检查工具,可以帮助开发者检查很多问题,其中检查android项目重复的资源文件非常有用。

1、命令行下使用

Android Lint有很多命令,具体可以在网上查到。今天主要使用check,这个命令目的是只进行某个或某几个类型的检查,比如只检查无用的资源“lint --check UnusedResources <project dir>”。至于都有哪些类型的检查,可以输入命令"lint --list"来查看,也可以输入命令"lint --show"来查看详细介绍。我们也可以把结果保存成文件,以便我们来查看,下面是一条简单的例子:

lint --simplehtml <savefile> --check UnusedResources <project dir>

这样就可以检查某个工程下的重复资源,并将结果保存成html文件方便查看(文件路径不需要加引号)。

2、idea下使用

eclipse下有lint的插件,而且网上相关介绍非常多,但是idea的相关文档就比较少。idea中已经支持android lint,如何使用呢?

在项目中点击右键,在出现的右键菜单中有“Analyze” --> “run inspaction by Name ...”。在弹出的搜索窗口中输入想执行的检查类型,如“Unused Resources”。不必全部输入就应该自动找到了,点击后会弹出“inspaction scope”选择窗口,选择检查的范围,一般选择整个项目或模块。“inspaction scope”窗口下面还可以设置文件过滤,选择好后点ok就开始检查了。然后就可以根据检查结果来去除重复的资源。

3、idea项目检查不全问题。

对idea的android项目检查是发现问题,不论是使用命令行还是idea自带插件来检查重复资源,根据结果可以发现检查的并不全面,没有检查图片资源。但是网上一些文档却很明确lint能检查图片资源,那么问题出在哪里?

其实就是idea的android项目结构的问题,idea创建的android项目built后会发现R.java等临时文件里面其实是空的,而对图片资源检查就需要基于R.java这个文件来检查。那么idea项目的真正的R.java文件在哪里?

它的位置是“C:\Users\<username>\.IntelliJIdea13\system\compile-server\<projectname_*****>\targets\java-production\<projectname>\android\generated_sources\aapt\<packagename>\R.java”。

自己简单研究了一下,找出了一个比较笨拙的解决方法。对命令行和idea,具体解决方法有些不同:

(1)命令行下。在项目下手的建立gen文件夹,在其下建立包名对应的文件夹,然后将R.java复制到下面。然后再使用lint来进行检查就可以了。因为android默认的文件结构R.java文件是在gen下的,所以lint会去这个文件夹下找R.java文件。

(2)idea下。与命令行的方法类似,不过根据创建的项目类型的不同,R.java存在的文件夹也不同。比如maven项目会在“target\generated-sources\r”下(想知道本项目的R.java文件位置,可以在项目右键菜单“open modules setting” --> "modules"中,选择对应的模块下的"Android",在右边窗口中选择“Generated Sources”选项卡,下面可以看到对应的设置,也可以对其进行修改。)。将R.java复制到对应的文件夹下替换空的R.java文件,然后在使用idea的lint来检查就会检查图片资源了。

(3)idea maven下。用idea对android项目编译,项目目录下R.java是空的。但是用maven来编译,会在目录下生成完整的R.java文件,就可以直接lint了。如何maven编译呢?首先项目是maven项目,然后在工具栏的运行选项那里选择“edit configurations”。在弹出的“run/debug configurations”窗口中点击“+”添加一个maven项,在右栏中定义名字,然后在"command line"中填入“clean compile”。这样就添加了一个运行选项,然后选择新添的去run,就可以用maven来编译项目了,这样就会生成完整的R.java文件

小小总结一下,之所以idea项目会出现问题,究其原因还是idea没有将R.java等临时文件放在项目目录下,这也是idea的一个特色。上面的解决方法也比较笨拙,不知道是否还有更有效便捷的方法,如果有人知道希望可以指点一下。而且还有一个文件,就是styles.xml文件中重复的部分仍然无法检测出来,有人知道是什么问题么?