Android java.lang.VerifyError?


100

ในแอป Android ของฉันฉันมักจะได้รับ VerifyErrors! และฉันคิดไม่ออกว่าทำไม เมื่อใดก็ตามที่ฉันรวม JAR ภายนอกฉันมักจะได้รับ VerifyErrors เมื่อฉันพยายามเปิดแอป (ยกเว้นครั้งเดียวเมื่อฉันรวม Apache Log4j)

ฉันมักจะได้รับรอบนี้โดยการใช้แหล่งที่มาของห้องสมุดและเพิ่มลงในโครงการของฉัน แต่ฉันพยายามที่จะนำห้องสมุดลูกค้า GData

ฉันสามารถรับสิ่งนี้ได้จากแหล่งที่มา แต่เป็นการอ้างอิง (mail.jar, activation.jar, servlet-api.jar) ฉันทำไม่ได้ดังนั้นฉันจึงได้รับการตรวจสอบข้อผิดพลาด ฉันอยากจะไปที่ต้นตอของปัญหานี้สักครั้งและสำหรับทุกคน ฉันดูในอินเทอร์เน็ต แต่ดูเหมือนว่าพวกเขาทั้งหมดจะพูดถึงไฟล์คลาสที่ไม่สมบูรณ์? ซึ่งฉันไม่รู้จัก


GData เป็นที่ทราบกันดีว่าไม่ทำงานใน Android ค้นหาหัวข้อใน Google Group สำหรับนักพัฒนา Android เราต้องรอ GData อย่างเป็นทางการสำหรับ Android ในการเปิดตัว SDK ในอนาคต
— mparaz

1
คุณใช้ Gradle เพื่อสร้างโครงการของคุณหรือไม่? ฉันมีปัญหานี้เมื่อฉันลืมเรียกใช้งานที่สะอาดก่อนที่จะประกอบปล่อยงาน ...
— IgorGanapolsky

คำตอบ:


35

Android ใช้รูปแบบไฟล์คลาสอื่น คุณใช้งานไฟล์ JAR ของบุคคลที่สามผ่านเครื่องมือ "dx" ที่มาพร้อมกับ Android SDK หรือไม่


4
คงจะดีไม่น้อยกับข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือ "dx"
— Daniel Magnusson

2
ดูในส่วน "ไลบรารี" ของค่ากำหนดโปรเจ็กต์ Android ด้านล่างรายการเวอร์ชัน SDK โครงการภายนอกของคุณที่คุณอาศัยอยู่ในงานสร้างของคุณปรากฏขึ้นที่นั่นโดยมีเครื่องหมายถูกสีเขียวอยู่ข้างๆหรือไม่
— Adam

@ อดัมขอบคุณสำหรับความคิดเห็นนั้น! คุณเพิ่งแก้ปัญหาที่ฉันใช้เวลามากเกินไปในการพยายามคิด
— Simon Forsberg

118

ดู LogCat และดูว่าอะไรเป็นสาเหตุของการตรวจสอบความผิดพลาด อาจเป็นวิธีการบางอย่างในคลาส java.lang ที่ไม่รองรับในระดับ Android SDK ที่คุณใช้ (เช่น String.isEmpty ())


4
สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่แท้จริง อย่างน้อยมันก็เกิดอะไรขึ้นในกรณีของฉันเนื่องจากฉันได้รับข้อผิดพลาดเป็นระยะ ๆ จากผู้ใช้ของฉันและฉันติดตามมันลงไปที่การเรียก View.getTag (int) ที่ไม่รองรับในเวอร์ชัน 3 ของ API
— Bostone

1
เห็นด้วย ฉันเคยเจอแบบนี้สองสามครั้งและทุกครั้งที่ฉันกำหนดเป้าหมาย 2.x และใช้สิ่งที่ไม่อยู่ใน 1.5 สิ่งที่ทำให้คุณผิดหวังคือมันจะถูกโยนทิ้งเมื่อมีการสร้าง / ใช้คลาสเป็นครั้งแรกเท่านั้นดังนั้นหากเป็นสิ่งที่เกิดขึ้นเป็นระยะ ๆ คุณอาจไม่สังเกตเห็นมันชั่วขณะ
— mbafford

1
หากเป็นกรณีนี้คุณควรชำระเงินลิงก์เหล่านี้: developer.android.com/resources/articles/…และdoandroids.com/blogs/2010/5/8/backwards-compatibility
— MyName

"สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่แท้จริง" ฉันข้ามกระทู้นี้เพราะฉันมีปัญหาเดียวกัน ฉันเดาว่าสาเหตุที่สิ่งนี้ไม่ถูกทำเครื่องหมายว่าเป็นคำตอบที่แท้จริงนั้นเป็นเพราะ LogCat ให้การอ้างอิงบรรทัดว่าฉันกำลังสร้างอินสแตนซ์ของไลบรารีอยู่ที่ไหน แต่ไม่ใช่บรรทัดที่เกิดปัญหา กล่าวอีกนัยหนึ่งในกรณีนี้ LogCat ใกล้จะไร้ประโยชน์
— NotACleverMan

logcat ที่ระดับ WARN ควรแสดงรายละเอียดว่าเหตุใดจึงไม่ผ่านการตรวจสอบ
— mmeyer

56

จากนักพัฒนา Android :

ผลลัพธ์จาก "adb logcat" ระบุคลาสที่ไม่พบเช่นเดียวกับคลาสที่มีการอ้างอิงที่ไม่ถูกต้อง ตำแหน่งถูกระบุลงไปตามคำสั่งเฉพาะของ Dalvik เคล็ดลับคือดูในบันทึกเหนือข้อยกเว้น


6
การมองเหนือข้อยกเว้นช่วยฉันด้วยเช่นกันในการระบุวิธีการที่ทำให้เกิดข้อผิดพลาด สำหรับฉันมันคือนิพจน์ Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR ซึ่งเห็นได้ชัดในท้ายที่สุดถ้าคุณลองทำบน Cupcake ...
— มานูเอล

2
ขอบคุณ! นี่คือปัญหาที่ฉันได้รับ ... บันทึกที่มีประโยชน์อยู่เหนือข้อยกเว้น: WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;(ตอนนี้เพื่อหาวิธีทำโดยไม่ใช้
— DatatypeFactory

การมองเหนือข้อผิดพลาดช่วยฉันด้วย มองหาข้อความที่ขึ้นต้นด้วย "VFY:" ในกรณีของฉันมีข้อความว่า "ปฏิเสธวิธีการขนาดใหญ่โดยพลการ" อาจเป็นเพราะมันสร้างอาร์เรย์จำนวนมาก :) ยังไงก็ตามขอบคุณสำหรับเคล็ดลับ!
— Amplify91

ขอบคุณ! ฉันพบว่าปัญหาของฉันอยู่ในตัวจัดการข้อยกเว้น: NetworkOnMainThreadException ไม่ได้ใช้งานใน Android 2.3 มองหาคำตอบของฉัน ขอบคุณอีกครั้ง! :)
— Seraphim

ขอบคุณ! ในกรณีของฉันฉันกำหนดเป้าหมายเป็น Android2.3 และฉันใช้ android-support-v4.jar และไม่พบคลาสในโถนี้ ฉันต้องคลิกที่แท็บ "ส่งออก" สำหรับคลาสนี้ในคุณสมบัติและนำมาไว้เหนือไลบรารี android2.3.3 การส่งออกนี้เป็นสิ่งที่ฉันไม่เข้าใจอย่างชัดเจน ...
— xtof54

14

เพื่อให้ใช้งานได้คุณต้องเพิ่ม jar ของไลบรารีลงในโฟลเดอร์ซอร์สโฟลเดอร์ใดโฟลเดอร์หนึ่ง (แม้ว่าคุณจะเพิ่มเป็นไลบรารี eclipse แล้ว แต่คุณยังต้องเพิ่มเป็นซอร์ส)

  1. สร้างไดเร็กทอรีในโปรเจ็กต์ของคุณ (เช่น "libs") และใส่ไลบรารี jar ไว้ที่นั่น
  2. เพิ่มไดเร็กทอรีไปยัง build class path โดย (คลิกปุ่มขวาบนโฟลเดอร์แล้วเลือก "Build path" -> "Use as source folder")
  3. สร้างโครงการของคุณใหม่

เราสามารถเพิ่ม "Project Library" แทน JAR ในโฟลเดอร์ "libs" ได้หรือไม่?
— Ahmed

แปลก ... ฉันต้องเพิ่มเป็นไลบรารี Java ปกติไม่ใช่เป็นไลบรารีภายใต้เมนู "Android" ใน Eclipse
— ฟิลิป

ขอบคุณ Maksim ทางออกที่ดี
— Arun Badole

8

มันเกิดขึ้นกับฉันตอนนี้ ข้อผิดพลาดเกิดขึ้นเนื่องจากฉันใช้วิธีการจาก SDK รุ่นใหม่กว่าที่อุปกรณ์ของฉันมี

อุปกรณ์ Android 1.5 ติดตั้ง apk โดยใช้สิ่งนี้:

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>

8

ฉันพบกรณีที่น่าสนใจ ฉันใช้:

<uses-sdk
   android:minSdkVersion="9"
   android:targetSdkVersion="18" />

ดังนั้นบางส่วนของ Android ใหม่ 4 ความสามารถไม่ได้ implenented ใน Android 2.3 ImageView.setLayerTypeเช่น เพื่อหลีกเลี่ยงข้อผิดพลาดรันไทม์เพียง:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

ควรใช้แนวทางนี้ร่วมกับการจัดการข้อยกเว้น:

} catch (NetworkOnMainThreadException nomte) {
   // log this exception
} catch (SocketTimeoutException socketTimeoutException) {
   // log this exception
}

NetworkOnMainThreadExceptionไม่ได้ดำเนินการใน Android 2.3 ดังนั้นเมื่อระดับมีการโหลด (และไม่ได้มาก่อน!) ยกเว้นjava.lang.VerifyErrorเกิดขึ้น


1
สิ่งเดียวกันนี้เกิดขึ้นกับฉัน ฉันใช้java.lang.ReflectiveOperationExceptionซึ่งไม่รวมอยู่ใน Android เวอร์ชันเก่า (เช่น 4.2) แต่ Lint ไม่ได้เตือนฉันเกี่ยวกับเรื่องนี้ ...
— WonderCsabo

สำหรับฉันปัญหาคือรหัสของฉันประกาศ a CameraAccessExceptionซึ่งเปิดตัวใน Android 5.0 แต่เมื่อฉันเรียกใช้ในอุปกรณ์ Android 4.3 VerifyError จะปรากฏขึ้น
— Piasy

7

หากคุณใช้ Retrolambda คุณอาจได้เพิ่มวิธีการแบบคงที่ในอินเทอร์เฟซ (ซึ่งอนุญาตเฉพาะใน Java 8)


7

สิ่งนี้อาจเกิดขึ้นได้เนื่องจากข้อผิดพลาดขีด จำกัด การอ้างอิงบน Lollypop เวอร์ชันด้านล่างซึ่ง จำกัด ขนาดสูงสุดไม่เกิน 65K

แนวทางแก้ไขที่เป็นไปได้สำหรับปัญหาข้างต้น

ขั้นตอนที่ 1: Add android-support-multidex.jar to your project. The jar can be found in your Android SDK folder /sdk/extras/android/support/multidex/library/libs

ขั้นที่ 2: ขยายแอปพลิเคชันของคุณด้วย MultiDexApplication เช่น

public class MyApplication extends MultiDexApplication

ขั้นตอนที่ 3: แทนที่ attachBaseContext

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

ขั้นตอนที่ 4: ขั้นตอนต่อไปคือการเพิ่มสิ่งต่อไปนี้ในส่วน Android ของแอพ build.gradle ของคุณ

 dexOptions {
      preDexLibraries = false
   }

ขั้นตอนที่ 5: สุดท้ายทำตามส่วนทั่วไปของแอพ build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

สำหรับรายละเอียดโปรดชำระเงิน

https://developer.android.com/tools/building/multidex.html


ทำงานให้ฉัน !! อย่าลืมเปลี่ยนคลาส Application เป็น "MultiDexApplication"
— พระพิฆเนศ

คุณช่วยฉันครั้งใหญ่คน นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
— Rohit Rokde

3

ในกรณีของฉันมันเกิดขึ้นเมื่อฉันอัปเดตจาก Eclipse Indigo เป็น Eclipse Juno: ฉันไม่แน่ใจว่าอะไรคือเหตุผลที่แท้จริง แต่โครงการ Android ของฉันที่ฉันกำลังดำเนินการเป็นเวลานานหยุดทำงานเนื่องจากข้อยกเว้นนั้น

หลังจากพยายามแก้ไขอยู่หลายชั่วโมงฉันก็พบวิธีแก้ปัญหาสำหรับฉัน

ในโปรเจ็กต์ Android ของฉันฉันใช้โปรเจ็กต์อื่น (พูดว่า "MyUtils") ที่อยู่ในพื้นที่ทำงานเดียวกัน ดังนั้นฉันต้องทำสิ่งต่อไปนี้:

คลิกขวาที่โครงการ Android -> สร้างเส้นทาง -> กำหนดค่าเส้นทางการสร้าง

ตอนนี้ไปที่แท็บ "Order and Export" และทำการเลือก "MyUtils" นั่นแหละ: ฉันกำจัดข้อยกเว้นที่น่ารำคาญนี้


นั่นคือสิ่งที่แก้ไขให้ฉัน ... เรามีโปรเจ็กต์ขนาดใหญ่ฉันจึงเดินไปรอบ ๆ และตรวจสอบธง "ส่งออก" ในทุกอย่าง ปัญหา PITA
— ใครสักคน


2

ปัญหาอาจเกิดจากความไม่ตรงกันระหว่างสองโครงการของ Android ตัวอย่างเช่นหากคุณพัฒนาไลบรารี Android โดยใช้แพ็คเกจ "com.yourcompany" จากนั้นคุณจะมีโปรเจ็กต์ของแอปพลิเคชันหลักโดยใช้แพ็คเกจเดียวกับแพ็กเกจพื้นฐาน จากนั้นสมมติว่าคุณต้องการเปลี่ยนเวอร์ชันของแอปหลักดังนั้นคุณจึงเปลี่ยนค่าของไฟล์รายการ ได้แก่ รหัสเวอร์ชันและชื่อเวอร์ชัน หากคุณเรียกใช้แอปของคุณโดยไม่เปลี่ยนค่าเหล่านั้นสำหรับไลบรารีคุณจะได้รับข้อผิดพลาดในการตรวจสอบการเรียกใช้เมธอดใด ๆ บนวัตถุจากไลบรารี


2

ฉันมีปัญหาเดียวกัน ฉันสร้างด้วย 2.1 r1 และอัปเดตเป็น 2.1 r3 ด้วย adt 17 ใหม่ฉันตรวจสอบข้อผิดพลาดใน mail.jar ของ javamail และมันทำให้ฉันแทบคลั่ง นี่คือวิธีที่ฉันแก้ไขปัญหา:

  1. สร้าง libs / โฟลเดอร์และเพิ่ม jars
  2. คลิกขวา> เพิ่มเป็นโฟลเดอร์ต้นทาง

ฉันพยายามสร้างใหม่ แต่มันล้มเหลว ฉันลบไดเร็กทอรี libs / เป็นซอร์สโฟลเดอร์และลบการอ้างอิงถึงไฟล์ jar 3 ไฟล์ใน build path จากนั้นฉันเพิ่ม libs / โฟลเดอร์อีกครั้งและเพิ่มแต่ละ jar ใน libs / โฟลเดอร์ไปยัง build path ตอนนี้ทำงานได้ตามที่คาดไว้ นี่เป็นวิธีแก้ปัญหาแปลก ๆ แต่ได้ผลสำหรับฉัน


2

ในEclipse 4.xถ้าคุณพบปัญหานี้ลองด้านล่าง:

  1. ย้ายไหของบุคคลที่ 3 ที่รวมอยู่ทั้งหมดไปยัง User-Libaray
  2. เลื่อนผู้ใช้ lib ขึ้นก่อน android lib และตรวจสอบในแท็บ Order and Export
  3. ทำความสะอาดและสร้างใหม่เพื่อเรียกใช้

2

ฉันมีปัญหานี้หลังจากอัปเดต SDK คอมไพเลอร์มีปัญหากับไลบรารีภายนอกของฉัน ฉันทำสิ่งนี้: คลิกขวาที่โปรเจ็กต์จากนั้น "เครื่องมือ android> เพิ่มไลบรารี suport ... " สิ่งนี้ติดตั้งในไลบรารีโครงการของฉัน "android-support-v4.jar"


2

java.lang.VerifyErrorหมายความว่า bytecode ที่คอมไพล์ของคุณหมายถึงสิ่งที่ Android ไม่สามารถค้นหาได้ในรันไทม์ การยืนยันข้อผิดพลาดนี้ทำให้ฉันมีปัญหาเฉพาะกับkitkat4.4 และเวอร์ชันที่น้อยกว่าซึ่งไม่ได้อยู่ในเวอร์ชันข้างต้นแม้ว่าฉันจะรันบิลด์เดียวกันในอุปกรณ์ทั้งสอง เมื่อฉันใช้ตัวแยกวิเคราะห์ json ของแจ็คสันรุ่นเก่ากว่าจะแสดงjava.lang.VerifyError

compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'

จากนั้นฉันได้เปลี่ยนการพึ่งพาเป็นเวอร์ชันล่าสุด 2.2 เป็น 2.7โดยไม่มีไลบรารีหลัก (เมื่อฉันรวม core2.7 มันจะให้การตรวจสอบข้อผิดพลาด) จากนั้นก็ใช้งานได้ ซึ่งหมายถึงวิธีการและเนื้อหาอื่น ๆ ของหลักถูกย้ายไปยังรุ่นล่าสุดของDatabind2.7 สิ่งนี้ช่วยแก้ปัญหาของฉัน

compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'

1

ฉันได้รับ VerfiyError เช่นกัน ... หาเหตุผลที่แท้จริงไม่ได้ ช่วยในการรวมบรรทัดใหม่ของโค้ดลงในเมธอด (Eclipse, 'Extract Method ... ') ดังนั้นในกรณีของฉันเหตุผลไม่ใช่วิธีที่ไม่รองรับ


1

ฉันมีปัญหาที่คล้ายกันมาก ฉันได้เพิ่มกระปุกApache POIและปัญหาปรากฏขึ้นเมื่อฉันอัปเดตเป็น android SDK 22.3

ฉันได้ตรวจสอบไลบรารีส่วนตัวของ Android ดังนั้นนี่จึงไม่ใช่ปัญหาทั่วไปกับ Android SDK ฉันยกเลิกการเลือกกระปุกApache POIทั้งหมดแล้วเพิ่มทีละอัน ฉันพบว่าPOI-3.9-20121203.jarควรจะเป็นก่อนที่จะจุด-OOXML-3.9-20121203.jar มิฉะนั้นมันจะไม่ทำงาน.


1

หากคุณมีการทดสอบให้ลองแสดงความคิดเห็นจากbuild.gradeไฟล์ของคุณ:

testCoverageEnabled = true

สำหรับฉันสิ่งนี้ทำให้เกิดข้อยกเว้น VerifyError บนคลาสที่ใช้คุณสมบัติ Java 1.7 โดยเฉพาะคำสั่งสวิตช์สตริง


1

ฉันมีปัญหาเดียวกันหลังจากทำการดึงคอมไพล์

วิธีแก้ไข: สร้าง -> ทำความสะอาดโครงการ

หวังว่านี่จะช่วยได้


1
ไม่ได้ดึงหรือทำอะไรจริงๆ แต่ทำได้สะอาดขอบคุณ!
— Alexandre G

1

เจอเคสอื่นแล้ว

เงื่อนไข:

  • ใช้ Retrolambda (ไม่แน่ใจว่าจำเป็นหรือไม่);
  • สร้างวิธีการแบบคงที่ในอินเทอร์เฟซ

และผลก็คือตูม! java.lang.VerifyError เมื่อพยายามเข้าถึงคลาสที่ใช้อินเทอร์เฟซนั้น ดูเหมือนว่า Android (ในกรณีของฉัน 4.4. *) ไม่ชอบวิธีการแบบคงที่ในอินเทอร์เฟซ การลบเมธอดแบบคงที่ออกจากอินเทอร์เฟซทำให้ VerifyError หายไป


0

ฉันก็มีปัญหานี้เช่นเดียวกับขวดโหลของฉันในไลบรารีผู้ใช้ ...

วิธีที่ฉันแก้ไขนี้คือเพิ่มลงในโฟลเดอร์ lib จากนั้นเพิ่มในคุณสมบัติ build ใน eclipse ...

ครั้งแรกที่ฉันทำมันไม่ได้ผล แต่ฉันก็ลบออกและอ่านอีกครั้งและมันก็เริ่มทำงาน ...

ค่อนข้างแปลก! แต่ตอนนี้ทำงานตลอดเวลา

โชคดี


0

ฉันได้เข้ารหัสวิธีการ / คลาส Android API ที่อยู่ใน SDK 2.1 และพยายามเรียกใช้บนโปรแกรมจำลอง Android 1.6 ฉันจึงได้รับข้อผิดพลาดนั้น

วิธีแก้ไข: เปลี่ยนเป็นเวอร์ชันจำลองที่ถูกต้อง

นี้ทำงานสำหรับฉัน ..ขอบคุณ


0

สำหรับคนรุ่นหลังฉันเพิ่งได้รับข้อผิดพลาดนี้เนื่องจากฉันใช้Arrays.copyOf()ซึ่งไม่ใช่วิธีการที่ Java 1.5 รองรับซึ่งสอดคล้องกับ Android ระดับ 4 เนื่องจากฉันใช้งานรวมถึงไลบรารีที่พัฒนาภายใต้ 1.6 จึงรวบรวมได้ดี ฉันเห็นปัญหาเฉพาะเมื่อฉันย้ายชั้นเรียนที่มีปัญหาไปยังโครงการ Android ของฉันจากนั้นข้อผิดพลาดจะถูกไฮไลต์

Uncaught handler: thread main exiting due to uncaught exception
java.lang.VerifyError: com.j256.ormlite.dao.BaseDaoImpl$DaoConfigArray
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:71)
  at com.j256.ormlite.dao.BaseDaoImpl$1.initialValue(BaseDaoImpl.java:1)
  at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:429)
  at java.lang.ThreadLocal.get(ThreadLocal.java:66)

ในบรรทัดนั้นฉันพยายามทำnew DaoConfigArrayและคลาสนั้นมีบรรทัดต่อไปนี้:

// copyOf is only supported in Java >= 1.6
doArray = Arrays.copyOf(daoArray, newLength);

สิ่งที่ทำให้ซับซ้อนยิ่งขึ้นคือบรรทัด 71 ชี้ไปที่การThreadLocalเริ่มต้นซึ่งฉันคิดว่าเป็นสาเหตุของปัญหาในตอนแรก

private static final ThreadLocal<DaoConfigArray> daoConfigLevelLocal
    = new ThreadLocal<DaoConfigArray>() {
    @Override
    protected DaoConfigArray initialValue() {
        return new DaoConfigArray();
    }
};

0

ฉันต้องลบโปรเจ็กต์ที่ขึ้นต่อกันและคอมไพล์โปรเจ็กต์ที่ขึ้นต่อกันเป็นของ jar และรวมไว้ในโฟลเดอร์ libs


0

ฉันแน่ใจว่าสาเหตุของฉันแตกต่างจากของคุณ แต่เนื่องจากนี่เป็นหนึ่งในรายการยอดนิยมเมื่อค้นหา "Android java.lang.VerifyError" ฉันจึงคิดว่าจะบันทึกไว้ที่นี่เพื่อลูกหลาน

ฉันมีชั้นเรียนตามแนวของ:

public class A { ... }
public class B extends A { ... }
public class C extends A { ... }

และวิธีการที่ทำ:

A[] result = null;
if (something)
    result = new B[cursor.getCount()];
else
    result = new C[cursor.getCount()];

// Fill result
...

ตราบเท่าที่มีรหัสนี้อยู่ในไฟล์ฉันจะได้รับ VerifyError ในครั้งแรกที่โหลดคลาสที่มีเมธอดนี้ การแยกมันออกเป็นสองวิธีแยกกัน (วิธีหนึ่งที่จัดการกับ B เท่านั้นและวิธีที่จัดการกับ C เท่านั้น) ช่วยแก้ปัญหาได้


1
และโดยวิธีการที่ฉันรูททำให้เกิดการแสดงความคิดเห็นออกเมธอด body (แทนที่ด้วย return null / 0 / false) จนกระทั่ง VerifyError หายไปจากนั้นจึงกู้คืนสิ่งต่างๆจนกว่ามันจะกลับมาอีกครั้ง จากนั้นทำเช่นเดียวกันภายในวิธีการปัญหา ไม่ใช่วิธีที่สนุกในการแก้ไขข้อบกพร่องอย่างแน่นอน แต่ได้ผล
— benkc

0

ในกรณีของข้อผิดพลาดนี้เกิดขึ้นเพราะฉันเล่นบริการ Google ไม่ใหม่ล่าสุด

หากโปรเจ็กต์ของคุณไม่รองรับคลาสบางคลาสใน. jar ข้อผิดพลาดนี้จะเกิดขึ้น (เช่น ImageView.setLayerType, AdvertisingIdClient เป็นต้น)


0

ฉันเพิ่งระบุสถานการณ์อื่นที่มันเกิดขึ้นไม่เพียง แต่เนื่องจาก libs ไม่ใช่dx 'ed ฉันมี AsyncTask ที่มี mehtod doInBackground ที่ยาวมาก ด้วยเหตุผลบางอย่างวิธีนี้ที่มีมากกว่า 145 บรรทัดเริ่มแตก มันเกิดขึ้นในแอป 2.3 เมื่อฉันเพียงแค่ห่อหุ้มบางส่วนลงในวิธีการมันก็ใช้ได้ดี

ดังนั้นสำหรับผู้ที่ไม่พบคลาสที่ไม่ถูกต้องdx 'ed ให้ลองลดความยาวของวิธีการของคุณ


0

สำหรับฉันปัญหาลงเอยด้วยการที่ฉันใช้ multi-catch clause ที่ไหนสักแห่งในคลาสซึ่งเป็นฟีเจอร์ Java 7 (และ API 19+) ดังนั้นมันจะผิดพลาดกับVerifyErrorอุปกรณ์พรี 19 ทั้งหมด


0

สำหรับฉันมันมีความสัมพันธ์ระหว่าง compileSdkVersion และ buildToolsVersion ฉันมี:

compileSdkVersion 21
buildToolsVersion '19.1.0'

ฉันเปลี่ยนเป็น:

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

สำหรับฉันมันเป็นปัญหาของ compileSdkVersion เมื่อฉันใช้ API ระดับ 21 ในแอปพลิเคชัน Android เฉพาะ ( https://github.com/android10/Android-AOPExample ):

compileSdkVersion 21

java.lang.verifyerror เกิดขึ้น ดังนั้นฉันจึงเปลี่ยน compileSdkVersion เป็น 19

compileSdkVersion 19

มันทำงานได้ดี ฉันคิดว่าอาจเป็นปัญหาของ SDK buildTools และดูเหมือนว่า OK เมื่อระดับ API <21

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