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.