Android java.lang.VerifyError?


100

내 Android 앱에서는 항상 VerifyErrors가 발생합니다! 그리고 나는 이유를 알 수 없습니다. 외부 JAR을 포함 할 때마다 앱을 시작하려고 할 때 항상 VerifyErrors가 발생합니다 (Apache Log4j를 포함한 경우는 한 번 제외).

나는 일반적으로 라이브러리의 소스를 가져와 내 프로젝트에 추가 하여이 문제를 해결하지만 GData 클라이언트 라이브러리 를 넣으려고합니다 .

나는 이것을 소스에서 얻을 수 있지만 종속성 (mail.jar, activation.jar, servlet-api.jar)입니다. 할 수 없으므로 확인 오류가 발생합니다. 이 문제의 근원에 대해 단번에 이해하고 싶습니다. 인터넷에서 봤는데 모두 불완전한 수업 파일에 대해 이야기하는 것 같나요? 내가 모르는.


GData는 Android에서 작동하지 않는 것으로 알려져 있습니다. android-developers Google 그룹에서 주제를 검색하십시오. 향후 SDK 릴리스에서 Android 용 공식 GData를 기다려야합니다.
mparaz

1
프로젝트를 빌드하기 위해 Gradle을 사용하고 있습니까? 내가 assembleRelease 작업 전에 청소 작업을 실행하는 것을 잊었다 때 나는 ...이 문제를 가지고 있었다
IgorGanapolsky

답변:


35

Android는 다른 클래스 파일 형식을 사용합니다. Android SDK와 함께 제공되는 "dx"도구를 통해 타사 JAR 파일을 실행하고 있습니까?


4
"dx"도구에 대한 더 많은 정보로 끔찍할 것입니다.
Daniel Magnusson

2
SDK 버전 목록 아래에있는 Android 프로젝트 환경 설정의 "라이브러리"섹션을 확인합니다. 빌드에서 의존하는 외부 프로젝트가 옆에 녹색 체크 표시와 함께 표시됩니까?
아담

@Adam 그 의견에 감사드립니다! 당신은 내가 알아 내기 위해 너무 많은 시간을 보낸 문제를 방금 해결했습니다.
Simon Forsberg 2013

118

LogCat을보고 확인 오류의 원인을 확인하십시오. 사용중인 Android SDK 수준 (예 : String.isEmpty ())에서 지원되지 않는 java.lang 클래스의 일부 메서드 일 수 있습니다.


4
이것은 실제 답변으로 표시되어야합니다. 내 사용자의 산발적 인 오류를지고 이후 적어도 내 경우에는 정확히 무엇인지 그리고 내가 View.getTag (int)를 V에서 지원되지 않습니다 전화로 아래로 추적 API의 3.
Bostone

1
동의합니다. 나는 이것을 몇 번 만났고 매번 2.x를 목표로하고 1.5가 아닌 것을 사용하고 있습니다. 당신을 방해하는 것은 클래스가 처음으로 생성 / 사용될 때만 던져진다는 것입니다. 그래서 그것이 산발적으로 일어나는 일이라면 잠시 동안 그것을 알아 채지 못할 수도 있습니다.
mbafford 2010


"이것은 실제 답변으로 표시되어야합니다." 나는 같은 문제가 있기 때문에이 스레드를 건너왔다. 이것이 실제 답변으로 표시되지 않은 이유는 LogCat이 라이브러리의 인스턴스를 만드는 위치에 대한 라인 참조를 제공하지만 문제가 발생한 라인은 제공하지 않기 때문입니다. 즉,이 경우 LogCat은 거의 쓸모가 없습니다.
NotACleverMan 2012

당신이 확인에 실패한 이유에 대한 세부 사항 표시해야합니다 수준을 WARN에서 로그 캣
mmeyer을

56

에서 안드로이드 개발자 :

"adb logcat"의 출력은 찾을 수없는 클래스와 잘못된 참조가있는 클래스를 나타냅니다. 위치는 특정 Dalvik 지침에 따라 식별됩니다. 트릭은 예외 위의 로그를 살펴 보는 것입니다.


6
예외를 살펴보면 오류를 일으키는 방법을 식별하는데도 도움이되었습니다. 저에게는 Build.VERSION.SDK_INT> = Build.VERSION_CODES.ECLAIR 표현식이었습니다. 결국 Cupcake에서 시도해 보면 ...
Manuel

2
감사! 이것이 제가 얻은 문제였습니다 ... 유용한 로그는 예외 바로 위에있었습니다 : WARN/dalvikvm(1052): VFY: unable to resolve static method 475: Ljavax/xml/datatype/DatatypeFactory;.newInstance ()Ljavax/xml/datatype/DatatypeFactory;(이제 DatatypeFactory없이 수행하는 방법을 알아 내려고합니다)
pyko

오류 위를 보는 것도 도움이되었습니다. "VFY :"로 시작하는 메시지를 찾으십시오. 제 경우에는 "임의로 큰 메소드 거부"라고 표시되어 있습니다. 아마도 그것은 엄청난 수의 배열을 생성하기 때문일 것입니다 :) 어쨌든, 팁 감사합니다!
Amplify91

감사! 내 문제가 예외 처리기에 있음을 발견했습니다. NetworkOnMainThreadException은 Android 2.3에서 구현되지 않았습니다. 내 답장을 찾아보세요. 다시 한 번 감사드립니다! :)
Seraphim 's

감사! 제 경우에는 Android2.3을 대상으로하고 android-support-v4.jar을 사용하고 있었는데이 항아리에서 클래스를 찾지 못했습니다. 속성에서이 클래스의 "내보내기"탭을 클릭하고 android2.3.3 라이브러리 위로 가져와야했습니다. 음,이 수출 ... 정말 명확하게 이해하지 못하는 무언가이다
xtof54

14

작동하게하려면 라이브러리의 jar를 소스 폴더 중 하나에 추가해야합니다 (이미 eclipse 라이브러리로 추가 한 경우에도 소스로 추가해야합니다).

  1. 프로젝트에 디렉토리 (예 : "libs")를 만들고 거기에 라이브러리 jar를 넣습니다.
  2. (폴더에서 마우스 오른쪽 버튼을 클릭하고 "빌드 경로"-> "소스 폴더로 사용"을 선택)하여 빌드 클래스 경로에 디렉토리를 추가하십시오.
  3. 프로젝트를 다시 빌드하십시오.

'libs'폴더에 JAR 대신 "프로젝트 라이브러리"를 추가 할 수 있습니까?
Ahmed

이상합니다. Eclipse의 "Android"메뉴에있는 라이브러리가 아닌 일반 Java 라이브러리로 추가해야했습니다.
Phil

감사합니다 Maksim, 좋은 솔루션.
아룬 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 기능 중 일부는 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
}

NetworkOnMainThreadExceptionAndroid 2.3에서는 구현되지 않으므로 클래스가로드 될 때 (이전이 아님) 예외 java.lang.VerifyError가 발생합니다.


1
저도 마찬가지였습니다. 내가 사용 java.lang.ReflectiveOperationException(예 : 4.2) 이전 안드로이드 버전에 포함되지 않은,하지만 보풀이에 대해 나에게 경고하지 않았다 ...
WonderCsabo

나에게 문제는 내 코드 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 단계 : 다음 단계는 앱 build.gradle의 Android 부분에 다음을 추가하는 것입니다.

 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"으로 변경하는 것을 잊지 마십시오.
Ganesh

당신은 날 큰 시간을 구해 줬다. 이것은 받아 들여진 대답이어야합니다.
Rohit Rokde

3

제 경우에는 Eclipse Indigo에서 Eclipse Juno로 업데이트했을 때 발생했습니다. 진정한 이유가 무엇인지 모르겠지만 오랫동안 작업중인 Android 프로젝트가 예외로 인해 작동을 멈췄습니다.

시간 동안 그것을 고치려고 노력한 끝에 해결책을 찾았습니다.

내 Android 프로젝트에서 동일한 작업 공간에있는 다른 프로젝트 (예 : "MyUtils")를 사용합니다. 따라서 다음을 수행해야했습니다.

Android 프로젝트-> 빌드 경로-> 빌드 경로 구성을 마우스 오른쪽 버튼으로 클릭합니다.

이제 "주문 및 내보내기"탭으로 이동하여 "MyUtils"를 선택합니다. 그게 다입니다.이 성가신 예외를 제거했습니다.


그것이 나를 위해 그것을 고친 것입니다 ... 우리는 큰 프로젝트를 가지고있어서 저는 돌아 다니면서 모든 것에 "export"플래그를 확인했습니다. PITA 문제.
Someone Somewhere

3

이 문제를 해결 한 gradle 버전을 2.0.0-alpha2에서 1.5.0으로 다운 그레이드합니다.


2

이 문제는 두 Android 프로젝트 간의 불일치로 인해 발생할 수도 있습니다. 예를 들어 "com.yourcompany"패키지를 사용하여 Android 라이브러리를 개발 한 경우 기본 패키지와 동일한 패키지를 사용하는 기본 애플리케이션의 프로젝트가 있습니다. 그런 다음 기본 앱의 버전을 변경하려고하므로 매니페스트 파일의 값 (버전 코드 및 버전 이름)을 변경합니다. 라이브러리의 값을 변경하지 않고 앱을 실행하면 라이브러리의 개체에 대한 메서드 호출시 확인 오류가 발생합니다.


2

나는 같은 문제가 있었다. 2.1 r1로 빌드하고 새로운 adt 17로 2.1 r3으로 업데이트했습니다. javamail의 mail.jar에 오류가 있는지 확인했고 그것은 나를 미치게 만들었습니다. 문제를 해결 한 방법은 다음과 같습니다.

  1. libs / 폴더를 만들고 jar를 추가했습니다.
  2. 오른쪽 클릭> 소스 폴더로 추가

나는 재 구축을 시도했지만 실패했습니다. libs / 디렉토리를 소스 폴더로 제거하고 빌드 경로에서 3 개의 jar 파일에 대한 참조를 제거했습니다. 그런 다음 libs / 폴더를 다시 추가하고 libs / 폴더의 각 jar를 빌드 경로에 추가했습니다. 이제 예상대로 작동합니다. 이것은 이상한 해결 방법이지만 나를 위해 일했습니다.


2

에서 Eclipse 4.x이 문제가 발생하면, 아래 시도 :

  1. 포함 된 모든 타사 jar를 User-Libaray로 마이그레이션
  2. android lib 이전에 사용자 lib를 위로 이동하고 Order and Export 탭에서 확인하십시오.
  3. 실행을 위해 청소 및 재 구축

2

SDK 업데이트 후이 문제가 발생합니다. 컴파일러는 내 외부 라이브러리에 문제가 있습니다. 이 작업을 수행했습니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭 한 다음 "android Tools> add suport library ..."를 내 프로젝트 라이브러리 "android-support-v4.jar"에 설치합니다.


2

java.lang.VerifyError컴파일 된 바이트 코드가 Android가 런타임에 찾을 수없는 것을 참조하고 있음을 의미합니다. 이 verifyError 는 두 장치에서 동일한 빌드를 실행하더라도 위 버전아닌 kitkat4.4 이하 버전 에서만 저를 발행 합니다. 이전 버전의 jackson 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을 포함하면 verifyError가 발생 함). 그러면 작동합니다. 즉, Core 의 Methods 및 기타 콘텐츠 가 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 jar를 추가 했으며 Android SDK 22.3으로 업데이트 할 때 문제가 발생했습니다.

Android Private Libraries를 확인했기 때문에 이것은 Android SDK의 일반적인 문제가 아닙니다. 모든 Apache POI jar를 선택 취소하고 하나씩 추가했습니다. 그 발견 POI-3.9-20121203.jar이 전에해야 POI-OOXML-3.9-20121203.jar . 그렇지 않으면 작동하지 않습니다.


1

테스트가있는 경우 build.grade파일 에서 다음 줄을 주석 처리 하십시오.

testCoverageEnabled = true

나를 위해 이것은 Java 1.7 기능, 특히 문자열 스위치 문을 사용하는 클래스에서 VerifyError 예외를 발생 시켰습니다.


1

git pull을 만든 후에도 동일한 문제가 발생했습니다.

솔루션 : 빌드-> 프로젝트 정리.

도움이 되었기를 바랍니다.


1
당기거나 아무것도하지 않았는데 청소가 해냈어요, 감사합니다!
Alexandre G

1

다른 케이스를 찾았습니다.

정황:

  • Retrolambda를 사용합니다 (필요한지 확실하지 않음).
  • 인터페이스에서 정적 메서드를 만듭니다.

그리고 그 결과는 붐입니다! 해당 인터페이스를 사용하는 클래스에 액세스하려고 할 때 java.lang.VerifyError. Android (내 경우에는 4.4. *)가 인터페이스의 정적 메서드를 좋아하지 않는 것 같습니다. 인터페이스에서 정적 메서드를 제거하면 VerifyError가 사라집니다.


0

사용자 라이브러리의 항아리와 마찬가지로이 문제도 발생했습니다 ...

이 문제를 해결 한 방법은 lib 폴더에 추가 한 다음 이클립스의 빌드 속성에 추가하는 것입니다.

처음으로 이것을했을 때 작동하지 않았지만 나는 그들을 제거하고 다시 읽었고 작동하기 시작했습니다 ...

약간 이상한 것! 하지만 지금은 항상 일하고 있습니다.

행운을 빕니다


0

SDK 2.1에있는 Android API 메서드 / 클래스를 코딩했으며 Android 1.6 에뮬레이터에서 실행하려고했습니다. 그래서 그 오류가 발생했습니다.

해결책 : 올바른 에뮬레이터 버전으로 변경했습니다.

이건 일 했어요 .. ME위한 감사합니다.


0

후손 Arrays.copyOf()에게는 Android Level 4에 해당하는 Java 1.5에서 지원하는 방법이 아닌 방법을 사용했기 때문에이 오류가 발생했습니다 . 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
그건 그렇고, 내가 근본 원인은 VerifyError가 사라질 때까지 메서드 본문 (return null / 0 / false로 대체)을 주석 처리 한 다음 다시 돌아올 때까지 항목을 복원하는 것입니다. 그런 다음 문제 방법 내에서 동일한 작업을 수행합니다. 확실히 재미있는 디버깅 방법은 아니지만 작동했습니다.
benkc 2013-07-15

0

제 경우에는 google-play-service가 최신 버전이 아니기 때문에이 오류가 발생 합니다 .

프로젝트가 .jar의 일부 클래스를 지원하지 않는 경우이 오류가 발생합니다 (예 : ImageView.setLayerType, AdvertisingIdClient 등).


0

나는 dx 'ed가 아닌 libs 때문에 발생하는 또 다른 상황을 확인했습니다 . 매우 긴 doInBackground mehtod를 가진 AsyncTask가 있습니다. 어떤 이유로 145 줄이 넘는이 방법이 중단되기 시작했습니다. 2.3 앱에서 발생했습니다. 일부 부분을 메서드로 캡슐화했을 때 제대로 작동했습니다.

따라서 올바르게 dx 'ed 가 아닌 클래스를 찾을 수없는 경우 메서드 길이를 줄이십시오.


0

나에게 문제는 실제로 Java 7 기능 (및 API 19+) 인 클래스 어딘가에서 multi-catch 절을 사용하고 있다는 것입니다. 따라서 VerifyError모든 19 이전 장치에서 충돌 합니다.


0

나를 위해 그것은 compileSdkVersion과 buildToolsVersion 사이의 상관 관계였습니다. 나는 :

compileSdkVersion 21
buildToolsVersion '19.1.0'

나는 그것을 다음과 같이 변경했다.

compileSdkVersion 21
buildToolsVersion '21.1.2'

0

나에게는 compileSdkVersion의 문제입니다. 특정 안드로이드 애플리케이션 ( https://github.com/android10/Android-AOPExample ) 에서 API 레벨 21을 사용한 경우 :

compileSdkVersion 21

java.lang.verify 오류가 발생했습니다. 그래서 compileSdkVersion을 19로 변경했습니다.

compileSdkVersion 19

잘 작동했습니다. SDK buildTools의 문제라고 생각하며 API 레벨이 21 미만이면 괜찮아 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.