안드로이드 아카이브 라이브러리 (ar) vs 표준 jar


131

Android 앱의 표준 빌드 시스템으로 Gradle의 새로운 채택에 대한 기사를 읽었습니다. 글쎄, 표준 Java 개발에서 나는 보통 프로젝트를 빌드하기 위해 jar 파일에 의존합니다 . 그러나 안드로이드는 것 같다 AAR 에 동일 패키지, dll을 언급 한 바와 같이, 윈도우 OS에서 파일 여기를 :

먼저, Android 플랫폼이 응용 프로그램 수준의 "공유 라이브러리"를 허용하지 않음을 알아야합니다. "전통적인"프로그래밍 언어 플랫폼 인 C, C ++, Java에서는 런타임 라이브러리를 공유하는이 메커니즘이 있습니다. (예 : Windows의 DLL, Unix의 DSO, JVM의 Jar 등). 그러나 Android에서는 Google 또는 핸드셋 제조업체가 아닌 한 그렇게 할 수 없습니다 (아래 각주 1 참조). 응용 프로그램 개발자는 이것이 근본적인 한계가 될 수 있습니다. 빌드 타임과 런타임에서 "공유"또는 "재사용"코드는 소프트웨어 엔지니어링 실무에서 매우 중요한 부분입니다. 위에서 언급 한 한계로 인해 Android에서는 다소 어렵습니다 (불가능하지는 않지만 더 어렵습니다).

그러나이 개념에 대해 약간의 의심이 있습니다. 내 응용 프로그램에 aar 종속성을 포함하여 개발자가 언제 관심을 가져야 합니까? 이 종속성이 일부 SDK 최소 버전으로 강화 되었습니까?

예를 들어 한 프로젝트에서 COM 포트에 액세스합니다.이 포트는 NDK 사전 컴파일 된 .so 라이브러리를 사용합니다. 이 유틸리티를 공유하려면 aar를 만들어야합니까?

답변:


221

AAR파일은 더 비슷 Jar보다의 Dll다음과 같은 이유들 :

Dlls AAR및 jar 파일이 앱과 함께 패키지로 제공되는 애플리케이션에서을 공유 할 수 있습니다 .

AARs 대 Jars :

a Jar와 a 의 주요 차이점은 s와 같은 리소스가 포함 AAR된다는 AAR것입니다 layouts, drawables. 따라서 자체 포함 된 시각적 구성 요소를 훨씬 쉽게 만들 수 있습니다. 예를 들어, 동일한 로그인 화면을 사용하는 여러 앱이있는 경우, Jar클래스를 공유 할 수 있지만 레이아웃, 스타일 등은 공유 할 수 없지만 여전히 복제해야합니다. AARs를 사용하면 모든 것이 하나의 깔끔한 패키지로 번들됩니다.

결론적으로 AARs는 올바른 방향으로 나아가는 큰 발걸음입니다.

참고 : s를 사용
하여 유사한 시도를 apk-lib했지만 AAR훨씬 낫기 때문에 더 이상 사용되지 않습니다 .


@unify. aar 파일이 라이브러리를 난독 화하지 못하게 할 수있는 방법이 있습니까?
abh22ishek

이 답변에 혼란 스럽습니다. 첫 번째 인용문은 "응용 프로그램 간 공유"가 아니라 "응용 프로그램과 함께 포장되어 있습니다"라고 말합니다. 그러나 두 번째 블록 인용은 aars를 사용하면 여러 앱간에 클래스와 기타 리소스를 공유 할 수 있습니까?
LarsH

5
@LarH 나는 그것이 응용 프로그램간에 코드 (arar 파일)를 공유 할 수 있다는 것을 의미한다고 생각하지만 사용자가 응용 프로그램을 독립적으로 설치할 수 있도록 모든 패키지에 별도로 포함됩니다. 두 개의 응용 프로그램이 설치되어 있고 두 응용 프로그램이 모두 동일한 aar를 사용하는 경우 Android 런타임은 한 번만로드 할만 큼 영리 할 수 ​​있습니다.
Habib

1
AAR 파일에 큰 문제가 있습니다. AAR 파일을 만들어 일부 판매자에게 제공하여 비즈니스에 결제 솔루션을 제공하고 싶습니다. 클래스 멤버를 반영하고 앱에서 메소드 호출을 할 수 있기를 원하지 않습니다. 코드가 반영되지 않도록 보호 할 수있는 방법이 있습니다.
Mohammad moradyar

5
@Mohammadmoradyar 라이브러리에서 Proguard를 사용하여 클래스를 난독화할 수 있지만 Java 기반 바이트 코드와 마찬가지로 사람들이 코드를 컴파일하지 못하게 할 수는 없습니다.
통합

11

" Jar와 AAR의 주요 차이점은 AAR에 레이아웃, 드로어 블 등과 같은 리소스가 포함되어 있다는 것입니다. "는 JAR 파일 사양과 일치하지 않으므로 사실이 아닙니다. JAR 파일 사양 에 따르면 :

JAR 파일은 널리 사용되는 ZIP 파일 형식을 기반으로하는 파일 형식이며 많은 파일을 하나로 모으는 데 사용됩니다. JAR 파일은 기본적으로 선택적인 META-INF 디렉토리를 포함하는 zip 파일입니다.

보시다시피, JAR 파일에 레이아웃, 드로어 블 등과 같은 리소스를 포함하는 것을 금지하는 콘텐츠 제한은 없습니다. 자세한 내용은 Java® Virtual Machine Specification의 기사 5.3 "작성 및로드"를 참조하십시오.

따라서 Android Archive Library (ar) 대 표준 jar 문제가 있습니다. 대답은 사용중인 빌드 도구에 따라 다릅니다.

Android Studio를 빌드 도구 (각각 프로젝트 구성 자로)로 사용하는 경우 * .aar 파일을 사용하여 Android 프로젝트간에 캡슐화 된 리소스를 공유하는 것이 좋습니다. AAR 파일 형식은 Android Studio 빌드의 일부이며 다른 의견에서 언급했듯이 사용자 인터페이스는 Android 라이브러리에 대한 aar 형식을 지원합니다.

그러나 Android Studio를 제외하고 세계의 다른 사람들은 그 파일이 무엇인지 아는 것이 없습니다 (아티팩트) 예를 들어, Android 빌드가 Maven을 기반으로하는 경우 기본 Maven Java 프로젝트 아티팩트이므로 표준 jar 파일에 넣을 내용에 제한이 없기 때문에 자원 공유에 선호되는 파일은 jar입니다. 또한 Maven의 모든 파일 형식을 설명하는 방법이 있습니다. 새로운 구성 요소로 수명주기 향상 기능을 사용하여 aar를 포함하십시오. 간단한 예제는 여기 에 있습니다. Maven의 새 패키징 유형을 어떻게 만듭니 까?


그 차이점은 JAR은 자바 생태계에서 모든 종류의 리소스를 공유 할 수있는 방법이며 AAR은 안드로이드에 초점을 맞추고 구체적인 레이아웃으로 강제한다는 것 입니다.
Xtreme Biker

선택한 답변 (@unify)의 저자가 이것에 대해 분명히 설명해야한다고 생각합니다.
lfree

나는 더 큰 Java 세계에 대해 알지 못하지만 Android 세계에서는 jar 파일에 리소스를 포함시킬 수 없었습니다. 즉, 리소스가 .jar 아카이브에 있더라도 리소스가 포함 된 프로젝트로 가져 오지 않습니다. stackoverflow.com/q/2474904/211292
ThomasW

6

문제의 인용은 현재 현실과 공통점이 없습니다. 물론 Android에서 외부 라이브러리를 사용할 수 있으며 사용 가능한 라이브러리가 많이 있습니다. 어쩌면 그들은 각 응용 프로그램이 필요한 모든 라이브러리를 번들로 제공해야한다고 말하고 싶었지만 빌드 타임에 라이브러리를 재사용 (정적 연결)하는 것은 실제로 문제가되지 않습니다.

.aar와 다름 .jar.jar다릅니다 .zip. 그것은 종류의 콘텐츠가 기대해야하는 특정 개념을 가지고 있지만, 모두 .jar.aar가장 자주 클래스하고 자원을 컴파일 들어 있습니다. .aar라이브러리가 Android에 따라 다르며 일부 예상 구조가 있으며 해당 라이브러리에 적합합니다 ( .jar예정 구조도 있음).

.aar는 Android 스튜디오에서만 지원되는보기도 더 이상 사용되지 않습니다. 이러한 라이브러리는 Maven Central에 배포 할 수 있으며 gradle과 같은 도구는 예를 들어 @aar 접미사를 사용하여이를 참조 할 수 있습니다.

dependencies {
    compile ('io.github.andviane:uncover:2.0.1@aar')
    ..
}  

Maven 중앙 배포 를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.