自定义linting规则失败,使用com.android.tools.build:gradle:2.3.0

时间:2017-03-10 15:15:05

标签: java android-studio android-gradle build.gradle lint

我的团队和我开发Android应用程序,并已决定所有应遵循的编码指南。因此,我开始实现可以找到here的自定义lint规则,并将其添加到Jenkins的自动构建过程中。

我们现在遇到的问题是,从升级我们的Android项目后,这些规则不再有效 'com.android.tools.build:gradle:2.2.0''com.android.tools.build:gradle:2.3.0'

我们不断得到错误: java.lang.NoSuchMethodError: com.android.tools.lint.detector.api.JavaContext.getContents()Ljava/lang/String;

当切换回gradle 2.2.0一切正常时,会检查自定义规则并构建应用程序。

我尝试在lint存储库中更新gradle,但遗憾的是在我的TodoDetector第72行遇到完全相同的问题。在Android工作室中,所有依赖关系都得到了很好的解决,但在尝试使用{{构建和部署库时1}},我们得到上面列出的错误。

我一直在寻找并且还没有为这个问题找到可行的解决方案。非常感谢任何帮助,提示或建议。

终端输出

./gradlew clean build test install

gradle文件

:clean
:aarWrapper:clean
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build
:aarWrapper:preBuild UP-TO-DATE
:aarWrapper:preDebugBuild UP-TO-DATE
:aarWrapper:checkDebugManifest
:aarWrapper:prepareDebugDependencies
:aarWrapper:compileDebugAidl
:aarWrapper:compileDebugNdk UP-TO-DATE
:aarWrapper:compileLint
:aarWrapper:copyDebugLint UP-TO-DATE
:aarWrapper:mergeDebugShaders
:aarWrapper:compileDebugShaders
:aarWrapper:generateDebugAssets
:aarWrapper:mergeDebugAssets
:aarWrapper:mergeDebugProguardFiles UP-TO-DATE
:aarWrapper:packageDebugRenderscript UP-TO-DATE
:aarWrapper:compileDebugRenderscript
:aarWrapper:generateDebugResValues
:aarWrapper:generateDebugResources
:aarWrapper:packageDebugResources
:aarWrapper:processDebugManifest
:aarWrapper:generateDebugBuildConfig
:aarWrapper:processDebugResources
:aarWrapper:generateDebugSources
:aarWrapper:incrementalDebugJavaCompilationSafeguard
:aarWrapper:javaPreCompileDebug
:aarWrapper:compileDebugJavaWithJavac
:aarWrapper:processDebugJavaRes UP-TO-DATE
:aarWrapper:transformResourcesWithMergeJavaResForDebug
:aarWrapper:transformClassesAndResourcesWithSyncLibJarsForDebug
:aarWrapper:mergeDebugJniLibFolders
:aarWrapper:transformNativeLibsWithMergeJniLibsForDebug
:aarWrapper:transformNativeLibsWithStripDebugSymbolForDebug
:aarWrapper:transformNativeLibsWithSyncJniLibsForDebug
:aarWrapper:bundleDebug
:aarWrapper:compileDebugSources
:aarWrapper:assembleDebug
:aarWrapper:preReleaseBuild UP-TO-DATE
:aarWrapper:checkReleaseManifest
:aarWrapper:prepareReleaseDependencies
:aarWrapper:compileReleaseAidl
:aarWrapper:compileReleaseNdk UP-TO-DATE
:aarWrapper:copyReleaseLint UP-TO-DATE
:aarWrapper:mergeReleaseShaders
:aarWrapper:compileReleaseShaders
:aarWrapper:generateReleaseAssets
:aarWrapper:mergeReleaseAssets
:aarWrapper:mergeReleaseProguardFiles UP-TO-DATE
:aarWrapper:packageReleaseRenderscript UP-TO-DATE
:aarWrapper:compileReleaseRenderscript
:aarWrapper:generateReleaseResValues
:aarWrapper:generateReleaseResources
:aarWrapper:packageReleaseResources
:aarWrapper:processReleaseManifest
:aarWrapper:generateReleaseBuildConfig
:aarWrapper:processReleaseResources
:aarWrapper:generateReleaseSources
:aarWrapper:incrementalReleaseJavaCompilationSafeguard
:aarWrapper:javaPreCompileRelease
:aarWrapper:compileReleaseJavaWithJavac
:aarWrapper:processReleaseJavaRes UP-TO-DATE
:aarWrapper:transformResourcesWithMergeJavaResForRelease
:aarWrapper:transformClassesAndResourcesWithSyncLibJarsForRelease
:aarWrapper:mergeReleaseJniLibFolders
:aarWrapper:transformNativeLibsWithMergeJniLibsForRelease
:aarWrapper:transformNativeLibsWithStripDebugSymbolForRelease
:aarWrapper:transformNativeLibsWithSyncJniLibsForRelease
:aarWrapper:bundleRelease
:aarWrapper:compileReleaseSources
:aarWrapper:assembleRelease
:aarWrapper:assemble
:aarWrapper:lint FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':aarWrapper:lint'.
> com.android.tools.lint.detector.api.JavaContext.getContents()Ljava/lang/String;

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

aarWrapper gradle

apply plugin: 'java'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0'
    }
}

repositories {
    jcenter()
}

allprojects {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}

dependencies {
    compile 'com.android.tools.lint:lint:24.3.1'
    compile 'com.android.tools.lint:lint-api:24.3.1'
    compile 'com.android.tools.lint:lint-checks:24.3.1'
    testCompile 'junit:junit:4.11'
    testCompile 'org.assertj:assertj-core:3.0.0'
    testCompile 'org.mockito:mockito-core:1.9.5'
    testCompile 'com.android.tools.lint:lint:24.3.1'
    testCompile 'com.android.tools.lint:lint-tests:24.3.1'
    testCompile 'com.android.tools:testutils:24.3.1'
}

jar {
    baseName 'com.bignerdranch.linette'
    version '1.0'

    manifest {
        attributes 'Manifest-Version': 1.0
        attributes('Lint-Registry': 'com.bignerdranch.linette.registry.CustomIssueRegistry')
    }
}

sourceSets {
    main {
        java {
            srcDirs = ["lint/src/main/java"]
        }
    }
    test {
        java {
            srcDirs = ["lint/src/test/java"]
        }
    }
}

configurations {
    lintChecks
}

dependencies {
    lintChecks files(jar)
}

defaultTasks 'assemble'

task install(type: Copy) {
    from configurations.lintChecks
    into System.getProperty('user.home') + '/.android/lint/'
}

5 个答案:

答案 0 :(得分:1)

如果停用即时游戏无效,请将其添加到build.gradle文件中。

android {
    lintOptions {
        // if true, stop the gradle build if errors are found
        abortOnError false
    }
}

然后清理你的项目并运行。

如果abortOnError false无法解决您的问题,那么您可以尝试以下

lintOptions {
    checkReleaseBuilds false
}

希望它能解决您的问题。

资源链接:

  1. https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7
  2. gradle build fails on lint task

答案 1 :(得分:1)

Daniel Passos在this tutorial

中给出了一个解决方案

忽略Erros

Lint是Gradle构建过程的一部分,默认情况下,如果失败,您的构建将停止,您将收到类似的消息:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:lint'.
> Lint found errors in the project; aborting build.

在99%的情况下,人们会开始忽略lint而不是修复问题,在build.gradle app上添加此内容

lintOptions {   
    abortOnError false   
} 

但恕我直言,这是错误的。如果lint告诉你,你有一个问题,最好的办法是修复它。 Lint是一款让您的应用和用户体验更好的工具。

忽略特定的错误

有时你真的需要忽略一些lint错误。例如,在WebView中使用webView.getSettings().setJavaScriptEnabled(true);

在这种情况下,您应该只禁用特定的ID而不是禁用整个lint。

lintOptions {
    disable 'SetJavaScriptEnabled'
}

您也可以直接在代码中忽略它:

@SuppressLint "SetJavaScriptEnabled")

或者在您的XML中

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="SomeLintIssueIdHere" >

如果您愿意,可以从项目根目录中的lint.xml文件中移出所有问题规则。

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="SetJavaScriptEnabled" severity="ignore" />
</lint>

答案 2 :(得分:1)

我正在尝试使用相同的代码并遇到同样的问题。

com.android.tools.lint有新版本。试试25.2.0或更高版本,您会注意到示例代码TodoDetector使用了弃用的方法。

基本上,您需要将您的类实现Detector.JavaPsiScanner而不是Detector.JavaScanner

http://static.javadoc.io/com.android.tools.lint/lint-api/25.3.0/com/android/tools/lint/detector/api/Detector.JavaPsiScanner.html

答案 3 :(得分:0)

迁移到Android Gradle插件2.3.0 com.android.tools.build:gradle:2.3.0时出现同样的错误。在我的情况下的问题是我使用的android-apt插件已经被弃用:Android Gradle插件2.3.0具有开箱即用的注释处理,似乎阻止了android-apt。

阅读迁移指南并迁移gradle构建脚本和“apt”依赖项的“apt”部分,然后删除android-apt插件: https://bitbucket.org/hvisser/android-apt/wiki/Migration

UPD:上述修复后,问题仍然存在。我查看了事件日志中的错误堆栈跟踪,发现异常发生在我的一个自定义lint检查器(io.vokal.lint:todo:1.0.3)中。从~/.android/lint中删除它解决了问题。

答案 4 :(得分:0)

我遇到了同样的问题。展望context.getContents()

return mDriver.getClient().readFile(file);

所以我尝试手动执行此操作:context.getDriver().getClient().readFile(context.file)会抛出相同的错误消息。

我现在的解决方法是,而不是使用context.getContents()我只使用context.file并在没有驱动程序的情况下读出它。我不确定这是否是一种好方法,但对我来说它是有效的。

所以这里是工作代码:

static void someMethod(com.android.tools.lint.detector.api.Context context){
    readFile(context.file)
    ...
}

static String readFile(File file) {
    String path = file.getAbsolutePath();
    Charset encoding = Charset.defaultCharset();
    try {
        byte[] encoded = Files.readAllBytes(Paths.get(path));
        return new String(encoded, encoding);

    } catch (IOException e){
        return "";
    }
}