gradle build fallisce nel compito lint


95

Ho un semplice progetto Android che ho creato con Android Studio 0.4.0. Uso Gradle 1.9 e Gradle Android Plugin 0.7. Ieri ho aggiunto la libreria ButterKnife di Jake Wharton nel mio script di build 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 eseguo l'applicazione da Android Studio, la build funziona correttamente e viene eseguita correttamente sui miei dispositivi. Ma quando provo (dalla riga di comando) gradle buildla build fallisce. Ecco una parte del mio rapporto lanugine:

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.

Forse mi manca qualcosa, ma per non riuscire a costruire il progetto nelle morsettiere la possibilità di CI per progetti Android.

Qualsiasi aiuto sarebbe grande.

Risposte:


143

Con 0.7.0 viene fornito il supporto esteso per Lint, tuttavia, non funziona sempre correttamente. (Es. La libreria Butterknife)

La soluzione è disabilitare la compilazione interrotta sugli errori di lanugine trovati

Ho preso ispirazione da https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7

(implementazione: https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/model/Default.ModelAndroid )

(discussione: 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 hai bisogno di disabilitare solo una particolare regola Lint e mantenere la build in errore su altri, usa questo:

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

19
Se vuoi puoi disabilitare il controllo del pacchetto solo condisable 'InvalidPackage'
Calin

C'è un modo per farlo dalla root build.gradle in modo da non dover fare il fork di un mucchio di sottomoduli diversi?
ankushg

2
@AnkushGupta puoi metterlo nel android{}blocco radice ovviamente
Marek Sebera

@MarekSebera Funziona se hai un numero di librerie Android e un'applicazione Android? Non l'ho fatto funzionare. Potresti mostrare un esempio su come?
più maturo

@riper potrebbe essere necessario metterlo lintOptionsnelle librerie, ma dovrebbe funzionare se lo metti nel androidblocco root , prova a creare una domanda separata, se non funziona per te in qualche modo.
Marek Sebera

53

se abortOnError falsenon risolverà il tuo problema, puoi provare questo.

lintOptions {
    checkReleaseBuilds false
}

1
Grazie, mi ho salvato la giornata durante la compilazione con gradle-retrolambdae project-lombokin rilascio
Jason Sparc

37

È possibile selezionare le opzioni appropriate da qui

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

Se vuoi davvero usare lint (buono), penso che sia il percorso migliore
Cícero Moura

15

Ho riscontrato alcuni errori di lanugine in Android Studio che si sono verificati solo quando ho generato un APK firmato.

Per evitarlo, ho aggiunto quanto segue a build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
    }
}

11

Aggiungi queste righe al tuo file build.gradle:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Quindi pulisci il tuo progetto: D


8

Se vuoi evitare l'opzione "abortInError false", dai un'occhiata al file build / lint-results-release-fatal.html. Ecco gli errori rilevati da lint.

Spero che questo possa aiutare qualcuno!


1
In effetti un buon suggerimento, solo una nota, non tutti gli errori sono correggibili manualmente (come il pacchetto mancante javax.*)
Marek Sebera

4

In Android Studio v1.2, ti dice come risolverlo:

inserisci qui la descrizione dell'immagine


3

Ho ricevuto lo stesso errore su AndroidStudio versione 0.51

La build funzionava bene e improvvisamente, dopo aver cambiato solo il valore del codice della versione, ho ricevuto un errore di build relativo a Lint.

Ho provato a modificare build.gradle, cancellato la cache di AndroidStudio e riavviato, ma nessuna modifica.

Alla fine sono tornato al codice originale (causando l'errore) e rimosso android:debuggable="false"da AndroidManifest.xml, causando il successo della compilazione.

L'ho aggiunto di nuovo e funziona ancora ... Non chiedermi perché: S


3

Per quanto mi riguarda, è una cattiva e rapida soluzione per il tuo problema:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Una soluzione migliore è risolvere il problema nel codice, perché lo strumento lint controlla i file di origine del progetto Android per potenziali bug e miglioramenti di ottimizzazione per correttezza, sicurezza, prestazioni, usabilità, accessibilità e internazionalizzazione.

Questo problema si verifica più di frequente quando:

  • Il layout include simboli non risolti o alcuni attributi mancanti
  • Altri problemi strutturali, come l'utilizzo di elementi deprecati o chiamate API non supportate dalle versioni API di destinazione, potrebbero causare la mancata esecuzione del codice.

Trova i tuoi bug Inspect Codein Android Studio: migliora il tuo codice con Lint


1
Grazie per aver sottolineato l'opposto di una cattiva e rapida soluzione. Ho scoperto molti problemi nel rapporto generato da lint disponibile su Application/build/reports/lint-results.html. Il rapporto è molto dettagliato e utile.
jgrocha

1

Inserisci

android.lintOptions.abortOnError false

alla tua app \ build.gradle


1
Ho il sospetto che l'OP vorrebbe una piccola spiegazione sul funzionamento di questo.
sniperd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.