【问题标题】:Android Lint report for my project only, excluding library projects?仅针对我的项目的 Android Lint 报告,不包括库项目?
【发布时间】:2012-04-06 23:58:25
【问题描述】:

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

我看不到一个参数来指定它是否遵循对库项目的引用,但也许你可以看到如何做到这一点。

【问题讨论】:

    标签: android android-lint


    【解决方案1】:

    如果您使用的是 Eclipse,请转到库项目的属性(右键单击项目 -> 属性)并在“Android Lint Preferences”下单击“全部忽略”,然后单击确定。

    【讨论】:

    • 尽管如此,这是一个可行的解决方案。在 Eclipse 中更改的首选项存储在项目内的 lint.xml 文件中,之后在从命令行运行 lint 时也会对其进行评估。
    • 很有趣,但对我没有帮助,因为我不使用 Eclipse,我使用 IntelliJ。
    • 我刚试过这个解决方案,但它不起作用。在库上运行 Lint 时,Lint 不会报告任何问题。但是当我在我的项目上运行 Lint 时,仍然会报告来自 Library 项目的问题。
    • 在命令行上,您确定将 confix 文件的名称传递给 lint 命令吗?
    • @FrankHarper:现在最新的 ADT 工具中有一个新选项可以修复该错误。看看我的回答。
    【解决方案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 而不是包含。

    <?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 plugin

    这个解决方案的丑陋之处在于它仍然在另一个项目上运行 lint,所以你浪费了几个 CPU 周期。此外,您要过滤的名称位于 xslt 文件中,因此如果您使用需要过滤的多个 3rd 方库,它可能无法很好地扩展。但是,XSLT 足够强大,应该能够根据需要轻松创建更好的过滤器。

    【讨论】:

    • 你是如何定义 lint.script 和 lint.project 的?
    • @sebastian-roth lint.script 和 lint.report 只是 ant 文件属性。我更新了答案以显示它们。
    • 您能否添加一些信息,如何将其添加到 pom 文件和 maven 构建中?
    【解决方案3】:

    Android SDK 工具 21.1 引入了一个新的、方便的功能来解决这个问题/错误。

    查看 Android Lint 溢出菜单,您会发现选项 Skip Library Project Dependencies 将完全满足您的需求。

    【讨论】:

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

    使用 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"
    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 2019-05-27
    • 2012-07-15
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多