Android 라이브러리 만들기

Android 라이브러리는 구조적으로 Android 앱 모듈과 동일합니다. 여기에는 소스 코드, 리소스 파일, Android 매니페스트 등 앱을 빌드하는 데 필요한 모든 것이 포함되어 있습니다.

하지만 이 라이브러리는 기기에서 실행되는 APK로 컴파일되는 대신 Android 앱 모듈의 종속 항목으로 사용할 수 있는 Android 보관 파일(AAR)로 컴파일됩니다. JAR 파일과 달리, AAR 파일은 Android 앱에 다음과 같은 기능을 제공합니다.

  • AAR 파일에는 Android 리소스와 매니페스트 파일이 포함될 수 있습니다. 이를 통해 Kotlin 또는 Java 클래스 및 메서드 외에도 레이아웃 및 드로어블과 같은 공유 리소스를 번들로 구성할 수 있습니다.
  • AAR 파일은 앱 모듈의 C/C++ 코드에서 사용할 C/C++ 라이브러리를 포함할 수 있습니다.

라이브러리 모듈은 다음과 같은 상황에 유용합니다.

  • 활동, 서비스, UI 레이아웃 등 일부 구성요소를 동일하게 사용하는 여러 앱을 빌드하는 경우
  • 핵심 구성요소를 공유하는 여러 APK 변형(예: 무료 및 유료 버전)에 있는 앱을 빌드하는 경우

두 가지 경우 모두 재사용하려는 파일을 라이브러리 모듈로 이동한 후 각 앱 모듈의 종속 항목으로 라이브러리를 추가합니다.

이 페이지에서는 Android 라이브러리 모듈을 만들고 사용하는 방법을 설명합니다. 라이브러리를 게시하는 방법에 관한 안내는 라이브러리 게시를 참고하세요.

라이브러리 모듈 생성

프로젝트에서 새 라이브러리 모듈을 생성하려면 다음 단계를 따르세요.

  1. File > New > New Module을 클릭합니다.
  2. Create New Module 대화상자가 표시되면 Android Library, Next를 차례로 클릭합니다.

    기존 JAR 파일을 빌드하는 Kotlin 또는 Java 라이브러리를 만드는 옵션도 있습니다. JAR 파일은 많은 프로젝트에서, 특히 다른 플랫폼과 코드를 공유하려는 경우 유용하지만 Android 프로젝트에서 코드를 재사용할 때 매우 유용한 Android 리소스 또는 매니페스트 파일을 포함할 수는 없습니다. 이 가이드에서는 Android 라이브러리 생성에 관해 집중적으로 설명합니다.

  3. 라이브러리에 이름을 지정하고 라이브러리의 코드를 위한 최소 SDK 버전을 선택한 후 Finish를 클릭합니다.

Gradle 프로젝트 동기화가 완료되면 라이브러리 모듈이 Project 창에 표시됩니다. 새 모듈 폴더가 표시되지 않으면 창에 Android가 표시되는지 확인하세요.

앱 모듈을 라이브러리 모듈로 변환

재사용하려는 코드가 포함된 기존 앱 모듈이 있는 경우 다음과 같이 이 모듈을 라이브러리 모듈로 변환할 수 있습니다.

  1. Groovy를 사용하는 경우 모듈 수준 build.gradle 파일을 열고 Kotlin 스크립트를 사용하는 경우 build.gradle.kts 파일을 엽니다.
  2. applicationId를 지정하는 줄을 삭제합니다. Android 앱 모듈에서만 지정할 수 있습니다.
  3. 파일 상단에서 다음과 같은 'plugins' 블록을 찾습니다.

    Groovy

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

      plugins {
          id("com.android.application")
      }
      

    다음과 같이 변경합니다.

    Groovy

      plugins {
          id 'com.android.library'
      }
      

    Kotlin

      plugins {
          id("com.android.library")
      }
      
  4. 파일을 저장하고 File > Sync Project with Gradle Files를 클릭합니다.

모듈의 구조는 동일하게 유지되지만, 이제 Android 라이브러리로 작동합니다. 빌드는 APK 대신 AAR 파일을 생성합니다.

AAR 파일을 빌드하려면 Project 창에서 라이브러리 모듈을 선택한 다음 Build > Build APK를 클릭합니다.

프로젝트 구조 대화상자를 사용하여 종속 항목 추가

Project Structure 대화상자를 사용하여 프로젝트에 종속 항목을 추가할 수 있습니다. 다음 섹션에서는 대화상자를 사용하여 종속 항목을 추가하는 방법을 설명합니다.

동일한 프로젝트 내에서 라이브러리 사용

새 Android 라이브러리의 코드를 같은 프로젝트 내의 다른 앱이나 라이브러리 모듈에서 사용하려면 프로젝트 수준 종속 항목을 추가합니다.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. 라이브러리를 추가할 모듈을 선택합니다.
  3. Declared Dependencies 탭에서 를 클릭하고 메뉴에서 Module Dependency를 선택합니다.

  4. Add Module Dependency 대화상자에서 라이브러리 모듈을 선택합니다.

    프로젝트 구조 대화상자에서 모듈 종속 항목 추가

  5. 이 종속 항목이 필요한 구성을 선택하거나 모든 구성에 적용되는 경우 implementation을 선택한 후 OK를 클릭합니다.

Android 스튜디오는 모듈의 build.gradle 또는 build.gradle.kts 파일을 수정하여 다음 형식으로 종속 항목을 추가합니다.

Groovy

  implementation project(path: ":example-library")

Kotlin

  implementation(project(":example-library"))

다른 프로젝트에서 라이브러리 사용

종속 항목(JAR 및 AAR)을 공유하는 권장 방법은 Maven Central과 같은 서비스나 로컬 디스크의 디렉터리 구조에서 호스팅된 Maven 저장소를 사용하는 것입니다. Maven 저장소 사용에 관한 자세한 내용은 원격 저장소를 참고하세요.

Android 라이브러리가 Maven 저장소에 게시되면 라이브러리의 종속 항목이 사용 빌드에 포함되도록 메타데이터가 포함되므로 라이브러리가 여러 위치에서 사용되면 자동으로 중복 삭제될 수 있습니다.

다른 프로젝트의 다른 앱 모듈에서 Android 라이브러리의 코드를 사용하려면 다음 단계를 따르세요.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. Declared Dependencies 탭에서 를 클릭하고 메뉴에서 Library Dependency를 선택합니다.

  3. Add Library Dependency 대화상자에서 검색창을 사용하여 추가할 라이브러리를 찾습니다. 이 형식은 settings.gradle 또는 settings.gradle.kts 파일의 dependencyResolutionManagement { repositories {...}} 블록에 지정된 저장소를 검색합니다.

    프로젝트 구조 대화상자에서 라이브러리 종속 항목 추가

  4. 이 종속 항목이 필요한 구성을 선택하거나 모든 구성에 적용되는 경우 implementation을 선택한 후 OK를 클릭합니다.

앱의 build.gradle 또는 build.gradle.kts 파일에서 다음과 유사한 선언이 표시되는지 확인합니다(선택한 빌드 구성에 따라 다름).

Groovy

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

  implementation("com.example:examplelibrary:1.0.0")

AAR 또는 JAR을 종속 항목으로 추가

Android 라이브러리의 코드를 다른 앱 모듈에 사용하려면 다음 단계를 따르세요.

  1. File > Project Structure > Dependencies로 이동합니다.
  2. Declared Dependencies 탭에서 를 클릭하고 메뉴에서 Jar Dependency를 선택합니다.

  3. Add Jar/Aar Dependency 대화상자에서 AAR 또는 JAR 파일의 경로를 입력하고 종속 항목이 적용되는 구성을 선택합니다. 모든 구성에서 라이브러리를 사용할 수 있어야 하는 경우 implementation 구성을 선택합니다.

    프로젝트 구조 대화상자에서 AAR 종속 항목 추가

    앱의 build.gradle 또는 build.gradle.kts 파일에서 다음과 유사한 선언이 표시되는지 확인합니다(선택한 빌드 구성에 따라 다름).

    Groovy

      implementation files('my_path/my_lib.aar')

    Kotlin

      implementation(files("my_path/my_lib.aar"))

Android 스튜디오 외부에서 실행되는 Gradle 빌드의 종속 항목을 가져오려면 앱의 build.gradle 또는 build.gradle.kts 파일에 종속 항목의 경로를 추가합니다. 예를 들면 다음과 같습니다.

Groovy

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}

Kotlin

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
}

Gradle 종속 항목 추가에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.

공개 리소스 선언

리소스는 프로젝트의 res/ 디렉터리에 모든 파일을 포함합니다(예: 이미지). 라이브러리에 포함된 모든 리소스는 기본적으로 공개로 설정됩니다. 모든 리소스를 암시적으로 비공개로 만들려면 하나 이상의 특정한 속성을 공개로 정의해야 합니다.

공개 리소스를 선언하려면 <public> 선언을 라이브러리의 public.xml 파일에 추가합니다. 이전에 공개 리소스를 추가한 적이 없으면 라이브러리의 res/values/ 디렉터리에 public.xml 파일을 생성해야 합니다.

다음 코드 예에서는 이름이 각각 mylib_app_namemylib_public_string인 두 개의 공개 문자열 리소스를 생성합니다.

<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

라이브러리 사용자가 내부용으로만 사용하도록 작성된 리소스에 액세스하지 못하도록 하려면 공개 리소스를 하나 이상 선언하는 방법으로 자동 비공개 지정 메커니즘을 사용하세요. 또는 빈 <public /> 태그를 추가하여 모든 리소스를 비공개로 만들 수 있습니다. 이렇게 하면 아무것도 공개로 표시되지 않고 모든 리소스가 비공개로 설정됩니다.

라이브러리를 사용하는 개발자에게 계속 표시하려는 모든 리소스는 공개로 설정해야 합니다.

암시적으로 속성을 비공개로 설정하면 라이브러리 사용자가 내부 라이브러리 리소스에서 코드 완성 제안을 받을 수 없으며, 사용자가 라이브러리의 클라이언트를 손상시키지 않고 비공개 리소스의 이름을 바꾸거나 비공개 리소스를 삭제할 수 있습니다. 비공개 리소스는 코드 완성에서 필터링되어 제외되며, 비공개 리소스를 참조하려고 하면 린트 도구에서 경고를 표시합니다.

라이브러리를 빌드할 때 Android Gradle 플러그인이 공개 리소스 정의를 가져와서 public.txt 파일에 추출하고 이 파일은 AAR 파일 내에 패키징됩니다.

라이브러리 모듈의 개발 고려사항

라이브러리 모듈과 종속 앱을 개발할 때에는 다음 동작 및 제한사항에 유의해야 합니다.

  • 라이브러리는 우선순위 순으로 병합됩니다.

    라이브러리 모듈에 대한 참조를 Android 앱 모듈에 추가한 후에는 모듈의 상대적인 우선순위를 설정할 수 있습니다. 빌드 시에는 가장 낮은 우선순위에서 가장 높은 우선순위 순으로 라이브러리가 한 번에 하나씩 앱과 병합됩니다.

  • 리소스 병합 충돌을 방지합니다.

    빌드 도구는 라이브러리 모듈의 리소스를 종속 앱 모듈의 리소스와 병합합니다. 지정된 리소스 ID가 두 모듈에서 모두 정의된 경우에는 앱의 리소스가 사용됩니다.

    여러 AAR 라이브러리 간에 충돌이 발생한 경우 종속 항목 목록에 가장 먼저 (dependencies 블록의 상단에 가장 가까운) 나열된 라이브러리의 리소스가 사용됩니다.

    리소스 충돌을 방지하려면 비전환 R 클래스를 사용하세요. 이를 사용할 수 없다면 모듈에 고유하거나 모든 프로젝트 모듈에서 고유한 접두사 또는 다른 일관된 이름 지정 스키마를 사용하는 것이 좋습니다.

  • 다중 모듈 빌드에서는 JAR 종속 항목이 전이 종속 항목으로 처리됩니다.

    AAR을 출력하는 라이브러리 프로젝트에 JAR 종속 항목을 추가하면 JAR이 라이브러리 모듈에서 처리되어 AAR과 함께 패키징됩니다.

    하지만 프로젝트에 앱 모듈에서 사용하는 라이브러리 모듈이 포함되어 있으면 앱 모듈은 라이브러리의 로컬 JAR 종속 항목을 전이 종속 항목으로 처리합니다. 이 경우 로컬 JAR은 라이브러리 모듈이 아닌 로컬 JAR을 사용하는 앱 모듈에서 처리합니다. 이렇게 하면 라이브러리의 코드 변경으로 인해 발생한 증분 빌드의 속도가 빨라집니다.

    로컬 JAR 종속 항목에 의한 자바 리소스 충돌은 라이브러리를 사용하는 앱 모듈에서 해결되어야 합니다.

  • 라이브러리 모듈은 외부 JAR 라이브러리에 종속될 수 있습니다.

    외부 라이브러리에 종속된 라이브러리 모듈을 개발할 수 있습니다. 이 경우 종속 모듈은 외부 라이브러리가 포함된 타겟을 대상으로 빌드해야 합니다.

    라이브러리 모듈과 종속 앱 모두 매니페스트 파일의 <uses-library> 요소에서 외부 라이브러리를 선언해야 합니다.

  • 앱 모듈의 minSdkVersion은 라이브러리에서 정의된 버전보다 크거나 같아야 합니다.

    라이브러리는 종속 앱 모듈의 일부로 컴파일되므로 라이브러리 모듈에서 사용되는 API가 앱 모듈에서 지원하는 플랫폼 버전과 호환되어야 합니다.

  • 각 라이브러리 모듈은 자체 R 클래스를 생성합니다.

    종속 앱 모듈을 빌드하면 라이브러리 모듈이 AAR 파일로 컴파일된 후 앱 모듈에 추가됩니다. 따라서 각 라이브러리에는 라이브러리의 패키지 이름을 따라 이름이 지정된 자체 R 클래스가 있습니다.

    기본 모듈과 라이브러리 모듈에서 생성되는 R 클래스는 기본 모듈의 패키지와 라이브러리의 패키지를 포함하여 필요한 모든 패키지에서 생성됩니다.

  • 라이브러리 모듈에는 자체 ProGuard 구성 파일이 포함되어 있을 수 있습니다.

    AAR을 빌드하고 게시하는 데 사용하는 라이브러리 프로젝트가 있는 경우 ProGuard 구성 파일을 라이브러리의 빌드 구성에 추가할 수 있습니다. 이렇게 하면 Android Gradle 플러그인이 개발자가 지정한 ProGuard 규칙을 적용합니다. 빌드 도구는 이 파일을 라이브러리 모듈의 생성된 AAR 파일 내에 삽입합니다. 라이브러리를 앱 모듈에 추가하면 라이브러리의 ProGuard 파일이 앱 모듈의 ProGuard 구성 파일(proguard.txt)에 추가됩니다.

    라이브러리 모듈에 ProGuard 파일을 삽입하면 라이브러리에 종속된 앱 모듈이 라이브러리를 사용하도록 ProGuard 파일을 수동으로 업데이트할 필요가 없습니다. Android 스튜디오 빌드 시스템에서는 앱을 빌드할 때 앱 모듈과 라이브러리에서 모두 지시어를 사용합니다. 따라서 별도의 단계로 라이브러리에서 코드 축소기를 실행할 필요가 없습니다.

    라이브러리 프로젝트에 ProGuard 규칙을 추가하려면 라이브러리 build.gradle 또는 build.gradle.kts 파일의 defaultConfig 블록 내에서 consumerProguardFiles 속성이 포함된 파일의 이름을 지정합니다.

    예를 들어 다음 스니펫에서는 라이브러리의 ProGuard 구성 파일로 lib-proguard-rules.txt를 설정합니다.

    Groovy

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }

    Kotlin

    android {
        defaultConfig {
            consumerProguardFiles("lib-proguard-rules.txt")
        }
        ...
    }

    하지만 라이브러리 모듈이 APK로 컴파일되고 AAR을 생성하지 않는 다중 모듈 빌드에 포함된 경우 라이브러리를 사용하는 앱 모듈에서만 코드 축소를 실행합니다. ProGuard 규칙 및 사용법을 자세히 알아보려면 앱의 축소, 난독화, 최적화를 참고하세요.

  • 라이브러리 모듈 테스트는 앱 테스트와 동일합니다.

    가장 큰 차이는 라이브러리와 종속 항목이 자동으로 테스트 APK의 종속 항목으로 포함된다는 것입니다. 즉, 테스트 APK에는 자체 코드뿐 아니라 라이브러리의 AAR과 모든 종속 항목이 포함되어 있습니다. 테스트 중인 별도의 앱이 없으므로 androidTest 작업은 테스트 APK만 설치(및 제거)합니다.

    여러 매니페스트 파일을 병합하면 Gradle에서 기본 우선순위에 따라 라이브러리의 매니페스트를 테스트 APK의 기본 매니페스트에 병합합니다.

AAR 파일 분석

AAR 파일의 확장자는 .aar이고 Maven 아티팩트 유형도 aar입니다. 파일 자체는 ZIP 파일입니다. 유일한 필수 항목은 /AndroidManifest.xml입니다.

AAR 파일에는 다음과 같은 선택 항목이 하나 이상 포함될 수도 있습니다.