기기 등급 타겟팅

기기 등급 타겟팅이란

기기 등급 타겟팅을 사용하면 하드웨어에 따라 다양한 버전(예: 해상도)의 동일한 애셋을 기기에 전송할 수 있습니다. 예를 들어 사용자 기기에 필요한 애셋만 전송함으로써 전반적인 게임 크기를 늘리지 않고도 하위급 기기에 저해상도 애셋을 전송하여 성능을 향상하고 고급형 기기에 고해상도 애셋을 전송하여 그래픽 품질을 개선하도록 선택할 수 있습니다. 기기 등급 타겟팅은 Play Asset Delivery의 애셋 팩 개념을 기반으로 합니다. 아래에서 볼 수 있듯이 등급 기준(현재는 RAM, 특정 기기 모델, 사용 가능한 시스템 기능을 기반으로 함)을 정의하고 최대 5개 등급을 사용할 수 있습니다.

기기 등급 타겟팅은 Play Asset Delivery와 마찬가지로 API 16(Jelly Bean 4.1) 이상을 지원하지만, API 19(KitKat 4.4.X) 이하의 기기에서는 기기 빌드와 상관없이 기본 등급이 제공됩니다.

개발자의 여정

기존 게임에 DTT를 통합하려면 개략적으로 다음 단계를 따라야 합니다.

  1. 기기 등급 타겟팅(그리고 더 나아가 Play Asset Delivery)을 게임 내에 통합합니다.
    • Play Asset Delivery를 게임에 통합합니다(아직 하지 않은 경우).
    • 애셋을 애셋 팩으로 나눕니다.
    • 코드와 애셋을 패키지로 묶어 Play에 업로드할 최종 Android App Bundle 아티팩트를 만듭니다.
  2. Play가 사용자 기기에 애셋이 전송되는 방식을 알 수 있도록 기기 등급 타겟팅 구성을 만듭니다.
    • DTT 구성을 Play에 전송하는 데 사용할 Google Play Developer API를 설정합니다(아직 완료하지 않은 경우).
    • 단계에 따라 DTT 구성을 만듭니다.
  3. AAB를 Play에 업로드하고 모든 것이 올바르게 구성되었는지 테스트합니다.

첫 번째 섹션에서는 사용하는 빌드 시스템에 따라 가이드에 포크가 있습니다. 사용 중인 엔진과 기존 설정에 따라 선택하는 시스템이 달라집니다.

  • Gradle(자바 및 네이티브 게임에 권장됨): Gradle을 사용하여 빌드한 게임의 경우 다음 단계에 따라 DTT 지원으로 AAB를 빌드하도록 빌드 시스템을 구성합니다.
    • 게임을 Gradle로 내보낸 다음 Gradle에서 빌드를 완료하는 경우에는 여기 나와 있는 안내를 따르세요(예: Gradle로 내보낸 Unity 게임).
  • Unity 플러그인: Unity 프로젝트로 가져올 Unity 패키지가 제공되며, 이 패키지를 사용하여 DTT 지원으로 AAB를 구성하고 빌드할 수 있습니다.

앱 내에서 기기 등급 타겟팅 설정

게임에 Play Asset Delivery 통합(아직 완료하지 않은 경우)

PAD(Play Asset Delivery)를 사용하면 설치 시 또는 런타임 시에 게임의 애셋을 동적으로 전송할 수 있습니다. 여기에서 개요를 확인할 수 있습니다. 기기 등급 타겟팅을 사용하면 여러 등급의 기기에 맞춰 지정하는 기기 등급 구성을 기반으로 Play에서 애셋 팩을 전송합니다. 아래 안내에 따라 PAD를 게임에 통합(예: 애셋 팩 만들기, 게임에서 검색 구현)한 다음 기기 등급 타겟팅을 사용하도록 프로젝트 코드를 수정하는 것이 좋습니다.

Gradle

Gradle을 사용하여 빌드한 게임의 경우 다음 안내에 따라 Gradle을 사용하여 애셋 팩을 빌드한 후에 안내에 따라 게임 내에서 애셋 팩 검색을 통합하세요.

Unity

Unity에서 빌드한 게임의 경우 이 안내에 설명된 대로 AssetPackConfig 클래스를 사용하여 애셋 팩을 구성합니다.

기기 등급별 디렉터리 만들기

Gradle을 사용하는 경우

이제 나중에 정의할 N개 등급(최대 5개)으로 애셋을 분할합니다. 마지막 단계에서 만든 기존 애셋 번들 디렉터리를 사용하고 적절한 폴더(아래 설명 참고)에 #tier_0, #tier_1, #tier_2 등의 접미사를 붙여 DTT 디렉터리를 만듭니다. 게임에 애셋 팩을 사용할 때는 접미사로 폴더를 처리할 필요가 없습니다(즉, 빌드 프로세스 중에 접미사가 자동으로 제거됨).

이전 단계를 완료하면 다음과 같을 수 있습니다.

...
.../level1/src/main/assets/character-textures#tier_2/
.../level1/src/main/assets/character-textures#tier_1/
.../level1/src/main/assets/character-textures#tier_0/
...

폴더 아래의 파일에 액세스하면 동일한 경로를 접미사 처리 없이 사용할 수 있습니다(이 예에서는 접미사 없는 level1/assets/character-textures/로 함).

Unity를 사용하는 경우

DTT를 사용하는 애셋 팩을 추가하려면 다음 AssetPackConfig 메서드를 사용하면 됩니다.

/// Package the specified raw assets in the specified folders,
/// keyed by DeviceTier, in an AssetPack with the specified delivery mode.
public void AddAssetsFolders(
    string assetPackName,
    IDictionary<DeviceTier, string> deviceTierToAssetPackDirectoryPath,
    AssetPackDeliveryMode deliveryMode)

/// Package the specified AssetBundle files, which vary only by DeviceTier,
/// in an AssetPack with the specified delivery mode.
public void AddAssetBundles(
    IDictionary<DeviceTier, string> deviceTierToAssetBundleFilePath,
    AssetPackDeliveryMode deliveryMode)

예를 들어 다양한 세부정보 수준에서 캐릭터의 AssetBundles가 세 개 있다고 가정하겠습니다.

이러한 AssetBundles와 상응하는 기기 등급을 매핑하려면 다음 스니펫을 사용합니다.

var assetPackConfig = new AssetPackConfig();
var tiers = new Dictionary<DeviceTier, string>
{
    {0, "Assets/LowPoly/Character"},
    {1, "Assets/Mid/Character"},
    {2, "Assets/Detailed/Character"}
};
assetPackConfig.AddAssetBundles(tiers, AssetPackDeliveryMode.OnDemand);

Android App Bundle 빌드

Gradle

프로젝트의 build.gradle 파일에서 Android Gradle 플러그인bundletool에 아래 버전(이상)을 사용하도록 종속 항목을 구성합니다.

buildscript {
  dependencies {
    classpath 'com.android.tools.build:gradle:4.2.0'
    classpath "com.android.tools.build:bundletool:1.7.1"
    ...
  }
  ...
}

또한 Gradle 버전을 6.7.1 이상으로 업데이트해야 합니다. 프로젝트 내의 gradle/wrapper/gradle-wrapper.properties에서 업데이트할 수 있습니다.

distributionUrl=https://services.gradle.org/distributions/gradle-6.7.1-all.zip

마지막으로 Google Play Core 라이브러리를 1.8.3 이상으로 업데이트해야 합니다. 가능하면 최신 버전으로 업데이트하는 것이 좋습니다.

dependencies {
  implementation 'com.google.android.play:core:1.10.0'
  ...
}

기본 앱 모듈의 build.gradle 파일에서 DTT 분할을 사용 설정합니다.

android {
  bundle {
    deviceTier {
      enableSplit true
    }
    ...
  }
  ...
}

마지막으로 AAB(Android App Bundle)를 빌드할 수 있습니다.

bundletool

bundletool을 사용하여 번들을 빌드하고 AAB를 맞춤설정하는 단계에서 BundleConfig.pb 파일에 다음을 추가합니다.

{
  "value": "DEVICE_TIER",
  "negate": false,
  "suffixStripping": {
    "enabled": true,
  }
}

Unity

DTT 팩을 포함하도록 AssetPackConfig를 구성한 후에는 이 구성을 아래 메서드 중 하나에 전달하여 AAB를 빌드할 수 있습니다.

// Configures the build system to use the newly created assetPackConfig when
// calling Google > Build and Run or Google > Build Android App
Bundle.AssetPackConfigSerializer.SaveConfig(assetPackConfig);
// Alternatively, use BundleTool.BuildBundle to build an App Bundle from script
BuildBundle(new buildPlayerOptions(), assetPackConfig)

로컬 테스트

계속하기 전에 App Bundle을 로컬에서 테스트하여 모든 것이 올바르게 설정되었는지 확인하는 것이 좋습니다. bundletool(1.8.0 이상)을 사용하여 로컬로 앱을 빌드하고 테스트하면서 올바른 기기 등급을 명시적으로 지정합니다. 먼저 build-apks를 사용하여 .apks 파일 집합을 생성한 다음 install-apks를 사용하여 연결된 기기에 앱을 배포합니다. 기기 등급 플래그를 통해 설치할 등급을 지정할 수도 있습니다. 이 로컬 테스트 방법에 관한 자세한 내용은 여기에서 확인할 수 있습니다(이 페이지는 DTT용으로 아직 업데이트되지 않았으므로 device-tier 플래그가 없음).

bundletool build-apks --bundle=/path/to/app.aab --output=/path/to/app.apks --local-testingbundletool install-apks --apks=/path/to/app.apks --device-tier=1

다른 방법도 있습니다. 즉, extract-apks를 사용하여 특정 기기의 APK 세트를 추출할 수 있습니다. 하지만 이 기기의 기기 등급을 지정하는 것과 함께 get-device-spec을 사용하면 --local-testing 플래그와 함께 작동하지 않습니다. 즉, 빠른 추적 또는 주문형 애셋 팩을 테스트할 수 없습니다.

bundletool get-device-spec --output=/path/to/device-spec.json --device-tier=1bundletool extract-apks --apks=/path/to/existing_APK_set.apks --output-dir=/path/to/device_specific_APK_set.apks --device-spec=/path/to/device-spec.json

Unity

Google -> Build and Run 메뉴 옵션을 사용하면 --local-testing 플래그를 사용 설정한 상태로 게임을 빌드하고 실행합니다. 하지만 install-apks 명령어에 전달된 기기 등급은 지정할 수 없습니다.

0이 아닌 기기 등급을 지정하려면 다음과 같이 합니다.

  1. Google -> Build Android App Bundle 메뉴 옵션을 사용하여 AAB를 빌드합니다.
  2. 빌드된 AAB에서 이전 섹션의 안내에 따라 bundletool, build-apks, install-apks를 실행합니다.

Google Play Developer API를 통해 기기 등급 구성 만들기

Google Play Developer API 시작하기(아직 완료하지 않은 경우)

기기 등급 타겟팅을 구성하려면(즉, 각 등급의 요구사항 정의) Android 게시자 API를 사용하여 구성을 Google Play에 업로드해야 합니다. 위 링크에서 API에 관해 자세히 알아볼 수 있습니다. 몇 가지 단계에 따라 시작할 수 있도록 안내합니다.

  1. API 프로젝트를 만들고(필요한 경우) Google Play Console에 연결합니다.
  2. API 액세스 클라이언트를 설정합니다.

API 참조는 여기에서 확인할 수 있으며 나중에 API를 통해 빌드를 업로드하기로 하는 경우 Edits 메서드를 사용합니다. 또한 API를 사용하기 전에 이 페이지를 검토하는 것이 좋습니다.

Device Tier Configuration API 사용

다음 API 호출을 사용하여 기기 등급 구성을 만들 수 있습니다.

기기 등급 구성 만들기

HTTP 요청 POST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs
경로 매개변수 해당 사항 없음
요청 본문 기기 등급 구성
응답 본문 기기 등급 구성
기기 등급 구성 객체

기기 등급의 정의는 다음 두 단계로 구성됩니다.

  1. 기기 그룹 집합을 정의합니다.
  2. 기기 그룹에 수준을 할당하여 기기 등급 집합을 정의합니다.

기기 그룹은 구성에서 정의한 선택기와 일치하는 기기의 집합입니다.

선택기는 기기 RAM 및 기기 모델에 관한 요구사항을 정의할 수 있습니다.

선택하는 이름으로 그룹을 식별하며, 그룹은 중복될 수 있습니다.

다음으로, 그룹의 순위를 지정하여 기기 등급 집합을 정의할 수 있습니다. 각 기기 등급은 수준과 기기 그룹으로 정의됩니다.

기기가 여러 등급과 일치하는 경우 일치하는 가장 높은 등급의 콘텐츠가 제공됩니다.

  {
    device_groups: [
      {
        name: string,
        device_selectors: [
          {
            device_ram: {
              min_bytes: integer
              max_bytes: integer
            },
            included_device_ids: [
              {
                build_brand: string,
                build_device: string
              }
            ],
            excluded_device_ids: [
              {
                build_brand: string,
                build_device: string
              }
            ],
            required_system_features: [
              {
                name: string
              }
            ],
            forbidden_system_features: [
              {
                name: string
              }
            ]
          }
        ]
      }
    ],
    device_tier_set: {
      device_tiers: [
        {
          level: int,
          device_group_names: [string]
        }
      ]
    }
  }

필드:

  • device_confid_id(정수): 이 기기 등급 구성에 해당하는 ID
  • device_groups(객체): 그룹 정의

    • name(문자열): 기기 그룹의 이름(정의한 문자열 ID)
    • device_selectors(객체): 기기가 이 그룹에 속하려면 필요한 기기 요구사항
    • device_ram(객체): 기기 RAM 요구사항
      • min_bytes(정수, 포함): 필요한 최소 RAM(바이트)
      • max_bytes(정수, 제외): 필요한 최대 RAM(바이트)
    • included_device_ids(객체): 이 선택기에 포함할 기기 모델(그룹당 최대 100개 device_ids). 선택기와 일치하는 기기가 이 목록에 포함되어야 합니다. 전체 선택기와 일치하기 위한 필요조건이지만 충분조건은 아닙니다(선택기의 요구사항 결합에 관한 위의 참고 사항 확인).
      • build_brand(문자열): 기기 제조업체
      • build_device(문자열): 기기 모델 코드
    • excluded_device_ids(객체): 이 선택기에서 제외할 기기 모델(그룹당 최대 100개 device_ids). 이 목록의 기기는 선택기의 다른 모든 요구사항과 일치하더라도 선택기와 일치하지 않습니다.
      • build_brand(문자열): 기기 제조업체
      • build_device(문자열): 기기 모델 코드
    • required_system_features(객체): 이 선택기가 기기에 포함해야 할 기능(그룹당 최대 100개 기능). 이 목록에 선택기와 일치하는 모든 시스템 기능이 기기에 있어야 합니다. 전체 선택기와 일치하기 위한 필요조건이지만 충분조건은 아닙니다(선택기의 요구사항 결합에 관한 위의 참고 사항 확인).

      시스템 기능 참조

      • name(문자열): 시스템 기능
    • forbidden_system_features(객체): 이 선택기가 기기에 포함해서는 안되는 기능(그룹당 최대 100개 기능). 이 목록에 있는 시스템 기능이 기기에 없는 경우 기기는 선택기의 다른 모든 요구사항과 일치하더라도 선택기와 일치하지 않습니다.

      시스템 기능 참조

      • name(문자열): 시스템 기능
  • device_tiers(객체): 등급 정의

    • level(정수): 등급의 수준
    • group_name(문자열 배열): 이 등급에 속하는 기기 그룹의 이름

Google Play Console에서 기기 카탈로그를 사용하여 다음 중 한 가지 방법으로 기기 제조업체 및 모델 코드의 올바른 형식을 찾을 수 있습니다.

  • 기기 카탈로그를 사용하여 개별 기기를 검사하고 아래 예와 같은 위치에서 제조업체 및 모델 코드를 찾습니다(Google Pixel 4a의 경우 제조업체는 'Google'이고 모델 코드는 'sunfish').

    기기 카탈로그의 Pixel 4a 페이지

    기기 카탈로그의 Pixel 4a 페이지

  • 지원되는 기기의 CSV를 다운로드하고 build_brand 필드와 build_device 필드에 각각 제조업체모델 코드를 사용합니다.

다음은 3개 등급으로 구성된 예시입니다. 등급 2는 높음(7GB를 초과하고 Pixel 4인 모든 기기 포함) 기기 그룹을 사용하고, 등급 1은 보통(4~7GB 사이의 모든 기기 포함) 기기 그룹을 사용하며, 등급 0은 포괄 그룹으로 암시적으로 정의됩니다.

{
  device_groups: [
    {
      name: 'high',
      device_selectors: [
        {
          device_ram: {
            min_bytes: 7516192768
          },
        },
        {
          included_device_ids: [
            {
              build_brand: 'google',
              build_device: 'flame'
            }
          ],
        }
      ]
    },
    {
      name: 'medium',
      device_selectors: [
        {
          device_ram: {
            min_bytes: 4294967296,
            max_bytes: 7516192768
          },
        }
      ]
    }
  ],
  device_tier_set: {
    device_tiers: [
      {
        level: 1,
        device_group_names: [
          'medium'
        ]
      },
      {
        level: 2,
        device_group_names: [
          'high'
        ]
      }
    ]
  }
}

ID별로 기기 등급 구성 가져오기

다음 호출을 사용하여 ID별로 특정 기기 등급 구성을 검색할 수 있습니다.

HTTP 요청 GET https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs/{deviceTierConfigId}
경로 매개변수 해당 사항 없음
요청 본문 해당 사항 없음
응답 본문 기기 등급 구성

기기 등급 구성 목록 가져오기

다음 호출이 제공되는 경우 최근 10개의 기기 등급 구성을 가져올 수 있습니다(또는 최적으로 page_token 쿼리 매개변수를 사용하여 10개로 이루어진 세트를 지정함).

HTTP 요청 GET https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs
경로 매개변수 해당 사항 없음
쿼리 매개변수 page_token(선택사항) - DTC 10개로 이루어진 특정 그룹을 지정하는 데 사용됩니다. DTC를 10개 넘게 만들었으며 최신 10개 이전에 생성된 DTC를 확인하려는 경우 유용합니다.
요청 본문 해당 사항 없음
응답 본문 기기 등급 구성 목록

page_token

Google Play에 Android App Bundle 업로드

API 사용

Google Play Developer API를 사용하여 Android App Bundle을 Google Play에 업로드하고 특정 기기 등급 타겟팅 구성을 빌드에 연결할 수 있습니다.

여기에서 Edits 메서드의 일반 개요를 확인할 수 있습니다. 또한 Google Play Console에서 다른 트랙에 출시하는 방법을 보여주는 심도 있는 예시도 참고할 수 있습니다(최신 링크를 보려면 페이지의 목록이 나온 APK 친화적인 API 대신 AAB 친화적인 API 사용). 빌드의 기기 등급 구성을 지정하려면 edits.bundle.upload 메서드를 호출하는 동안 deviceTierConfigId 쿼리 매개변수에 구성 ID를 추가합니다. 다음과 같습니다.

https://androidpublisher.googleapis.com/upload/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles?deviceTierConfigId="{deviceTierConfigId}

Google Play Console 사용

여기에 나온 안내에 따라 Android App Bundle을 업로드할 수 있습니다. 최신 DTC 구성이 App Bundle에 적용됩니다.

(올바른 빌드 선택) App Bundle 탐색기 > 전송으로 이동한 후 각 애셋 팩을 클릭하여 번들이 올바르게 빌드되었는지 확인할 수 있습니다. 등급이 N개 생성되었음을 알 수 있습니다. 이 예에서는 애셋 팩 main_asset에 등급이 0, 1, 2 등 세 개가 있음을 보여줍니다.

세 개의 등급이 있는 애셋 팩

올바른 등급 전송 확인

다음 메서드를 사용하여 올바른 등급만 기기에 전송되도록 합니다.

adb shell pm path {packageName}

다음과 같이 표시됩니다.

package:{...}/base.apk
package:{...}/split_config.en.apk
package:{...}/split_config.xxhdpi.apk
package:{...}/split_main_asset.apk
package:{...}/split_main_asset.config.tier_2.apk

그리고 특정 기기 등급 타겟팅 구성을 빌드에 연결합니다.

추가사항

빠른 시작: curl 사용

다음은 새 기기 등급 구성 만들기(명령줄 도구 curl 사용)의 예와 Edits API를 사용하여 새 수정사항을 만들고, 새 AAB를 업로드하고(특정 기기 등급 구성과 연결), 트랙/출시 구성을 설정하고, 수정사항을 커밋하는(이에 따라 변경사항을 공개로 설정) 예입니다. 다음의 위치가 있어야 합니다.

먼저 기기 등급 구성을 만들고 호출 성공 시 수신되는 deviceTierConfigId를 기록해 둡니다.

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST -H "Content-Type: application/json" -d "{ device_groups: [ { name: 'high', device_selectors: [ { device_ram: { min_bytes: 7516192768 }, }, { included_device_ids: [ { build_brand: 'google', build_device: 'flame' } ], } ] }, { name: 'medium', device_selectors: [ { device_ram: { min_bytes: 4294967296, max_bytes: 7516192768 }, } ] } ], device_tier_set: { device_tiers: [ { level: 1, device_group_names: [ 'medium' ] }, { level: 2, device_group_names: [ 'high' ] } ] } }" https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/deviceTierConfigs

수정 시작 - 수정의 ID와 만료 시간이 표시됩니다. 다음 호출의 ID를 저장합니다.

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits

AAB를 업로드하고 기기 등급 구성을 쿼리 매개변수로 지정합니다. 호출이 성공하면 빌드의 버전 코드 sha1과 sha256이 표시됩니다. 다음 호출을 위해 버전 코드를 저장합니다.

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" --data-binary @$HOME/{aabFile} -H "Content-Type: application/octet-stream" -XPOST https://androidpublisher.googleapis.com/upload/androidpublisher/v3/applications/{packageName}/edits/{editID}/bundles?deviceTierConfigId="{dttConfigID}"

원하는 트랙에 AAB를 할당(테스트의 경우 내부 테스트 트랙을 사용하는 것이 좋지만 다양한 트랙에 관해 여기에서 자세히 알아보기), 이 과정에서는 출시 노트 없이 단순한 출시를 진행합니다. 하지만 단계적 출시, 임시 버전, 출시 노트 관련 방법을 자세히 알아보려면 이 페이지를 확인해 보세요. 게시자 API를 처음 사용하는 경우 임시 버전으로 만들어 Google Play Console에서 버전을 완료하여 모든 것이 올바르게 구성되었는지 확인하는 것이 좋습니다.

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPUT -H "Content-Type: application/json" -d "{ releases: [{status: '{status}'</code>, <code><strong>versionCodes</strong></code>: <code>['{versionCode}']</code> <code><strong>}]}</strong></code>" <code>https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits/{editID}/tracks/{track}

변경사항을 커밋합니다. Play에서 원하는 트랙에 모든 변경사항이 게시되므로 신중하게 진행하세요.

curl -H "$(oauth2l header --json $HOME/{apiKey} androidpublisher)" -XPOST https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/edits/{editID}:commit