如何仅针对我的项目生成Android Lint报告,而排除库项目?

25

如何仅使Android Lint报告我的项目模块,并忽略我使用的任何库项目?即使我将Lint指向我的项目模块,它也会在库项目中喷出问题列表,而我对此不感兴趣 - 我想集中精力解决自己代码中的问题。

我无法看到指定是否跟踪库项目引用的参数,但也许您可以看到如何执行此操作。

4个回答

17
Android SDK工具21.1引入了一个新的方便功能来解决这个问题/错误。查看Android Lint溢出菜单,您会发现选项“跳过库项目依赖项”,它将完全符合您的要求。

enter image description here


我对Java有哪些一般性警告?是否可以使其忽略库项目上的所有警告和错误? - android developer
2
这解决了问题。应该被投票选为正确的解决方案。被接受的答案会产生@frank报告的问题。 - Imanol
2
这适用于Eclipse,但我如何在命令行中获得类似的行为?我正在作为构建过程的一部分从命令行运行lint(如果提交未使用的资源,则会中断构建)。现在,如果使用任何库项目,它将会中断。 - tdevaux
1
我尝试过这个方法,只要我没有构建应用程序,它就可以正常工作。但是当我选择使用“导出已签名的应用程序包”来构建应用程序时,所有语言的lint错误都会重新出现。如果我将lint翻译错误设置为警告并进行构建,则Google Play认为我的应用程序也包含了所有库的语言 - 基本上是所有库。 - flogvit
这并不能解决问题,因为有时我们会创建自己的库,它们应该被检查,而不是像我们想要忽略的第三方库... - android developer

6
如果您正在使用Eclipse,可以进入库项目的属性(右键单击项目->属性),在“Android Lint Preferences”下单击“忽略全部”,然后点击OK。

1
然而,这是一个可行的解决方案。Eclipse 中更改的首选项存储在项目内的 lint.xml 文件中,在从命令行运行 lint 时也会被评估。 - Bananeweizen
很有趣,但对我没有帮助,因为我不使用Eclipse,我使用IntelliJ。 - Ollie C
7
我刚才尝试了这个解决方案,但它没有起作用。在对库运行Lint时,Lint没有报告任何问题。但是当我对我的项目运行Lint时,来自库项目的问题仍然会被报告。 - Frank Harper
在命令行中,你是否确保将配置文件的名称传递给了lint命令? - lowellk
@FrankHarper:在最新的ADT工具中,现在有一个新选项可以修复那个bug。请看我的答案。 - jenzz
@OllieC 如果想要从命令行进行代码检查,请参考我的回答:https://dev59.com/w3XZa4cB1Zd3GeqPAv1o#24845800 - user11153

2

我的解决方案是修改lint输出,过滤其他项目的错误和警告。

我使用自定义ant任务和xslt文件进行过滤。

假设您正在使用ant来进行Android构建,您可以修改custom_rules.xml

<property name="lint.script" value="${sdk.dir}/tools/lint"/>
<property name="lint.report" location="${basedir}/lint-results-all.xml"/>  
<property name="lint.project.loc" location="${basedir}"/>

<target name="lint">
<!-- lint --xml lint-results-all.xml -->
  <exec executable="${lint.script}">
   <arg value="--xml"/>
   <arg value="${lint.report}"/>
   <arg value="${lint.project.loc}"/>
  </exec>
</target>

<target name="runlint" depends="lint">
    <xslt in="lint-results-all.xml" out="lint-results.xml" style="lint-cleanup.xslt" />
</target>

然后我添加了一个XSLT文件,用于剥离其他项目的问题:lint-cleanup.xslt。

这个XSLT文件基本上检查文件位置是否不包含“sherlock”,然后将其复制到新的输出文件。您可以根据需要进行修改。它也可以作为start-with而不是contains工作。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="issue">
            <xsl:variable name="location_to_filter" select="'sherlock'" />
            <xsl:if test="not(contains(location/@file, $location_to_filter))">
                    <xsl:copy-of select="."/>
            </xsl:if>
    </xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy>
</xsl:template>

</xsl:stylesheet>

为了运行lint报告,我只需在Jenkins上的ant构建命令行中添加它。
ant clean debug runlint

您需要获取lint-results-all.xml和lint-results.xml(其中包含过滤后的内容)。我将其与Jenkins Android Lint插件一起使用。
这种解决方案的不足之处在于它仍然在其他项目上运行lint,因此会浪费一些CPU周期。此外,您要过滤的名称在xslt文件中,因此如果您需要过滤多个第三方库,则可能无法很好地扩展。但是,XSLT足够强大,应该能够轻松创建更好的过滤器。

你是如何定义 lint.script 和 lint.project 的? - Sebastian Roth
@sebastian-roth lint.script和lint.report只是ant文件属性。我更新了答案以展示它们。 - sww314
你可以添加一些关于如何将它添加到pom文件和Maven构建中的信息吗? - cV2

2

使用lint.xml进行更普遍的方法,它也适用于Eclipse之外。只需将使用的库(例如Action Bar Sherlock和Facebook)放到忽略列表中:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="all">
        <ignore regexp="target/classes/com/actionbarsherlock/.*" />
        <ignore regexp="target/classes/com/facebook/.*" />
    </issue>
</lint>

这种方法同样适用于像Jenkins这样的CI解决方案。

没有 issue id="all" - Martin Zeitler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接