2013-03-01 1 views
1

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라고 말합니다.

+0

생략 한 stackTrace 란 무엇입니까? –

+0

이 클래스는 호출 스택이었습니다. 중요하지 않습니다. 처음에는 클래스 MySomeClass에 액세스하려고 할 때 런타임에 크래시가 발생했습니다. 그래서 내가 알아 내려고 애 쓰고있는 주요 질문은 - ant build에서 javac을 시작하는 것과 adt가 javac를 시작할 때의 차이점은 무엇입니까? – Tertium

답변

1

나는이 문제를 해결했다고 생각합니다.

자바 버전을 전환하고 기본 Google Ant 작업을 다시 정의하며 여러 클래스에서 다른 javac를 독립 실행 형으로 실행하여 클래스를 컴파일하는 데 많은 시간을 보냈습니다. 지난 5 년 동안 나는 콘솔 도구로 Java를 컴파일하지 않았기 때문에 어렵고 혼란 스러웠습니다. 같은 javac, 모든 확인 오류와 운이 없었어요.

나는 이클립스 및 안드로이드 워드 프로세서를 읽고 우리가 이클립스에서 apk를 빌드 할 때 ADT는 javac 대신 Eclipse의 JDT (Java 용 Eclipse 컴파일러)를 사용하여 java 코드를 클래스로 컴파일 한 다음 dalvik 코드를 작성하는 툴을 발견했다. 그래서 정상적인 컴파일 작업 대신 JDT를 시작해야합니다. 맞습니까? 아니, 실제로 모든 것이 더 쉽습니다. 자주 발생하기 때문에 끝에서부터 시작했지만 일단 내가이 컴파일 도구가 필요하다는 것을 알게되면 나는 올바른 방향으로 가고있었습니다.

Java 용 Eclipse 컴파일러 (JDT ECJ)는 실제 javac보다 훨씬 똑똑한 도구입니다. 그것은 매개 변수의 무리와 함께 나를위한 새로운 도구지만, JDT는 매우 차가운 ant javac adapter을 제공하고, 우리는 javac 개미 작업에 사용할 수 있습니다 - "빌드를 설정합니다.나는이 사실을 발견했습니다 계속 조사를

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" /> 

<javac encoding="${java.encoding}" source="1.6" target="1.6" debug="true" extdirs="" 
        includeantruntime="false" destdir="${out.classes.absolute.dir}" 
        bootclasspathref="project.target.class.path" 
        verbose="${verbose}" classpathref="project.javac.classpath" 
        fork="${need.javac.fork}" > 
    <src path="${source.absolute.dir}" /> 
    <src path="${gen.absolute.dir}" /> 
    <compilerarg line="${java.compilerargs}" /> 
</javac> 

하지만 ecj.jar이 이클립스에서 이러한 파일이 존재하지 않는 한이 작동하지 않습니다! 컴파일러 "속성 다음 일반 안드로이드 개미 -compile 작업을 시작합니다. 이클립스 컴파일러는 Java 용 downloaded as standalone 수 있습니다.이 항아리를 개미/lib 폴더에 복사해야합니다.하지만 이상한 것은 - ecj 4.2.2 동일한 확인 문제가있는 컴파일 된 코드입니다. 다행히 나는 ecj 3.5.1 시도 - 그러나 그것은 만족스럽지 않습니다 - 아직도 ecj 4.2.2가 3.5.1에서 도움이되지 않는 이유는 말할 수 없습니다. 이클립스를 업그레이드하고 나쁜 클래스를 컴파일하면 어떻게 될까요? 바이트 코드 - 매우 약간 다릅니다 (jd-gui로 디 컴파일 됨). 문제는 결과 클래스 파일 내부에 있다고 가정합니다. 무엇이 지옥인지 알고 싶습니다. ev 무엇을 찾을 지 상상할 수 없습니다.

어쨌든, 더 있습니다. eclipse/plugins 폴더를 보면 "org.eclipse.jdt.core_3.6.2.v_A76_R36x.jar"와 같은 이름의 파일을 볼 수 있습니다. jdtCompilerAdapter.jar 파일을 내부에 저장합니다 (jar는 zip 아카이브 임). ant/lib에 복사 한 다음 org.eclipse.jdt.core_xxxxxx.jar 파일을 복사하면 현재 Eclipse 버전과 정확히 동일한 컴파일러를 얻게됩니다! 빌라! 이런 식으로 일식이 "좋은"코드를 만든다면 개미도 그렇게 할 것입니다.


그래서 결국 모든 것은 두 가지 간단한 단계 결과 : 그것의 내부에서

  1. 복사 org.eclipse.jdt.core_xxxxxx.jar 및 jdtCompilerAdapter.jar 당신의 lib 디렉토리/개미 폴더로 이동합니다.

  2. 추가로 다음 project.properties 파일 :

    • java.target = 1.6
    • java.source = 1.6
    • build.compiler = org.eclipse.jdt.core.JDTCompilerAdapter

그게 전부입니다!

그러나 일식 주노 패키지 (4.2.2)에서 유럽 사법 재판소를 잘 작성 코드를 컴파일에 실패 왜 아이디어가 있다면 듣고 싶습니다!

+0

클래스를 찾을 수 없다는 메시지가 나타납니다 : org.eclipse.jdt.core.JDTCompilerAdapter 또한 안드로이드 용 tools/ant 디렉토리에 lib 폴더가 없었습니다. 그들 이름을 모두 바꿨습니까? – schwiz

관련 문제