안드로이드 java.langVerify Error?
안드로이드 앱에서는 항상 VerifyErrors가 나와요!왜 그랬는지 모르겠어외부 JAR을 포함할 때마다 앱을 실행하려고 할 때 항상 VerifyErrors가 표시됩니다(Apache Log4j를 포함했을 때 제외).
저는 보통 라이브러리의 소스를 가져와 프로젝트에 추가하는 것으로 이것을 회피하고 있습니다만, GData 클라이언트 라이브러리를 도입하려고 합니다.
소스로 가져올 수 있지만 종속성(mail.jar, activation.jar, servlet-api.jar)이 가져올 수 없기 때문에 오류가 발생합니다.나는 이 문제의 진상을 확실히 규명하고 싶다.인터넷으로 찾아봤는데, 다들 불완전한 수업 파일에 대해 말하는 것 같던데?그건 나도 몰라.
LogCat을 조사하여 검증 오류의 원인을 확인합니다.사용하고 있는 Android SDK 레벨(예를 들어 String.is Empty())에서는 지원되지 않는 java.lang 클래스의 메서드일 수 있습니다.
Android 개발자:
"adb logcat"의 출력은 찾을 수 없는 클래스와 잘못된 참조가 있는 클래스를 나타냅니다.위치는 특정 Dalvik 명령어까지 식별됩니다.요령은 예외 위에 있는 로그를 확인하는 것입니다.
Android는 다른 클래스 파일 형식을 사용합니다.Android SDK와 함께 제공되는 "dx" 도구를 통해 서드파티 JAR 파일을 실행하고 있습니까?
이 기능을 사용하려면 라이브러리의 jar를 원본 폴더 중 하나에 추가해야 합니다(이미 이클립스 라이브러리로 추가한 경우에도 소스로 추가해야 함).
- 프로젝트에 디렉토리(예: "libs")를 만들고 라이브러리 항아리를 넣습니다.
- 빌드 클래스 경로에 디렉토리를 추가합니다(폴더 오른쪽 버튼을 클릭하여 "빌드 경로" -> "소스 폴더로 사용" 선택).
- 프로젝트를 재구축합니다.
지금 나한테 일어난 일이야.이 에러는, 디바이스에 탑재되어 있는 새로운 SDK 의 메서드를 사용하고 있기 때문에 발생했습니다.
Android 1.5 장치는 다음을 사용하여 apk를 설치했습니다.
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"/>
나는 흥미로운 사례를 발견했다.사용방법:
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="18" />
중 일부는 Android 2.예를 들어 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
}
NetworkOnMainThreadException
Android 2.3에서는 구현되어 있지 않기 때문에 클래스가 로드되어 있는 경우(이전에는 구현되어 있지 않은 경우) 예외입니다.java.lang.VerifyError
어나나다
Retrolambda를 사용하는 경우 인터페이스에 정적 메서드를 추가했을 수 있습니다(Java 8에서만 허용).
또한 이 문제는 Lollypop의 최대 65K 사이즈로 제한되는 아래 버전에서의 제한 에러로 인해 발생할 수 있습니다.
위의 문제에 대해 생각할 수 있는 해결 방법
1: 서 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: MultiDex Application을 사용하여 응용 프로그램을 확장합니다.
public class MyApplication extends MultiDexApplication
스텝 3: attachBaseContext 덮어쓰기
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
4단계: 다음 단계는 앱 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
제 경우, Eclipse Indigo에서 Eclipse Juno로 업데이트 했을 때 일어난 일입니다.무슨 이유인지는 모르겠지만, 그 예외로 인해 오랜 기간 작업하고 있는 Android 프로젝트가 중단되었습니다.
나는 그것을 고치기 위해 몇 시간 동안 노력한 끝에 해결책을 찾았다.
Android 프로젝트에서는 같은 작업영역에 있는 다른 프로젝트("MyUtils")를 사용합니다.그래서 다음 작업을 해야 했습니다.
Android 프로젝트 우클릭 -> 빌드 경로 -> 빌드 경로 구성
이제 "Order and Export" 탭으로 이동하여 "MyUtils"를 선택합니다.이상입니다. 저는 이 귀찮은 예외를 없앴습니다.
gradle 버전을 2.0.0-alpha2에서 1.5.0으로 다운그레이드하면 이 문제가 해결됩니다.
이 문제는 두 Android 프로젝트 간의 불일치로 인해 발생할 수도 있습니다.예를 들어, "com" 패키지를 사용하여 Android 라이브러리를 개발한 경우입니다.your company"를 선택하면 기본 패키지와 동일한 패키지를 사용하는 메인 어플리케이션 프로젝트가 생성됩니다.그런 다음 메인 앱의 버전을 변경하여 매니페스트 파일의 값을 변경한다고 가정합니다.버전 코드 및 버전 이름.라이브러리의 값을 변경하지 않고 앱을 실행하면 라이브러리에서 개체에 대한 메서드 호출 시 확인 오류가 발생합니다.
저도 같은 문제가 있었어요.저는 2.1 r1로 건물을 짓고 있었고, 새로운 adt 17로 2.1 r3로 업데이트했습니다.javamail의 mail.jar에 오류가 있는지 확인했더니 미치겠더라고요.문제를 해결한 방법은 다음과 같습니다.
- libs/폴더를 만들고 병을 추가했습니다.
- 오른쪽 클릭> 소스 폴더로 추가
리빌드를 시도했지만 실패했습니다.소스 폴더로서의 libs/디렉토리를 삭제하고 빌드 경로의 3개의 jar 파일에 대한 참조를 삭제했습니다.그런 다음 libs/폴더를 다시 추가하고 libs/폴더에 있는 각 병을 빌드 경로에 추가했습니다.이제 예상대로 작동합니다.이것은 이상한 해결책이지만 나에게는 효과가 있었다.
»Eclipse 4.x
과 같이 해 주세요.
- 포함된 모든 서드파티제의 jar를 User-Libaray로 이행합니다.
- user lib를 Android lib보다 위로 이동하고 Order and Export 탭에서 확인합니다.
- 클리닝 및 재구축하여 실행
SDK 업데이트 후 이 문제가 발생하였습니다.컴파일러에 외부 라이브러리에 문제가 있었다.이렇게 했습니다.프로젝트를 오른쪽 클릭하여 "Android Tools" > "add suport library"..." 프로젝트 라이브러리 "support-v4.jar"에 설치합니다.
java.lang.VerifyError
컴파일된 바이트코드가 실행 시 Android에서 찾을 수 없는 것을 참조하고 있는 것을 의미합니다.이 verifyError 두 디바이스에서 동일한 빌드를 실행한 경우에도 위의 버전이 아닌 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.+'
코어 라이브러리를 사용하지 않고 Dependancy를 최신 버전 2.2에서 2.7로 변경(core2.7을 포함하면 verifyError가 표시됨)하면 동작합니다.즉, 메서드 및 코어의 기타 내용이 Databind2.7의 최신 버전으로 이행됩니다.이것으로 문제가 해결됩니다.
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
Verfiy Error도 표시됩니다.진짜 이유를 못 찾겠어이것은 새로운 코드 행을 메서드(Eclipse, 'Extract Method...')로 정리하는 데 도움이 됩니다.그래서 제 경우에는 지원되지 않는 방법이 아닙니다.
저도 비슷한 문제가 있었어요.Apache POI jars를 추가했는데 Android SDK 22.3으로 업데이트 했을 때 문제가 발생하였습니다.
Android Private Libraries를 확인했기 때문에 이것은 Android SDK의 일반적인 문제가 아니라 Apache POI jars를 모두 끄고 하나씩 추가했습니다.poi-3.9-20121203.jar는 poi-oxml-3.9-20121203.jar보다 앞에 있어야 합니다.그렇지 않으면 작동하지 않습니다.
는 이 .build.grade
파일:
testCoverageEnabled = true
이로 인해 Java 1.7 기능, 특히 문자열 스위치 문을 사용하는 클래스에서 VerifyError 예외가 발생했습니다.
Git pull을 만든 후에도 같은 문제가 발생하였습니다.
솔루션:빌드 -> 클린 프로젝트
이게 도움이 됐으면 좋겠다.
나는 다른 케이스를 발견했다.
상태:
- Retrolambda를 사용합니다(필요한지는 잘 모르겠습니다).
- 인터페이스로 스태틱메서드를 만듭니다.
결과는 boom! java.lang 입니다.해당 인터페이스를 사용하는 클래스에 액세스하려고 하면 VerifyError가 발생합니다.Android(내 경우 4.4.*)는 인터페이스의 정적 방식을 좋아하지 않는 것 같습니다.인터페이스에서 스태틱 메서드를 삭제하면 VerifyError가 사라집니다.
사용자 라이브러리의 내 항아리도 문제가 있었습니다.
이 문제를 해결한 방법은 lib 폴더에 추가한 다음 일식 시 빌드 속성에 추가하는 것입니다.
처음에 이렇게 했을 때는 잘 안 됐지만, 그 후 다시 떼어내고 다시 붙이면 작동하기 시작했어...
좀 이상한데! 하지만 지금은 항상 일하고 있어.
행운을 빌어요
SDK 2.1에 있는 Android API 메서드/클래스를 코드화하여 Android 1.6 에뮬레이터에서 실행하려고 했습니다.그래서 나는 그 오류를 얻었다.
해결책: 올바른 에뮬레이터 버전으로 변경.
이건 나한테 효과가 있었어감사합니다.
후세를 위해 이 오류는 그냥 제가 쓰다가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();
}
};
종속 프로젝트를 제거하고 종속 프로젝트를 컴파일하여 libs 폴더에 포함시켜야 했습니다.
내 명분이 너와 달랐던 건 확실하지만, "Android java.lang"을 검색했을 때 최고의 히트곡 중 하나이기 때문이다."Verify Error"라는 말로 후세를 위해 여기에 기록하려고 했습니다.
나는 다음과 같은 수업을 들었다.
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 메시지가 나타납니다.이것을 2개의 다른 방법(B만을 취급하는 방법과 C만을 취급하는 방법)으로 나누면 문제가 해결되었습니다.
제 경우 구글 플레이 서비스가 최신 버전이 아니기 때문에 이 오류가 발생합니다.
프로젝트가 .jar의 일부 클래스를 지원하지 않으면 이 오류가 발생합니다(예:ImageView(이미지 뷰)set Layer(세트레이어)유형, AdvertisingIdClient 등).
dx'가 아닌 libs가 원인이 되어 발생한 다른 상황을 방금 확인했습니다.매우 긴 doInBackground method를 가진 비동기 태스크가 있습니다.어떤 이유에서인지 145개가 넘는 라인이 있는 이 방식은 깨지기 시작했습니다.그것은 2.3 앱에서 일어났다.몇몇 부분들을 메서드에 캡슐화하면 잘 작동했습니다.
따라서 올바르게 dx'되지 않은 클래스를 찾을 수 없는 경우 메서드의 길이를 줄이십시오.
「Java 7」(「API 19+」)의 멀티 캐치.그래서 그것은 와 함께 충돌할 것이다.VerifyError
19일
저는 compileSdkVersion과 build의 상관관계에 있었습니다.Tools Version.나는 다음을 가지고 있었다.
compileSdkVersion 21
buildToolsVersion '19.1.0'
다음으로 변경했습니다.
compileSdkVersion 21
buildToolsVersion '21.1.2'
저는 compileSdkVersion의 문제입니다.특정 안드로이드 어플리케이션에서 API 레벨 21을 사용했을 때(https://github.com/android10/Android-AOPExample):
compileSdkVersion 21
java.displays.displays 오류가 발생하였습니다.그래서 compileSdkVersion을 19로 변경했습니다.
compileSdkVersion 19
잘 됐어요.SDK 빌드의 문제인 것 같습니다.툴, API 레벨이 21 미만일 경우 정상인 것 같습니다.
언급URL : https://stackoverflow.com/questions/668788/android-java-lang-verifyerror
'programing' 카테고리의 다른 글
ERROR 1115(42000):알 수 없는 문자 집합: 'utf8mb4' (0) | 2022.09.18 |
---|---|
Ubuntu 16.04 MariaDb 설정 예 없음 (0) | 2022.09.18 |
SQL DELETE with WHERE 조건에 대한 다른 테이블 참여 (0) | 2022.09.18 |
php로 파일 압축 풀기 (0) | 2022.09.18 |
레지스트리 키 오류: Java 버전의 값은 '1.8'이지만 '1.7'이 필요합니다. (0) | 2022.09.18 |