2014-02-28 3 views
7

나는 안드로이드 라이브러리 프로젝트 FooLib을 가지고 있습니다. FooLib은 Android Context과 같은 것을 참조하지만 리소스 파일 (res/에있는 것들)을 필요로하지 않으므로 현재 내 애플 리케이션 용 JAR로 패키징하고 있습니다.Android 라이브러리 JAR이 Android 라이브러리 AAR에 의존 할 수 있습니까?

는 지금 FooLibBarLib에 따라 만들고 싶어,하지만 난 JAR로 BarLib을 포장 할 수 있도록 BarLib 사용 자원을 수행합니다. 대신 AAR로 패키지됩니다. 내가 FooLibBarLib에 의존하지만 FooLib을 JAR로 패키지 할 수 있습니까? 또는 FooLib에 AAR 의존성이 있습니까? AAR도 만들도록 강요합니까?

+1

JAR이 어떻게 "의존"할 수 있습니까? 클래스를위한 컨테이너 일뿐입니다. –

+0

어쩌면 나는 그것을 표현해야만합니다. "JAR로 패키징 될 수있는 Android 라이브러리 프로젝트는 리소스를 사용하여 (따라서 AAR로 패키징 된) 다른 JAR 파일로 계속 패키징 될 수 있습니까?"나는 대답이 '아니오'라고 생각하지만, 단지 확인하고 싶습니다. – Matthew

답변

5

JAR 파일과 AAR 파일을 종속성으로 포함하는 프로젝트 (아래 참고 참조)가있는 경우 JAR 파일은 Android API의 클래스에 의존하는 종속성으로 종속 특정 JAR을 가질 수 있습니다 이미 알고있는 Android 리소스가 포함되어 있어야합니다. Android 클래스에 따라 다르므로 AAR로 패키지화해야한다는 의미는 아닙니다.

여기서는 JAR 및 AAR 종속성을 많이 포함하는 단일 모듈 프로젝트에 대해 이야기합니다. JAR 파일은 클래스 파일 (및 Android 이외의 리소스 및 기타 파일)의 모음이며 종속성을 갖지 않으므로 아무 것도 깨뜨릴 수 없습니다. 빌드를 할 시간이되면 빌더는 모든 것을 함께 묶어 패키지화하고 JAR에 다른 클래스에 대한 해석 할 수없는 종속성이 있는지 확인하지 않습니다. 런타임시 클래스 로더 예외를 통해 알 수 있습니다.

IDE의 멀티 모듈 프로젝트에서 라이브러리 에 대해 이야기하는 경우에는 다른 문제입니다. 일반 JAR로 컴파일 할 수있는 모듈 A (빌드 파일에서 apply plugin: 'java' 문 사용)가 있으면 AAR로 컴파일되는 Android 모듈 (apply plugin: 'android-library')에 의존 할 수 없습니다. Android 모듈의 소스 폴더가 훨씬 더 복잡하고 Gradle의 Java 플러그인이 Android의 소스 세트를 이해할 수 없기 때문에 예측할 수없는 미래에는 해결되지 않을 것입니다.

반대의 경우도 마찬가지입니다. - Android 모듈 은 일반 Java 모듈에 의존합니다. 때문에 아직 Gradle을 빌더에서 해결되지 제한

참고

, 당신은 (compile files(...) 문을 통해이를 참조하여) 당신이 당신의 빌드 파일에서 JAR 파일과 같이 동일한 방법으로 지역 Aars의 액세스 할 수 없습니다; Gradle을 속여서 Maven 저장소에 있다고 생각하도록 만들어야합니다. 아마도 실제 Maven 저장소에 넣을 수 있습니다. 로컬 저장소 일 수 있습니다. 필요한 경우 해결 방법은 Adding local .aar files to my gradle build을 참조하십시오.

+0

예, 저는 멀티 모듈 프로젝트에서 라이브러리 모듈에 대해 이야기하기. 모듈 A와 모듈 B가 둘 다 안드로이드 모듈이라고 가정 해보자. (둘 다 build.gradle 파일에 'apply plugin :'android-library ''문이있다.) 나는 여전히 http://stackoverflow.com/a/19484146/128948 모듈 A를 JAR로 패키징하는 데 리소스가 필요하지 않은 경우 모듈 B에 리소스가 필요하고 AAR로 패키징되어 있으면 모듈 A를 모듈 B에 종속시킬 수 있습니까? 여전히 모듈 A를 JAR로 패키지합니까? – Matthew

+0

작동해야하는 것처럼 보입니다. android-library plugi ns는 서로 의존 할 수 있으며, Jake Wharton의 스크립트는 JAR 출력을 모듈에서 빼내는 데 효과가있는 것처럼 보입니다. 모듈이 이러한 변경을 통해 AAR과 JAR의 두 가지 출력을 생성한다고 생각합니다. –

+0

이것에 대한 질문 ... 예를 들어 appcompat-v7이 동일한 maven 하위 폴더에서 .aar와 .jar를 모두 제공하기 때문에 ... 종속성을 지정할 때 gradle은 항상 .aar 파일과 물론 gradle java 플러그인을 선택합니다 그것이 무엇인지 모릅니다 ... POM이 패키지 .aar를 지정하더라도 .aar를 통해 .jar를 선택하는 방법이 있습니까? –

1

AAR format은 jar 파일로 직접 클래스를 포함하지 않으므로 Android 프로젝트가 아닌 경우에는 유용하지 않습니다. 그러므로 FooLib을 AAR로 만드는 것이 낫습니다.

또 다른 해결책은 BarLib에서 jar 라이브러리를 추출하여 의존하는 것입니다.

+0

Android가 아닌 프로젝트에서 FooLib을 사용할 생각은 없지만 FooLib을 JAR로 유지하면 호환성을 극대화 할 수 있습니다. AAR, Ant 기반 Android 앱에서는 사용할 수 없습니다. 원래 질문에 대답하려면 "아니요, Android 라이브러리 JAR은 Android 라이브러리 AAR에 의존 할 수 없습니다"라고 말하고 있습니까? – Matthew