Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

구성 APK용 빌드 설정

구성 APK용 빌드를 설정하여 각 사용자의 기기에서 앱의 APK 크기를 줄일 수 있습니다. 그러면 앱의 DEX 코드와 기기에 구속되지 않는 리소스가 특정 APK에 배치되고 기기에 따라 달라지는 네이티브 코드 및 리소스는 별도의 APK에 배치됩니다. 그러면 기기는 앱을 실행하는 데 필요한 APK만 요청하게 됩니다. 따라서 개발자는 특정 화면 밀도, ABI 및 언어 관련 파일이 포함된 APK를 만들어 앱의 다운로드 크기를 줄일 수 있습니다.

구성 APK는 다중 APK와 비슷하지만 다음과 같은 중요 차이점이 몇 가지 있습니다.

  • 현재 다중 APK는 설치된 앱에만 사용할 수 있고 구성 APK는 인스턴트 앱에만 사용할 수 있습니다.
  • 다중 APK는 각 속성 조합에 하나의 APK가 빌드됩니다. 구성 APK는 기기 독립형 DEX 코드가 포함된 기본 APK가 1개 있고 각 가변 차원의 각 값에 APK가 1개 있습니다(지원되는 언어, 밀도 또는 ABI 1개당 APK가 1개씩 있음). 4가지 밀도와 3가지 언어를 지원하되 밀도와 언어에 따라 변화를 주는 앱을 예로 들어 보겠습니다. 다중 APK라면 개발자가 3 * 4 = 12개의 APK를 업로드할 것입니다. 구성 APK라면 1(기본) + 3 + 4 = 8개의 APK를 업로드할 것입니다. 다중 APK에서는 어느 기기든 간에 정확히 1개의 APK가 전송됩니다. 구성 APK에서는 기기가 기본 APK뿐 아니라 지원되는 각 차원(현재는 언어, 밀도, ABI)에 있는 한 개 이상의 리소스 APK를 수신할 가능성이 있습니다.
  • 다중 APK에서는 특정 기기의 다중 호환 APK 중에서 선택할 때 버전 코드를 사용합니다. 구성 APK에서는 개발자 지정 순서를 사용하지 않습니다. 순서는 사용 가능한 APK의 타겟팅에 따라 결정됩니다.
  • 구성 APK에서는 새로운 타겟팅 차원인 language를 지원합니다. 다중 APK에서는 이를 지원하지 않습니다.

기본 요건

구성 APK용 빌드를 설정하기 전에 다음 단계를 검토하여 빌드가 준비되었는지 확인하고 Android 스튜디오에서 필요한 도구 구성을 갖추었는지 확인하세요.

  • 인스턴트 앱 모듈의 최소 SDK 버전을 21 이상으로 설정
  • Android 스튜디오 3.0 이상 사용

구성 APK용 빌드 설정

언어에 근거하여 구성 APK용 빌드를 설정하려면 언어 블록을 기능 모듈의 splits 블록에 추가하고 android 블록에서 generatePureSplits = true를 지정하세요. splits 블록 구성에 관한 자세한 내용은 다중 APK용 빌드 구성을 참조하세요.

android {
  ...
  generatePureSplits = true
  splits {
    abi {
      enable = true
    }
    density {
      enable = true
    }
    language {
      enable = true
      include "es-rMX", "zh", "en"
    }
  }
}

언어 값은 대체 리소스 제공에 설명된 형식으로 되어 있습니다.

구성 APK 제공

다중 APK를 사용할 때와 달리 개발자는 여러 개의 동등한 구성 APK에 순서를 정의하지 않습니다. 그렇다면 Play에서는 어떤 APK를 제공할지 어떻게 결정할까요?

ABI에서 Play는 모든 기기에 동일한 고정 순서를 사용하여 호환되는 APK 중에서 선택합니다. 즉, x86_64, x86, mips64, mips, arm64-v8a, armeabi-v7a, armeabi 순입니다. 예를 들어 기기에서 x86armeabi-v7a를 모두 지원하고 양쪽에 APK를 사용할 수 있다면 기본 APK와 함께 x86 APK가 제공됩니다.

밀도에서 Play는 사용 가능한 APK 중에서 기기의 밀도에 가장 근접한 APK를 선택합니다.

언어에 따라 APK를 선택하는 것은 더 복잡합니다.

언어 타겟팅과 관련해 특별히 고려할 사항

Play는 사용자의 언어와 정확히 일치되려 한다고 기대할 수 있습니다. 언어가 en-GB라면 가능한 경우 en-GB에 타겟팅된 APK를 제공하고 불가능한 경우에는 en으로 돌아갈 것입니다. 이러한 접근 방식에는 다음 두 가지 문제가 있습니다.

  1. strings.xml 파일과 마찬가지로, 구성 APK에도 모든 문자열의 번역이 포함되어야 한다는 요구사항이 없습니다. 하나의 문자열 또는 몇 개의 문자열에 언어를 추가하는 것은 허용되며 일반적인 일이기도 합니다. 예를 들어 en/strings.xml에는 'car', 'truck'이 포함되어 있고, en-rGB/strings.xml에는 'lorry'가 포함되어 있을 수 있습니다. 따라서 모든 기기의 필수 번역 집합이 여러 strings.xml 파일에 있는 것과 마찬가지로 이러한 파일은 여러 구성 APK에 포함될 수 있습니다.
  2. Android 기기에는 매우 다양한 대체 그래프가 있습니다. Android 출시에서는 대체 그래프를 변경할 수 있습니다(관련 예시는 언어 및 로케일 가이드 참조). 또한 OEM에서는 대체 순서를 맞춤설정합니다. 예를 들어 “zh”“zh-TW”“zh-CN” 중 어느 것을 선호하는지는 OEM에 달려 있습니다. 요청 기기에서 어떤 대체 순서를 사용하는지 Play가 항상 알고 있는 것은 아닙니다.

Play에서는 문제를 해결하기 위해 언어 하위 태그가 사용자가 선택한 언어와 일치하는 언어로 타겟팅된 모든 구성 APK를 제공합니다. 이는 대체 알고리즘이 일반적으로 언어 전환을 하지 않는다는 관찰에 의존합니다. 다음 예를 참조하세요.

사용자의 언어는 de-CH입니다.
사용 가능한 APK는 de, de-CH, de-AT, fr입니다.
Play에서는 de, de-CH, de-AT는 제공하고 fr은 제공하지 않습니다.

Play는 fil/tag와 같은 언어 하위 태그가 일치하지 않아도 언어를 그룹화해야 하는 잘 알려진 특정 사례도 처리합니다.

그룹화 작업은 제공 시점에 Play에서 처리하며 개발자가 해야 할 작업은 없습니다.

문제해결 및 자주 묻는 질문(FAQ)

  • Gradle에서 구성 APK를 생성하지 않고 대신 다음 메시지를 출력했습니다.
    Variant ..., MinSdkVersion 18 is too low (<21) to support pure splits,
    reverting to full APKs
    

    인스턴트 앱 모듈의 build.gradle 파일에 minSdkVersion = 21을 지정합니다.

  • Gradle 플러그인에서는 다음 메시지를 출력합니다.
    > Configure project :base
    Pure splits are not supported by PlayStore yet.
    

    이것은 알려진 문제입니다. 이 메시지를 무시하세요.

  • 구성 APK는 4MB 제한에 어떤 영향을 미치나요?

    기능 크기는 기능 APK 크기, 기본 기능 APK 크기, 기기에 전송 가능한 최대 구성 APK 집합을 더하여 계산합니다. 예를 들어 기능이 기본 APK에 3개의 언어 APK, 기본에 2개의 밀도 APK, 기능 APK에 2개의 밀도 APK가 있다면 기능의 최종 크기는 기능 APK 크기, 기본 APK 크기, 기본의 최대 언어 및 최대 밀도 APK, 기능의 최대 밀도 APK를 더하여 산출됩니다.

알려진 문제

  • Gradle에서 일부 증분 빌드용 ABI APK를 빌드하지 못합니다(https://issuetracker.google.com/69680755). 이 문제는 삭제하고 다시 빌드하는 방법으로 해결할 수 있습니다.
  • 현재는 빌드 도구로 다차원 구성 APK를 만들 수 없습니다. 예를 들어 프로젝트는 프랑스어로 설정된 xhdpi 기기의 res/drawable-fr-xhdpi에 리소스를 포함할 수 있지만 Gradle은 이러한 리소스를 구성 APK에 배치할 수 없습니다. 이러한 리소스는 기본 APK 또는 기능 APK에 배치됩니다.