kompilacja gradle kończy się niepowodzeniem w zadaniu lint

96

Mam prosty projekt na Androida, który utworzyłem w Android Studio 0.4.0. Używam Gradle 1.9 i Gradle Android Plugin 0.7. Wczoraj dodałem bibliotekę ButterKnife Jake'a Whartona do mojego skryptu kompilacji 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'
}

Kiedy uruchamiam aplikację z Android Studio, kompilacja działa dobrze i działa poprawnie na moich urządzeniach. Ale kiedy próbuję (z wiersza poleceń), gradle buildkompilacja kończy się niepowodzeniem. Oto część z mojego raportu kłaczków:

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.

Może czegoś mi brakuje, ale żeby nie móc zbudować projektu w listwach zaciskowych możliwości CI dla projektów Android.

Każda pomoc byłaby świetna.

Serj Lotutovici
źródło

Odpowiedzi:

143

W wersji 0.7.0 dostępna jest rozszerzona obsługa Lint, jednak nie zawsze działa ona poprawnie. (Np. Biblioteka scyzoryków)

Rozwiązaniem jest wyłączenie przerywania kompilacji na podstawie znalezionych błędów lint

Inspirację zaczerpnąłem z https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7

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

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

A jeśli chcesz wyłączyć tylko określoną regułę Lint i zachować awarię kompilacji na innych, użyj tego:

/*
 * 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
źródło
19
Jeśli chcesz, możesz wyłączyć sprawdzanie pakietu tylko za pomocądisable 'InvalidPackage'
Calin
Czy istnieje sposób, aby to zrobić z poziomu root build.gradle, aby nie musieć rozwidlać wielu różnych podmodułów?
ankushg
2
@AnkushGupta możesz oczywiście umieścić go w android{}bloku głównym
Marek Sebera
@MarekSebera Czy to działa, jeśli masz kilka bibliotek Androida i aplikację na Androida? Nie udało mi się. Czy mógłbyś pokazać przykład, jak to zrobić?
riper
@riper może być konieczne umieszczenie lintOptionsw bibliotekach, ale powinno działać, jeśli umieścisz to w androidbloku głównym , spróbuj utworzyć osobne pytanie, jeśli jakoś to nie zadziała.
Marek Sebera
53

jeśli abortOnError falsenie rozwiąże problemu, możesz spróbować tego.

lintOptions {
    checkReleaseBuilds false
}
panwy
źródło
1
Dzięki, uratował mi dzień podczas kompilacji z gradle-retrolambdaoraz project-lombokw wydaniu
Jason Sparc
38

Tutaj możesz wybrać odpowiednie opcje

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
źródło
1
Jeśli naprawdę chcesz użyć kłaczków (dobrze), myślę, że jest to najlepsza ścieżka
Cícero Moura
15

Wystąpiły pewne błędy w Android Studio, które wystąpiły tylko wtedy, gdy wygenerowałem podpisany plik APK.

Aby tego uniknąć, dodałem do build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
    }
}
Asaf Pinhassi
źródło
11

Dodaj te wiersze do pliku build.gradle:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Następnie wyczyść swój projekt: D

Muhamet Aljobairi
źródło
8

Jeśli chcesz uniknąć opcji „abortInError false”, spójrz na plik build / lint-results-release-fatal.html. Oto błędy wykryte przez kłaczki.

Mam nadzieję, że to komuś pomoże!

Daniel S.
źródło
1
Rzeczywiście dobra sugestia, tylko uwaga, nie wszystkie błędy można ręcznie poprawić (np. Brakujący pakiet javax.*)
Marek Sebera 30.04.14
4

W Android Studio v1.2 informuje, jak to naprawić:

wprowadź opis obrazu tutaj

Allen
źródło
3

Ten sam błąd występuje w AndroidStudio w wersji 0.51

Kompilacja działała dobrze i nagle, po zmianie tylko wartości kodu wersji, pojawił się błąd kompilacji związany z Lint.

Próbowano zmienić build.gradle, wyczyścić pamięć podręczną AndroidStudio i uruchomić ponownie, ale bez zmian.

W końcu wróciłem do oryginalnego kodu (powodując błąd) i usunąłem go android:debuggable="false"z AndroidManifest.xml, powodując powodzenie kompilacji.

Dodałem ponownie i nadal działa ... Nie pytaj mnie dlaczego: S.

Cedric Simon
źródło
3

Jak dla mnie to złe i szybkie rozwiązanie twojego problemu:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Lepszym rozwiązaniem jest rozwiązanie problemu w kodzie, ponieważ narzędzie lint sprawdza pliki źródłowe projektów systemu Android pod kątem potencjalnych błędów i ulepszeń optymalizacji pod kątem poprawności, bezpieczeństwa, wydajności, użyteczności, dostępności i internacjonalizacji.

Ten problem występuje najczęściej, gdy:

  • Układ zawiera nierozwiązane symbole lub brakuje niektórych atrybutów
  • Inne problemy strukturalne, takie jak użycie przestarzałych elementów lub wywołania interfejsu API, które nie są obsługiwane przez docelowe wersje interfejsu API, mogą prowadzić do nieprawidłowego działania kodu.

Znajdź swoje błędy Inspect Codew Android Studio: ulepsz swój kod za pomocą Lint

Dmytro Melnychuk
źródło
1
Dziękuję za wskazanie przeciwieństwa złego i szybkiego rozwiązania. Odkryłem wiele problemów w raporcie wygenerowanym przez lint dostępnym pod adresem Application/build/reports/lint-results.html. Raport jest bardzo szczegółowy i pomocny.
jgrocha
1

Dodaj

android.lintOptions.abortOnError false

do swojej aplikacji \ build.gradle

Mpak
źródło
1
Podejrzewam, że PO chciałby trochę wyjaśnić, jak to działa.
sniperd