не вдається побудувати gradle на завданні lint


95

У мене є простий проект для Android, який я створив за допомогою Android Studio 0.4.0. Я використовую Gradle 1.9 та Gradle Android Plugin 0.7. Вчора я додав бібліотеку ButterKnife Джейка Уортона у свій сценарій побудови 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'
}

Коли я запускаю програму з Android Studio, збірка працює нормально і виконується правильно на моїх пристроях. Але коли я намагаюся (з командного рядка), gradle buildзбірка не вдається. Ось частина з мого звіту:

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.

Можливо, я чогось пропускаю, але не для того, щоб мати можливість побудувати проект у терміналі, блокує можливість CI для проектів Android.

Будь-яка допомога була б чудовою.

Відповіді:


143

З 0.7.0 надається розширена підтримка Lint, однак вона працює не завжди належним чином. (Наприклад, бібліотека масляного ножа)

Рішення полягає у відключенні переривання побудови на знайдених помилках ворсу

Я надихнувся на https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7

(реалізація: https://android.googlesource.com/platform/tools/base/+/e6a5b9c7c1bca4da402de442315b5ff1ada819c7/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/model/Default )

(обговорення: 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
  }
}

І якщо вам потрібно відключити лише певне правило Lint і не допускати збірки на інших, використовуйте це:

/*
 * 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
Якщо ви хочете, ви можете вимкнути перевірку пакету лише за допомогоюdisable 'InvalidPackage'
Calin

Чи є спосіб зробити це з кореневого build.gradle, щоб мені не довелося розгалужувати купу різних підмодулів?
ankushg

2
@AnkushGupta, звичайно, ти можеш помістити його в кореневий android{}блок
Marek Sebera

@MarekSebera Чи працює це, якщо у вас є низка бібліотек Android і програма для Android? Я не змусив це працювати. Не могли б ви показати приклад того, як?
дозрівач

@riper може знадобитися помістити lintOptionsв бібліотеки, але це має спрацювати, якщо ви помістите це в кореневий androidблок, спробуйте створити окреме запитання, якщо воно у вас якось не працює.
Марек Себера

53

якщо abortOnError falseпроблема не вирішена, спробуйте це.

lintOptions {
    checkReleaseBuilds false
}

1
Дякую, врятував мій день під час складання gradle-retrolambdaта project-lombokвипуску
Джейсон Спарк

37

Ви можете вибрати правильні параметри тут

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

Якщо ви дійсно хочете використовувати ворсинки (хороші), це найкращий шлях, на мою думку
Cícero Moura

15

У мене були деякі помилки на ворсі в Android Studio, які виникали лише тоді, коли я створив підписаний файл .apk.

Щоб цього уникнути, я додав до build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
    }
}


8

Якщо ви хочете уникнути параметра "abortInError false", перегляньте файл build / lint-results-release-fatal.html. Ось помилки, виявлені ворсом.

Сподіваюся, це може комусь допомогти!


1
Насправді хороша пропозиція, лише примітка, не всі помилки можна виправити вручну (наприклад, відсутність пакету javax.*)
Марек Себера


3

Виникла така сама помилка на AndroidStudio версії 0.51

Збірка працювала нормально, і раптом, змінивши лише значення коду версії, я отримав помилку збірки, пов’язану з Lint.

Спробував змінити build.gradle, очистив кеш AndroidStudio та перезапустив, але без змін.

Нарешті, я повернувся до початкового коду (що спричинило помилку) і видалив android:debuggable="false"з AndroidManifest.xml, що призвело до успішної збірки.

Я додав його знову, і він все ще працює ... Не питайте мене, чому: S


3

Як на мене, це погане та швидке рішення для вашої проблеми:

android { 
  lintOptions { 
    abortOnError false 
  }
}

Кращим рішенням є вирішення проблеми у вашому коді, оскільки інструмент lint перевіряє вихідні файли вашого проекту Android на наявність потенційних помилок та покращення оптимізації на правильність, безпеку, продуктивність, зручність використання, доступність та інтернаціоналізацію.

Ця проблема найчастіше виникає, коли:

  • Макет містить невирішені символи або якийсь атрибут
  • Інші структурні проблеми, такі як використання застарілих елементів або виклики API, які не підтримуються цільовими версіями API, можуть призвести до неправильної роботи коду.

Знайдіть свої помилки Inspect Codeв Android Studio: вдосконалюйте свій код за допомогою Lint


1
Дякуємо, що вказали на протилежне поганому та швидкому рішенню. Я виявив багато проблем зі звітом, створеним lint, доступним за адресою Application/build/reports/lint-results.html. Звіт дуже детальний та корисний.
jgrocha

1

Додайте

android.lintOptions.abortOnError false

до вашого додатка \ build.gradle


1
Я підозрюю, що ОП хотіла б отримати невелике пояснення щодо її роботи.
снайпер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.