안드로이드 라이브러리 프로젝트 Fat-AAR 생성 방법 (with. kezong:fat-aar)

TL;DR
// build.gradle
apply plugin: 'com.kezong.fat-aar'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.8'
}
}
dependencies {
// aar 에 포함 안됨
implementation 'libraries:havenot:includein:aar:1.0.0'
testImplementation 'junit:junit:4.13.2'
// aar 에 포함 될 라이브러리
embed 'some-lib1:1.0.0'
// aar 에 포함 될 라이브러리
embed('some-lib2:1.0.0') {
// some-lib2 의 하위 라이브러리도 포함시킬 지 여부
transitive = false
// some-lib2 의 특정 하위 라이브러리를 제외
exclude(group:'some-group', module:'some-module')
}
}AAR 파일의 정의
“AAR” 파일은 안드로이드 앱을 빌드하기 위한 Android Archive의 약자이다. Android 앱 프로젝트에서 자원과 소스 코드를 패키징하여 라이브러리로 만들 때 사용되는 파일 형식이다.
AAR 파일은 JAR (Java Archive) 파일과 유사하지만 더 많은 기능을 제공한다. 일반적으로 AAR 파일은 Android 라이브러리 프로젝트를 빌드할 때 생성되며, 이 라이브러리는 다른 Android 앱 프로젝트에서 재사용할 수 있다.
AAR 파일에는 앱의 자원 (레이아웃, 이미지 등)과 소스 코드 (.class 파일), AndroidManifest.xml 파일, 그리고 프로젝트가 의존하는 라이브러리들과 관련된 정보가 포함된다. 이를 통해 라이브러리 개발자는 라이브러리를 다른 앱 개발자들과 공유하고, 더 쉽게 앱에 통합할 수 있도록 도와준다.
AAR 파일은 Android Studio 등의 개발 도구에서 사용되며, 라이브러리 프로젝트를 빌드하여 생성할 수 있다.
Fat-AAR 파일의 정의
라이브러리를 사용하다보면, 하나 이상의 라이브러리를 포함하는 AAR이 필요할 수 있다. 이를 Fat-AAR 이라고 한다.
AAR 에는 라이브러리 JAR 과 Drawable, Layout 등과 같은 리소스가 포함되어 있을 수 있다. Fat-AAR 에는 둘 이상의 AAR 이 포함되어 있으므로 많은 라이브러리를 가져올 필요가 없으며, 필요한 모든 것을 포함하는 라이브러리만 가져올 수 있다.
Fat-AAR 생성 방법
Fat-AAR 생성 방법은 fat jar를 생성하는 방법에 대해서는 간단한 검색으로 바로 구현할 수 있을 만큼 다양한 레퍼런스가 있지만, fat aar을 생성하는 방법은 상세하게 나오지 않아 구현에 어려움이 있다.
아래의 방법은 fat-aar-android (fat-aar) 라이브러리를 사용한다.
라이브러리를 fat aar 을 생성할 프로젝트의 빌드 스크립트에 추가한다.
글 작성 날짜(2023/07/25) 기준 최신 버전 1.3.8 사용.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.8'
}
}이후 빌드 스크립트 최상단에 아래의 줄을 추가하여 플러그인을 적용한다.
apply plugin: 'com.kezong.fat-aar'dependencies 에서 빌드된 aar 파일에 포함시킬 라이브러리를 골라 implementation 을 embed 로 변경한다.
dependencies {
// aar 에 포함 안됨
implementation 'libraries:havenot:includein:aar:1.0.0'
testImplementation 'junit:junit:4.13.2'
// aar 에 포함 될 라이브러리
embed 'some-lib1:1.0.0'
// aar 에 포함 될 라이브러리
embed('some-lib2:1.0.0') {
// some-lib2 의 하위 라이브러리도 포함시킬 지 여부
transitive = false
// some-lib2 의 특정 하위 라이브러리를 제외
exclude(group:'some-group', module:'some-module')
}
}위와 같이 빌드 스크립트를 설정하고 gradle assemble 을 실행시킨 뒤, 결과물을 압축해제하면 라이브러리가 정상적으로 임베딩된것을 확인할 수 있다.

(junit 을 embed 선언 했을 때)
주의사항
- Gradle 버전 8 이상의 프로젝트에서는 동작하지 않으므로, Gradle 버전을 8 미만으로 낮추어야 한다.
관련링크 - 리소스 ID 끼리 충돌이 날 수 있으므로, 가능한 경우 앞에 접두사를 붙여 다른 라이브러리 내의 리소스 ID와 충돌을 피하는 것이 좋다.
- ProGuard를 사용하고 minifyEnabled 값이 true로 설정되어 있을 경우, 외부 라이브러리가 필터링되어 빌드 결과물에 포함되지 않을 수 있으므로, ProGuard 룰을 다시 한 번 살펴보아야 한다.
