Android 용 Java 프로젝트에는 여러 가지 구성이 있습니다. 이전에는 수동으로 이클립스에서 apk를 만들었지 만 최근에는 cmd 파일을 실행하고 모든 구성 (빌드 할 때마다 구성 변경, 리소스 이동, 매니페스트 수정, 기타.).Ant를 사용하여 빌드 할 때 VerifyError, Eclipse에서 빌드 할 때 확인
오늘은 안드로이드 워크 플로우 (내 build.xml에는 $ {sdk.dir} /tools/ant/build.xml이 포함되어 있습니다)와 개미 (javac 사용)가 컴파일 된 코드가 생성 된 코드와 다릅니다. Eclipse의 ADT 도구로. 그리고 차이는 치명적입니다.
컴파일 단계에서 javac은 BOM이 포함 된 파일이 있고 하나의 클래스가 너무 많은 정적 배열을 사용한다고 주장했습니다. 나는 모든 파일을 utf8 승/bom으로 변환했으며 큰 클래스는 두 개로 분할되었고 javac은 더 이상 문제가 없었다. 쉬웠 어. (작품에 1.6, 2.2, 4.1, 4.2하면서)는 힘이 런타임에 닫히고 말한다 내가 4.0.x의 장치 또는 에뮬레이터에 개미 만든 APK를 시작하지만 경우
:
03-01 09:15:16.247: W/dalvikvm(1993): VFY: register1 v3 type 17, wanted 18
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejecting opcode 0xc8 at 0x0023
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejected Lcom/myproj/MySomeClass;.doThing (I)V
03-01 09:15:16.247: W/dalvikvm(1993): Verifier rejected class Lcom/myproj/MySomeClass;
03-01 09:15:16.247: W/System.err(1993): java.lang.VerifyError: com/myproj/MySomeClass
...
<stack here>
...
을하지만 이클립스 ADT -made apk는 4.0.x에서 잘 작동합니다! 더욱 - 컴파일시 utf bom이나 클래스 크기에 대한 adt 클레임을 보지 못했습니다.
그래서 우리는 ant 빌드에서 javac 이외의 다른 것을 사용해야한다고 가정합니다. 그러나 Google은 build.xml에서 정확히 javac을 사용합니다. 개미로 빌드 할 때 javac 대신 ADT 컴파일러를 어떻게 사용할 수 있습니까?
물론 이클립스에서 빌드를 만들 수 있지만 개미 스크립트는 20 분을 소비 할 때 1 분을 소비하며 cfg 변수를 변경하는 동안 바보 같은 실수는하지 않습니다.
미리 감사드립니다.
UPDT : 내가 사용하는 자바 버전과 어떻게 든 연결되어 있다고 생각합니다. Ant는 1.7 x86 jdk로 실행되지만 eclipse는 jdk1.6.0_26 x64를 사용합니다. 누군가 Dalvik dex가 java 1.7 바이트 코드를 이해하지 못한다고 말하지만 확인해야합니다.
UPDT1 : 아니요, 모든 jdk를 제거한 다음 jdk 1.6.0_41 x86 및 x64를 모두 설치하고 1.6.0_41 x64로 Eclipse 작업을 설정하고 JAVA_PATH를 jdk 1.6.0_41 x86으로 설정하십시오. 똑같은 일이 - 일식 (안드로이드 도구 -> 서명 된 apk 내보내기)에서 컴파일 된 apk가 작동하며, ant-compiled apk가 VerifyError라고 말합니다.
생략 한 stackTrace 란 무엇입니까? –
이 클래스는 호출 스택이었습니다. 중요하지 않습니다. 처음에는 클래스 MySomeClass에 액세스하려고 할 때 런타임에 크래시가 발생했습니다. 그래서 내가 알아 내려고 애 쓰고있는 주요 질문은 - ant build에서 javac을 시작하는 것과 adt가 javac를 시작할 때의 차이점은 무엇입니까? – Tertium