게시 변형 구성

게시 변형을 사용하면 사용자를 위해 보다 맞춤설정된 환경을 만들 수 있습니다. 게시 변형을 구성하면 각각 고유한 속성을 가진 다양한 빌드 변형을 게시할 수 있습니다.

라이브러리의 여러 빌드 변형을 게시하면 사용자가 자신의 필요에 맞는 적절한 기능을 선택할 수 있게 됩니다. 예를 들어, 디버그 또는 출시 빌드 유형에 따라 서로 다른 아티팩트를 게시할 수 있습니다. 디버그 게시 아티팩트에는 추가 로깅 코드와 이 추가 로깅을 사용 설정하는 다른 종속 항목이 포함될 수 있습니다.

계속하기 전에 출시용 라이브러리를 준비해야 합니다.

Gradle 모듈 메타데이터 사용

라이브러리 변형을 게시하려면 Gradle 모듈 메타데이터(GMM)를 사용해야 합니다. GMM은 게시를 설명하고 변형 인식 종속 항목 관리를 유지합니다. GMM은 기본적으로 라이브러리와 함께 게시됩니다.

GMM 사용에 따르는 이점은 다음과 같습니다.

  • Gradle 6.0 이상에서 GMM을 사용하는 경우 각각 고유한 속성과 종속 항목이 있는 여러 게시 변형 또는 여러 아티팩트를 게시할 수 있습니다. GMM 대신 Maven의 POM 파일을 사용하는 경우 하나의 아티팩트만 게시할 수 있습니다. POM 파일을 사용하는 경우 분류기를 사용하여 추가 아티팩트를 게시할 수 있지만, 추가 아티팩트는 자체 종속 항목을 가질 수 없습니다.
  • Gradle은 각각 고유한 종속 항목을 가진 컴파일용 변형과 런타임용 변형을 자동으로 만듭니다. 소비자가 라이브러리를 사용하는 시점에 따라 선택할 수 있도록 컴파일용 변형과 런타임용 변형을 따로 게시할 수도 있습니다. GMM을 사용하면 소비자는 게시된 라이브러리의 api, implementation 또는 compileOnly/runtimeOnly 사용에 따라 컴파일과 런타임의 다양한 종속 항목을 볼 수 있습니다. 전체 종속 항목 목록은 종속 항목 구성을 참고하세요. 이 방법은 단일 게시 변형을 게시한 경우에도 사용할 수 있습니다.
  • 테스트 픽스처를 사용하는 경우 소비자가 변형을 선택할 수 있게 해주는 특수 메타데이터 또는 기능을 사용하여 추가 변형을 게시할 수 있습니다. 이 방법은 단일 게시 변형을 게시한 경우에도 사용할 수 있습니다.

게시 변형 이해

게시 변형의 작동 방식을 이해하려면 Gradle의 기본 게시 단계를 숙지하는 것이 좋습니다. 다음은 몇 가지 게시 관련 주요 개념입니다.

  • 빌드 변형: Gradle이 라이브러리를 빌드하는 데 사용하는 구성. 빌드 유형과 제품 버전의 크로스 프로덕트입니다. 자세한 내용은 Android 빌드 용어집을 참고하세요.
  • 아티팩트: 빌드에서 생성되는 파일 또는 디렉터리. 라이브러리 게시 상황에서 아티팩트는 일반적으로 JAR 또는 AAR 파일입니다.
  • 게시 변형: 관련 속성, 기능, 종속 항목이 있는 아티팩트. Gradle에서는 게시 변형을 변형이라고 합니다. 그러나 이 문서에서는 빌드 변형과 구별하기 위해 게시 변형이라고 부릅니다.
  • 속성: Gradle은 여러 옵션이 있는 경우 게시 변형을 식별하고 선택하기 위해 속성을 사용합니다. 예를 들어, org.gradle.usage=java-apiorg.gradle.jvm.version=11은 변형 속성입니다.
  • 소프트웨어 구성요소: 하나 이상의 게시 변형을 보유할 수 있고 단일한 Maven 좌표 집합(groupdId:artifactId:version)에 게시되는 Gradle 객체. Project.getComponents()를 통해 Gradle의 DSL에 노출됩니다.
  • 게시: 저장소에 게시되어 소비자가 사용하는 항목. 게시는 하나의 소프트웨어 구성요소와 메타데이터로 구성됩니다. ID(groupId:artifactId:version)를 예로 들 수 있습니다.

Android Gradle 플러그인(AGP) 7.1에는 게시 중 사용되는 빌드 변형과 무시되는 빌드 변형을 제어하는 도메인별 언어(DSL)가 도입되었습니다. DSL을 사용하면 다음 중 하나가 포함된 SoftwareComponent 인스턴스를 만들 수 있습니다.

  • 하나의 빌드 변형에서 파생되는 하나의 게시 변형
  • 여러 빌드 변형에서 파생되는 여러 게시 변형

여러 게시 변형이 있는 소프트웨어 구성요소를 만들 때 AGP는 소비자가 필요에 따라 적절한 변형을 선택할 수 있도록 각 변형에 속성을 설정합니다. 이러한 속성은 빌드 변형을 만드는 데 사용된 빌드 유형과 버전에서 직접 가져옵니다. 단일 게시 변형으로 구성요소를 만드는 경우에는 구별할 필요가 없으므로 속성이 필요하지 않습니다.

단일 게시 변형이 있는 소프트웨어 구성요소 만들기

다음 스니펫은 release 빌드 변형에서 생성된 단일 게시 변형으로 소프트웨어 구성요소를 구성하고 JAR 소스를 보조 아티팩트로 추가합니다.

Kotlin

android {
  publishing {
    singleVariant("release") {
        withSourcesJar()
    }
  }
}

Groovy

android {
  publishing {
    singleVariant('release') {
        withSourcesJar()
    }
  }
}

각각 단일 게시 변형이 있는 여러 구성요소를 만들어 서로 다른 Maven 좌표에 배포할 수 있습니다. 이 경우 속성은 게시 변형에 설정되지 않습니다. 게시 메타데이터를 살펴보아서는 이 게시 변형이 release 빌드 변형에서 비롯된 것인지 알 수 없습니다. 관련된 게시 변형이 하나만 있으므로 명확성을 유지할 필요가 없습니다.

여러 게시 변형이 있는 소프트웨어 구성요소 만들기

빌드 변형을 전부 또는 일부만 선택하여 단일 소프트웨어 구성요소에 포함할 수 있습니다. AGP는 빌드 유형 이름, 제품 버전 이름, 제품 버전 차원 이름을 자동으로 사용하여 속성을 만들므로 소비 프로젝트가 빌드 변형을 구별할 수 있습니다.

단일 구성요소에 모든 빌드 변형을 게시하려면 모듈 수준 build.gradle 파일의 multipleVariants{} 블록에 allVariants()를 지정하세요.

Kotlin

android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}

Groovy

android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}

그러면 default라는 단일 구성요소가 생성됩니다. 구성요소의 이름을 별도로 지정하려면 multipleVariants({name})을 사용하세요. 이 경우에는 모든 빌드 유형과 제품 버전 차원이 속성으로 사용됩니다.

includeBuildTypeValues()includeFlavorDimensionAndValues()를 사용하여 게시할 변형을 선택할 수도 있습니다.

Kotlin

android {
  publishing {
    multipleVariants("custom") {
      includeBuildTypeValues("debug", "release")
      includeFlavorDimensionAndValues(
        dimension = "color",
        values = arrayOf("blue", "pink")
      )
        includeFlavorDimensionAndValues(
          dimension = "shape",
          values = arrayOf("square")
      )
    }
  }
}

Groovy

android {
  publishing {
    multipleVariants('custom') {
      includeBuildTypeValues('debug', 'release')
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'color',
        /*values =*/ 'blue', 'pink'
      )
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'shape',
        /*values =*/ 'square'
      )
    }
  }
}

이 예에서 맞춤 구성요소에는 빌드 유형(debug, release)의 모든 조합, color 차원의 (blue, pink), shape 차원의 (square)가 포함됩니다.

한 차원에서 하나의 값만 게시하더라도 모든 버전 차원이 나열되어야 하므로 AGP는 모든 차원에 사용할 값을 알 수 있습니다.

다음 표에는 결과로 생성된 게시 변형과 관련 속성이 나와 있습니다.

변형 속성
blueSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug" com.android.build.api.attributes.ProductFlavorAttr:color="blue"
blueSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="blue"
pinkSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"
pinkSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"

실제로는 더 많은 변형이 게시됩니다. 예를 들어, 위의 각 변형은 선언된 종속 항목이 implementation을 사용하는지 api를 사용하는지에 따른 다양한 종속 항목과 org.gradle.Usage 속성의 다양한 값을 사용하여 컴파일용과 런타임용으로 각각 한 번씩 두 번 게시됩니다. 그러나 이 두 변형의 아티팩트(AAR 파일)는 동일합니다.

자세한 내용은 publishing API 문서를 참고하세요.

여러 버전 라이브러리 게시를 위한 호환성 문제

AGP 7.0 이하를 사용하는 프로젝트는 AGP 7.1 이상으로 게시된 여러 버전의 라이브러리를 사용할 수 없습니다. 이는 AGP 7.1에서 제품 버전 차원의 속성 이름이 dimensionName에서 com.android.build.api.attributes.ProductFlavor:dimensionName로 변경되어 알려진 문제입니다. 프로젝트 설정에 따라 이전 변형 API에서 missingDimensionStrategy를 사용하여 이 문제를 해결할 수 있습니다.

예를 들어 애플리케이션 프로젝트에 버전 제품 버전 차원만 있다고 가정해 보겠습니다.

Kotlin

android {
    applicationVariants.forEach { variant ->
        val flavor = variant.productFlavors[0].name
        val attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        val dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}

Groovy

android {
    applicationVariants.forEach { variant ->
        def flavor = variant.getProductFlavors()[0].name
        def attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        def dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}