a compilação do gradle falha na tarefa de lint

95

Tenho um projeto android simples que criei com o Android Studio 0.4.0. Eu uso o Gradle 1.9 e o Gradle Android Plugin 0.7. Ontem adicionei a biblioteca ButterKnife de Jake Wharton no meu script de compilação do gradle:

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'
}

Quando executo o aplicativo no Android Studio, a compilação funciona bem e é executada corretamente em meus dispositivos. Mas quando tento (na linha de comando), gradle builda compilação falha. Aqui está uma parte do meu relatório de 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.

Talvez eu esteja faltando alguma coisa, mas não conseguir construir o projeto nos terminais bloqueia a possibilidade de CI para projetos Android.

Qualquer ajuda seria ótimo.

Serj Lotutovici
fonte

Respostas:

143

Com 0.7.0 vem suporte estendido para Lint, no entanto, ele nem sempre funciona corretamente. (Por exemplo, a biblioteca butterknife)

A solução é desativar o aborto de compilação em erros de lint encontrados

Tirei a inspiração de https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7

(implementação: https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7/build-system/gradle/src/main/groovy/com/android/build/gradleject/internal/modroidel/DefaultAndgradleject/internal/modroidel/Default )

(discussão: 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
  }
}

E se você precisar desabilitar apenas uma regra específica do Lint e manter a construção falhando em outras pessoas, use isto:

/*
 * 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'
  }
}
Marek Sebera
fonte
19
Se quiser, você só pode desativar a verificação de pacote comdisable 'InvalidPackage'
Calin
Existe uma maneira de fazer isso a partir do build.gradle raiz para que eu não tenha que bifurcar um monte de submódulos diferentes?
ankushg
2
@AnkushGupta você pode colocá-lo no android{}bloco de raiz , é claro
Marek Sebera
@MarekSebera Isso funciona se você tiver várias bibliotecas Android e um aplicativo Android? Eu não fiz funcionar. Você poderia mostrar um exemplo de como?
riper
@riper pode ser necessário colocar o lintOptionsnas bibliotecas, mas deve funcionar se você colocar isso no androidbloco raiz , tente criar uma pergunta separada, se não funcionar para você de alguma forma.
Marek Sebera
53

se abortOnError falsenão resolver o seu problema, você pode tentar isso.

lintOptions {
    checkReleaseBuilds false
}
panwy
fonte
1
Obrigado, salvou meu dia ao compilar com gradle-retrolambdae project-lombokno lançamento
Jason Sparc
37

Você pode selecionar as opções adequadas aqui

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'
    }
}
Biswajit Karmakar
fonte
Se você quiser mesmo usar fiapos (bom), esse é o melhor caminho eu acho
Cícero Moura
15

Tive alguns erros de lint no Android Studio que ocorreram apenas quando gerei um APK assinado.

Para evitá-lo, adicionei o seguinte a build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
    }
}
Asaf Pinhassi
fonte
11

Adicione estas linhas ao seu arquivo build.gradle:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Em seguida, limpe seu projeto: D

Muhamet Aljobairi
fonte
8

Se você quiser evitar a opção "abortInError false", dê uma olhada no arquivo build / lint-results-release-fatal.html. Aqui estão os erros detectados pelo lint.

Espero que isso possa ajudar alguém!

Daniel S.
fonte
1
De fato, boa sugestão, apenas uma observação, nem todos os erros são corrigíveis manualmente (como pacote ausente javax.*)
Marek Sebera
4

No Android Studio v1.2, ele mostra como corrigi-lo:

insira a descrição da imagem aqui

Allen
fonte
3

Obteve o mesmo erro na versão 0.51 do AndroidStudio

O build estava funcionando bem e, de repente, após alterar apenas o valor do código da versão, recebi um erro de build relacionado ao Lint.

Tentei mudar build.gradle, limpei o cache do AndroidStudio e reiniciei, mas nenhuma mudança.

Por fim, devolvido ao código original (fazendo com que o erro), e removido android:debuggable="false"a partir deAndroidManifest.xml , causando a acumulação de sucesso.

Eu adicionei novamente e ainda funciona ... Não me pergunte por quê: S

Cedric Simon
fonte
3

Quanto a mim, é uma solução ruim e rápida para o seu problema:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Melhor solução é resolver o problema em seu código, porque a ferramenta lint verifica seus arquivos de origem do projeto Android em busca de possíveis bugs e melhorias de otimização para correção, segurança, desempenho, usabilidade, acessibilidade e internacionalização.

Este problema ocorre com mais frequência quando:

  • O layout inclui símbolos não resolvidos ou algum atributo ausente
  • Outros problemas estruturais, como o uso de elementos obsoletos ou chamadas de API que não são suportadas pelas versões de API de destino, podem fazer com que o código falhe ao executar corretamente.

Encontre seus bugs Inspect Codeno Android Studio: melhore seu código com o Lint

Dmytro Melnychuk
fonte
1
Obrigado por apontar o oposto de uma solução ruim e rápida . Eu descobri muitos problemas no relatório gerado pelo lint disponível em Application/build/reports/lint-results.html. O relatório é muito detalhado e útil.
jgrocha
1

Adicionar

android.lintOptions.abortOnError false

para seu app \ build.gradle

Mpak
fonte
1
Suspeito que o OP gostaria de uma pequena explicação sobre o funcionamento disso.
sniperd