gradle build 在 lint 任务上失败

Posted

技术标签:

【中文标题】gradle build 在 lint 任务上失败【英文标题】:gradle build fails on lint task 【发布时间】:2014-01-09 01:14:18 【问题描述】:

我有一个使用 android Studio 0.4.0 创建的简单 android 项目。 我使用 Gradle 1.9 和 Gradle Android 插件 0.7。昨天我在我的 gradle 构建脚本中添加了 Jake Wharton 的 ButterKnife library:

dependencies 
            compile 'com.android.support:support-v4:19.0.0'
            compile 'com.android.support:appcompat-v7:19.0.0'

            // Butterknife
            compile 'com.jakewharton:butterknife:4.0.1'

当我从 Android Studio 运行应用程序时,构建运行良好并在我的设备上正确执行。但是当我尝试(从命令行)gradle build 时,构建失败。这是我的 lint 报告中的一部分:

InvalidPackage: Package not included in Android

/home/yami/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/4.0.1/f43b36925363701633d01adb8e54df7150397a78/butterknife-4.0.1.jar: Invalid package reference in library; not included in Android: javax.annotation.processing. Referenced from butterknife.internal.InjectViewProcessor.
/home/yami/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/4.0.1/f43b36925363701633d01adb8e54df7150397a78/butterknife-4.0.1.jar: Invalid package reference in library; not included in Android: javax.annotation.processing. Referenced from butterknife.internal.InjectViewProcessor.
/home/yami/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/4.0.1/f43b36925363701633d01adb8e54df7150397a78/butterknife-4.0.1.jar: Invalid package reference in library; not included in Android: javax.annotation.processing. Referenced from butterknife.internal.InjectViewProcessor.
/home/yami/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/4.0.1/f43b36925363701633d01adb8e54df7150397a78/butterknife-4.0.1.jar: Invalid package reference in library; not included in Android: javax.annotation.processing. Referenced from butterknife.internal.InjectViewProcessor.
/home/yami/.gradle/caches/modules-2/files-2.1/com.jakewharton/butterknife/4.0.1/f43b36925363701633d01adb8e54df7150397a78/butterknife-4.0.1.jar: Invalid package reference in library; not included in Android: javax.annotation.processing. Referenced from butterknife.internal.InjectViewProcessor.

也许我遗漏了一些东西,但无法在终端中构建项目阻止了 CI 用于 Android 项目的可能性。

任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

如果你设置abortOnError false,你会看到一个警告:

无法访问“abortOnError”:它在“LintOptions”中是私有的

感谢erluxman,您只需在lintOptions 块内的空白处按Ctrl+Space 即可查看属性并写入:

lintOptions 
    // if true, stop the gradle build if errors are found
    isAbortOnError = false
    // if true, show all locations for an error, do not truncate lists, etc.
    isShowAll = true

【讨论】:

【参考方案2】:

添加

android.lintOptions.abortOnError false

到你的应用\build.gradle

【讨论】:

我怀疑 OP 想对它的工作原理做一点解释。【参考方案3】:

我在 Android Studio 中遇到了一些 lint 错误,这些错误仅在我生成签名的 APK 时发生。

为了避免这种情况,我将以下内容添加到build.gradle

android 
    lintOptions 
        checkReleaseBuilds false
    

【讨论】:

【参考方案4】:

对于我来说,这是一个快速解决您的问题的方法:

android  
  lintOptions  
    abortOnError false 
  

更好的解决方案正在解决您的代码中的问题,因为 lint 工具会检查您的 Android 项目源文件是否存在潜在错误,并针对正确性、安全性、性能、可用​​性、可访问性和国际化进行优化改进。 p>

问题最常出现在以下情况下:

布局包含未解析的符号或缺少某些属性 其他结构问题,例如使用不推荐使用的元素或目标 API 版本不支持的 API 调用,可能会导致代码无法正确运行。

在 Android Studio 中通过Inspect Code 查找您的错误:Improve Your Code with Lint

【讨论】:

感谢您指出与又快又坏的解决方案相反的一面。我在 lint 生成的报告中发现了很多问题,可以在Application/build/reports/lint-results.html 找到。该报告非常详细且很有帮助。【参考方案5】:

您可以从这里选择合适的选项

android 
    lintOptions 
        // set to true to turn off analysis progress reporting by lint
        quiet true
        // if true, stop the gradle build if errors are found
        abortOnError false
        // if true, only report errors
        ignoreWarnings true
        // if true, emit full/absolute paths to files with errors (true by default)
        //absolutePaths true
        // if true, check all issues, including those that are off by default
        checkAllWarnings true
        // if true, treat all warnings as errors
        warningsAsErrors true
        // turn off checking the given issue id's
        disable 'TypographyFractions','TypographyQuotes'
        // turn on the given issue id's
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // check *only* the given issue id's
        check 'NewApi', 'InlinedApi'
        // if true, don't include source code lines in the error output
        noLines true
        // if true, show all locations for an error, do not truncate lists, etc.
        showAll true
        // Fallback lint configuration (default severities, etc.)
        lintConfig file("default-lint.xml")
        // if true, generate a text report of issues (false by default)
        textReport true
        // location to write the output; can be a file or 'stdout'
        textOutput 'stdout'
        // if true, generate an XML report for use by for example Jenkins
        xmlReport false
        // file to write report to (if not specified, defaults to lint-results.xml)
        xmlOutput file("lint-report.xml")
        // if true, generate an HTML report (with issue explanations, sourcecode, etc)
        htmlReport true
        // optional path to report (default will be lint-results.html in the builddir)
        htmlOutput file("lint-report.html")

        // set to true to have all release builds run lint on issues with severity=fatal
        // and abort the build (controlled by abortOnError above) if fatal issues are found
        checkReleaseBuilds true
        // Set the severity of the given issues to fatal (which means they will be
        // checked during release builds (even if the lint target is not included)
        fatal 'NewApi', 'InlineApi'
        // Set the severity of the given issues to error
        error 'Wakelock', 'TextViewEdits'
        // Set the severity of the given issues to warning
        warning 'ResourceAsColor'
        // Set the severity of the given issues to ignore (same as disabling the check)
        ignore 'TypographyQuotes'
    

【讨论】:

如果你真的想用lint(好),那是我认为最好的路径【参考方案6】:

将这些行添加到您的 build.gradle 文件中:

android  
  lintOptions  
    abortOnError false 
  

然后清理你的项目:D

【讨论】:

【参考方案7】:

在 Android Studio v1.2 中,它告诉您如何修复它:

【讨论】:

【参考方案8】:

如果abortOnError false 不能解决你的问题,你可以试试这个。

lintOptions 
    checkReleaseBuilds false

【讨论】:

谢谢,在发布时使用 gradle-retrolambdaproject-lombok 编译时节省了我的时间【参考方案9】:

0.7.0 提供了对 Lint 的扩展支持,但是,它并不总是能正常工作。 (例如,butterknife 库)

解决方案是在发现 lint 错误时禁用中止构建

我的灵感来自 https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7

(实现: https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java)

(讨论:https://plus.google.com/+AndroidDevelopers/posts/ersS6fMLxw1)

android 
  // your build config
  defaultConfig  ... 
  signingConfigs  ... 
  compileOptions  ... 
  buildTypes  ... 
  // This is important, it will run lint checks but won't abort build
  lintOptions 
      abortOnError false
  


如果您只需要禁用特定的 Lint 规则并让其他人的构建失败,请使用:

/*
 * Use only 'disable' or only 'enable', those configurations exclude each other
 */
android 
  lintOptions 
    // use this line to check all rules except those listed
    disable 'RuleToDisable', 'SecondRuleToDisable'
    // use this line to check just listed rules
    enable 'FirstRuleToCheck', 'LastRuleToCheck'
  

【讨论】:

如果你想你只能用disable 'InvalidPackage'禁用包检查 有没有办法从根 build.gradle 做到这一点,这样我就不必分叉一堆不同的子模块? @AnkushGupta 你可以把它放在root android 当然 @MarekSebera 如果您有许多 Android 库和一个 Android 应用程序,这是否可行?我没有让它工作。你能举个例子吗? @riper 可能有必要将 lintOptions 放入库中,但如果您将其放入根 android 块中,它应该可以工作,如果它不起作用,请尝试创建单独的问题以某种方式为您服务。【参考方案10】:

如果您想避免“abortInError false”选项,请查看 build/lint-results-release-fatal.html 文件。以下是 lint 检测到的错误。

我希望这可以帮助别人!

【讨论】:

确实不错的建议,只是一个注释,并不是所有的错误都可以手动纠正(比如缺少包javax.*【参考方案11】:

在 AndroidStudio 0.51 版上遇到同样的错误

构建工作正常,突然,仅更改版本代码值后,我得到了一个与 Lint 相关的构建错误。

尝试更改build.gradle,清除AndroidStudio缓存并重启,但没有任何变化。

最后我回到原始代码(导致错误),并从AndroidManifest.xml中删除android:debuggable="false",导致构建成功。

我又添加了一遍,它仍然有效...不要问我为什么:S

【讨论】:

以上是关于gradle build 在 lint 任务上失败的主要内容,如果未能解决你的问题,请参考以下文章

升级到 v22 后,signingConfigs 标记在 build.gradle 中给我一个 Lint 错误

gradle命令行运行lint时在apk项目中的build.gradle配置选项

Flutter Build - Gradle 任务 assembleDebug 失败,退出代码为 1

在春季教程之后,Gradle Build 失败并出现异常

Android studio / Gradle build 在发布中失败:无法确定任务':app:crashlyticsStoreDeobsRelease'的依赖关系

Gradle Build - 任务“:sonarqube”的执行失败无法被索引两次