การสร้าง gradle ล้มเหลวในงานผ้าสำลี


96

ฉันมีโครงการ Android ง่ายๆที่ฉันสร้างด้วย Android Studio 0.4.0 ฉันใช้ Gradle 1.9 และ Gradle Android Plugin 0.7 เมื่อวานนี้ฉันได้เพิ่มไลบรารี ButterKnifeของ Jake Wharton ในสคริปต์การสร้าง 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/DefaultAndroid )

(อภิปราย: 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

มีวิธีทำเช่นนี้จาก root build.gradle เพื่อที่ฉันจะได้ไม่ต้องแยกโมดูลย่อยที่แตกต่างกันออกไป
ankushg

2
@AnkushGupta คุณสามารถใส่ไว้ในรูทandroid{}บล็อกได้แน่นอน
Marek Sebera

@MarekSebera ใช้งานได้หรือไม่หากคุณมีไลบรารี Android และแอปพลิเคชัน Android จำนวนหนึ่ง ฉันไม่ได้ทำงาน คุณช่วยแสดงตัวอย่างวิธีการ?
riper

@riper อาจจำเป็นต้องใส่lintOptionsในไลบรารี แต่ควรใช้งานได้ถ้าคุณใส่สิ่งนี้ลงในรูทandroidบล็อกลองสร้างคำถามแยกต่างหากหากไม่ได้ผลสำหรับคุณอย่างใด
Marek Sebera

53

หากabortOnError falseไม่สามารถแก้ไขปัญหาของคุณได้คุณสามารถลองทำเช่นนี้

lintOptions {
    checkReleaseBuilds false
}

1
ขอบคุณบันทึกวันของฉันเมื่อรวบรวมgradle-retrolambdaและproject-lombokเผยแพร่
Jason Sparc

38

คุณสามารถเลือกตัวเลือกที่เหมาะสมได้จากที่นี่

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

1
ถ้าคุณต้องการใช้ผ้าสำลี (ดี) จริงๆฉันคิดว่าเป็นเส้นทางที่ดีที่สุด
Cícero Moura

15

ฉันมีข้อผิดพลาดบางอย่างใน Android Studio ซึ่งเกิดขึ้นเฉพาะเมื่อฉันสร้าง APK ที่ลงชื่อ

เพื่อหลีกเลี่ยงปัญหานี้ฉันได้เพิ่มสิ่งต่อไปนี้ใน build.gradle

android {
    lintOptions {
        checkReleaseBuilds false
    }
}

11

เพิ่มบรรทัดเหล่านี้ในไฟล์ build.gradle ของคุณ:

android { 
  lintOptions { 
    abortOnError false 
  }
}

จากนั้นทำความสะอาดโครงการของคุณ: D


8

หากคุณต้องการหลีกเลี่ยงตัวเลือก "abortInError false" ให้ดูที่ไฟล์ build / lint-results-release-fatal.html นี่คือข้อผิดพลาดที่ตรวจพบโดยผ้าสำลี

ฉันหวังว่านี่จะช่วยใครสักคนได้!


1
ข้อเสนอแนะที่ดีเป็นเพียงบันทึกไม่ใช่ข้อผิดพลาดทั้งหมดที่สามารถแก้ไขได้ด้วยตนเอง (เช่นแพ็คเกจที่ขาดหายไปjavax.*)
Marek Sebera


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: ปรับปรุงโค้ดของคุณด้วยผ้าสำลี


1
ขอขอบคุณที่ชี้ให้เห็นสิ่งที่ตรงกันข้ามกับวิธีแก้ปัญหาที่ไม่ดีและรวดเร็ว ฉันได้ค้นพบปัญหามากในรายงานที่สร้างขึ้นโดยผ้าสำลีApplication/build/reports/lint-results.htmlที่ใช้ได้ รายงานมีรายละเอียดและเป็นประโยชน์มาก
jgrocha

1

เพิ่ม

android.lintOptions.abortOnError false

ไปยังแอป \ build.gradle ของคุณ


1
ฉันสงสัยว่า OP ต้องการคำอธิบายเล็กน้อยเกี่ยวกับการทำงานของสิ่งนี้
sniperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.