Gradle Build schlägt bei Flusenaufgabe fehl

95

Ich habe ein einfaches Android-Projekt, das ich mit Android Studio 0.4.0 erstellt habe. Ich benutze Gradle 1.9 und Gradle Android Plugin 0.7. Gestern habe ich Jake Whartons ButterKnife-Bibliothek in mein Gradle-Build-Skript aufgenommen:

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

Wenn ich die Anwendung von Android Studio aus starte, läuft der Build einwandfrei und wird auf meinen Geräten korrekt ausgeführt. Aber wenn ich es versuche (über die Kommandozeile) gradle build, schlägt der Build fehl. Hier ist ein Teil aus meinem Flusenbericht:

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.

Vielleicht fehlt mir etwas, aber nicht in der Lage zu sein, das Projekt in den Terminalblöcken zu erstellen, blockiert die Möglichkeit von CI für Android-Projekte.

Jede Hilfe wäre großartig.

Serj Lotutovici
quelle

Antworten:

143

Mit 0.7.0 wird Lint erweitert, es funktioniert jedoch nicht immer richtig. (ZB die Buttermesserbibliothek)

Die Lösung besteht darin, das Abbrechen des Builds aufgrund gefundener Flusenfehler zu deaktivieren

Ich habe mich von https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7 inspirieren lassen

(Implementierung: https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/modelDef )

(Diskussion: 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
  }
}

Wenn Sie nur eine bestimmte Lint-Regel deaktivieren und den Build für andere fehlschlagen lassen müssen, verwenden Sie Folgendes:

/*
 * 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
quelle
19
Wenn Sie möchten, können Sie die Paketprüfung nur mitdisable 'InvalidPackage'
Calin
Gibt es eine Möglichkeit, dies über das root build.gradle zu tun, damit ich nicht eine Reihe verschiedener Submodule aufteilen muss?
Ankushg
2
@ AnkushGupta können Sie es android{}natürlich in Wurzelblock setzen
Marek Sebera
@MarekSebera Funktioniert das, wenn Sie eine Reihe von Android-Bibliotheken und eine Android-Anwendung haben? Ich habe es nicht zum Laufen gebracht. Können Sie ein Beispiel dafür zeigen, wie?
Riper
@riper Es kann notwendig sein, das lintOptionsin die Bibliotheken zu stellen, aber es sollte funktionieren, wenn Sie dies in den Root- androidBlock einfügen. Versuchen Sie, eine separate Frage zu erstellen, wenn es für Sie irgendwie nicht funktioniert.
Marek Sebera
53

Wenn abortOnError falsesich Ihr Problem nicht beheben lässt, können Sie dies versuchen.

lintOptions {
    checkReleaseBuilds false
}
panwy
quelle
1
Danke, hat mir den Tag beim Kompilieren mit gradle-retrolambdaund project-lombokin der Veröffentlichung gerettet
Jason Sparc
37

Hier können Sie die richtigen Optionen auswählen

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
quelle
Wenn Sie wirklich Flusen (gut) verwenden möchten, ist dies der beste Weg, den ich denke
Cícero Moura
15

Ich hatte einige Flusenfehler in Android Studio, die nur auftraten, als ich eine signierte APK generierte.

Um dies zu vermeiden, habe ich Folgendes hinzugefügt build.gradle

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

Fügen Sie diese Zeilen zu Ihrer build.gradle-Datei hinzu:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Reinigen Sie dann Ihr Projekt: D.

Muhamet Aljobairi
quelle
8

Wenn Sie die Option "abortInError false" vermeiden möchten, sehen Sie sich die Datei build / lint-results-release-fatal.html an. Hier sind die durch Flusen erkannten Fehler.

Ich hoffe das kann jemandem helfen!

Daniel S.
quelle
1
In der Tat guter Vorschlag, nur ein Hinweis, nicht alle Fehler sind manuell korrigierbar (wie fehlendes Paket javax.*)
Marek Sebera
4

In Android Studio v1.2 erfahren Sie, wie Sie das Problem beheben können:

Geben Sie hier die Bildbeschreibung ein

Allen
quelle
3

Habe den gleichen Fehler auf AndroidStudio Version 0.51

Build funktionierte einwandfrei und plötzlich, nachdem ich nur den Versionscode geändert hatte, bekam ich einen Lint-bezogenen Build-Fehler.

Versucht zu ändern build.gradle, AndroidStudio Cache geleert und neu gestartet, aber keine Änderung.

Schließlich kehrte ich nach Original - Code (den Fehler verursacht), und entfernt android:debuggable="false"von AndroidManifest.xml, so dass der Build erfolgreich zu sein.

Ich habe es wieder hinzugefügt und es funktioniert immer noch ... Frag mich nicht warum: S.

Cedric Simon
quelle
3

Für mich ist es eine schlechte und schnelle Lösung für Ihr Problem:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Eine bessere Lösung besteht darin, Probleme in Ihrem Code zu lösen, da das Lint-Tool Ihre Android-Projektquelldateien auf potenzielle Fehler und Optimierungsverbesserungen auf Richtigkeit, Sicherheit, Leistung, Benutzerfreundlichkeit, Zugänglichkeit und Internationalisierung überprüft.

Dieses Problem tritt am häufigsten auf, wenn:

  • Das Layout enthält ungelöste Symbole oder fehlende Attribute
  • Andere strukturelle Probleme, wie die Verwendung veralteter Elemente oder API-Aufrufe, die von den Ziel-API-Versionen nicht unterstützt werden, können dazu führen, dass Code nicht ordnungsgemäß ausgeführt wird.

Finden Sie Ihre Fehler Inspect Codein Android Studio: Verbessern Sie Ihren Code mit Lint

Dmytro Melnychuk
quelle
1
Vielen Dank, dass Sie auf das Gegenteil einer schlechten und schnellen Lösung hingewiesen haben . Ich habe viele Probleme in dem von lint generierten Bericht entdeckt, der unter verfügbar ist Application/build/reports/lint-results.html. Der Bericht ist sehr detailliert und hilfreich.
Jgrocha
1

Hinzufügen

android.lintOptions.abortOnError false

zu Ihrer App \ build.gradle

Mpak
quelle
1
Ich vermute, das OP hätte gerne eine kleine Erklärung zu der Funktionsweise.
Sniperd