2013년 9월 16일 월요일

ADT version과 상관 없는 NoClassDefFoundError의 해결

Mac으로 Android 개발 환경을 이전하면서 Windows에서 잘만 돌던 프로젝트들이 약속이나 한 듯이 말썽을 일으키는 상황이 발생했다. 대부분은 ADT 17 버전 이후의 변화 때문에 발생하던 것이었고 그 것들은 구글링으로 대부분 해결할 수 있었다. 해결책은 대강 아래와 같다.
1. ClassNotFoundException이 발생할 경우
Android Project -> Properties -> Java Build Path -> Order and Export 탭 선택 -> 외부 라이브러리를 Export 체크 
2. NoClassDefFoundError가 발생할 경우
Android project의 libs 폴더에 관련 jar들을 넣는게 가장 낫다. 그러면 Android project -> Properties -> Java Build Path -> Libraries -> Android Private Libraries에 삽입되어 있는 것을 확인할 수 있다. 빌드 후 [Project Explorer]에서 bin/dexedLibs에 dex 형태로 변환된 jar들을 확인할 수 있다.

문제는 이걸로도 해결이 안되는 NoClassDefFoundError가 튀어나왔다는거... ㅠㅠ

Android Project가 아닌 순수 Java project로서 ANT 빌드한 jar인데, 이 걸 Android Project의 libs 폴더에 넣으면 런타임에서 NoClassDefFoundError가 발생한다. 분명히 dexedLibs에 변환된 jar를 확인했는데도 실제 apk 파일을 디컴파일해보면 관련 패키지가 삽입되어 있지 않다. 이 것 때문에 거의 1주일 동안 Mac으로의 이주가 hold 되었음.

힌트 : Windows에서는 잘 된다. Mac에서는 안 된다. 그럼 양쪽 OS에서의 차이가 무엇일까?로 시작한 원인 찾기. 결과적으로 Mac에서는 JDK의 버전이 1.7이었고 Windows에서는 버전이 1.6이었다. Android 4.1 시절이었나? 1.7을 지원 안한다는 얘기를 얼핏 들었던 기억이 있어서 ANT의 설정을 compiler="javac1.6"으로 수정!... 하면 실패한다!

특정 JDK에서 compiler 옵션을 하위 버전으로 수정하는 것은 경험상 아무 소용이 없었다. (예전에 Java 1.4를 사용하는 서버용으로 제품을 빌드할 때도 그랬음) 실제 JDK1.6 버전을 직접 설치해야한다. 직접 설치한 JDK를 지정하여 1.6으로 컴파일, 그리고 Android Project에 해당 jar를 삽입하니 드.디.어. 성공적으로 동작한다.

<javac srcdir="${src_android}"   
  destdir="${build_android}"  
  fork="yes"  
  executable="/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/javac"  
  compiler="javac1.6"  
  classpath="${android.classpath}"  
  includeantruntime="false"  
  encoding="UTF-8">  

댓글 1개:

  1. 비슷한 문제여서 여쭈어 봅니다 맨밑에 있는 설정은 어디에서 하나요 안드로이드 스튜디오인데 딱 19버전 전에서 동일 애러 발생하네요

    답글삭제