2012/03/28

Android 프로젝트 의존성 처리 방식 변경

이 글은 아래 링크의 대한 번역글입니다.
http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

이번(r17) Android SDK 부터 안드로이드 프로젝트에서 라이브러리 의존성을 체크하는 방식이 개선되었습니다.

먼저 Ant-based 빌드 시스템과 이클립스 플러그인이 동일하게 동작하도록 변경되었습니다.

프로젝트는 소스폴더와 라이브러리 프로젝트, jar파일 의존성을 갖습니다. 이제 라이브러리 프로젝트를 project.properties 에 넣기만 하면 자동으로 다음 경로들에서 의존성을 찾아 냅니다.

  • 프로젝트의 libs/*.jar
  • 라이브러리 프로젝트의 생성물
  • 라이브러리 프로젝트의 libs/*.jar 
위 항목들과 프로젝트 소스의 컴파일 결과물이 함께 dex에서 처리되어 APK를 생성하게됩니다.

프로젝트들간에 동일한 jar를 사용하는 여러 라이브러리를 포함할 수 있기 때문에 빌드시스템은 모든 경로에서 jar를 찾아내 중복되는 jar를 제거합니다. 이로 인해 흔히 보았던 문제인 "already added"가 더 이상 발생하지 않을 것입니다.

중요한 변경사항: 라이브러리 프로젝트가 R 클래스를 생성하고 패키징 하는 방식이 변경됨!
  • 더 이상 R 클래스가 라이브러리 프로젝트의 jar 에 포함되지 않습니다.
  • 라이브러리 프로젝트는 그들이 의존하는 라이브러리 프로젝트의 R클래스를 만들어 내지 않습니다. 메인 앱 프로젝트가 라이브러리에 포함된 R클래스를 그들 자체의 R클래스와 함께 만들어 집니다.
이것은 이제 라이브러리 프로젝트가 의존하는 다른 라이브러리 프로젝트의 R클래스를 가져오지 못함을 의미합니다. 이제는 앱의 R클래스가 모든 필요한 리소르를 모두 포함하고 있기 때문에 이는 더이상  필요하지 않습니다. (주 : 라이브러리 프로젝트에서 다른 라이브러리 프로젝트의 리소스를 참고가 더이상 불가능함을 의미합니다.)

이클립스에서의 변경사항
"Library Projects" 컨테이너의 동적인 classpath는 "Android Dependencies"로 변경되고 라이브러리 프로젝트 말고도 더 많은 걸 포함하게 되었습니다.

이 컨테이너는 라이브러리 프로젝트가 참조하고 있는 Java-only 프로젝트도 찾아내 앱 프로젝트에 포함 시켜줍니다. 또 그 자바 프로젝트가 다른 자바프로젝트를 참조할 경우에도 자동으로 그 프로젝트나 jar를 찾아서 추가합니다. (사용자 라이브러리에서 참조하는 jar역시 지원됩니다.)


중요 : 이는 참조하는 프로젝트에서 참조 프로젝트가 exported로 설정되어 있는 경우에만 설정됩니다. 이 동작은 프로젝트나 jar를 build path에 추가하는 경우 기본 동작이 아닙니다.
라이브러리 프로젝트(프로젝트 내부의 libs/*.jar를 포함)는 항상 exported 됩니다. 이 동작은 Java-only 프로젝트와 그 내부의 jar에만 해당됩니다.

물론 이 경우에도 중복되는 jar는 감지되고 제거 됩니다.

의존성 해결방법

프로젝트가 동일한 jar파일을 사용하는 두개 이상의 라이브러리 프로젝트를 포함하는 경우 빌드시스템은 이를 감지하고 중복문제를 해결해야합니다.

완전한 의존성관리 시스템은 각 jar파일을 quallified 이름과 버전 값으로 그들을 구분해 내야합니다. 하지만 불행이도 안드로이드 빌드시스템은 이를 지원하는 완전한 방법을 제공하지 않습니다. (아직!)

현재는 다음의 방법에 따르는 간단한 방식을 제공하고 있습니다.

Jar파일은 파일명에 의해 구분합니다.
mylib.jar는 mylib-v2.jar와 다른 파일로 인식되며 두 파일 모드 패키징 되고 두 버전이 동일한 라이브러리의 다른 revision인 경우 "already added" 라는 dx 에러를 내게됩니다.

같은 파일명인 jar의 경우 "same version"이라 함은  파일 내용이 동일할 경우를 말합니다.
현재의 감지 시스템은 매우 기초적인 구현이기 때문에  파일 사이즈와 sha1값을 가지고  파일이 동일하다는 판단을 합니다. 만약 동일한 파일명을 가졌지만 실제 내용이 다른 jar를 라이브러리 프로젝트들이 각각 가지고 있다면 빌드 시스템은 의존성관련 에러를 내게 됩니다.
android-support-v4.jar 와 android-support-v13.jar를 위한 처리
위의 두가지 라이브러리의 경우 -v13 은 -v4의 모든 구현을 포함하고 있기 때문에 특별하게 처리됩니다. 두개의 jar가 모두 발견되는 경우 -v13의 jar만 사용됩니다.
하지만 빌드시스템이 발견하는 -v4, -v13 라이브러리가 동일한 revision 이라는 것은 판단하지 못합니다. 그러기 때문에 support라이브러리를 업데이트 해주는 경우 모든 프로젝트의 -v4, -v13 jar를 동시에 업데이트 해주시기를 권합니다.  
Post a Comment