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

기존 게임을 인스턴트 게임으로 변환

첫 번째 인스턴트 앱 만들기에서 설명한 대로 Google Play 인스턴트에서 실행할 앱을 설정하는 단계는 게임에도 적용됩니다. 이 가이드에서는 게임과 관련된 설정 단계를 강조합니다.

Unity(Google Play 인스턴트 Unity 플러그인의 보유 여부와 상관없음) 또는 Cocos2D, Android 스튜디오, 자체 맞춤 엔진을 사용하여 Google Play 인스턴트용 게임을 개발할 수 있습니다.

이 가이드에서는 개발자가 제공하려는 게임 환경의 종류를 이미 알고 있다고 가정합니다. 고품질 게임을 만들기 위한 아이디어와 권장사항을 보려면 Google Play 인스턴트 게임의 UX 권장사항을 읽어보세요.

또한, Google Play 인스턴트에서 실행할 수 있는 게임을 게시하기 전에 기술 요구사항 체크리스트를 검토해야 합니다.

다음 인텐트 필터를 포함하는 활동은 Google Play 인스턴트 환경의 진입점이 됩니다.

<activity android:name=".GameActivity">
   <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
</activity>

이 활동은 사용자가 Play 스토어의 지금 사용해 보기 버튼 또는 Google Play 게임 앱의 인스턴트 플레이 버튼을 탭하면 실행됩니다. 딥 링크 API를 사용하여 이 활동을 직접 실행할 수도 있습니다.

올바른 버전 코드 정의

게임의 인스턴트 환경 버전 코드는 게임의 설치 버전의 버전 코드보다 낮아야 합니다. 앱 버전을 이 방식으로 관리하면 플레이어가 Google Play 인스턴트 환경을 벗어나 기기에 게임을 다운로드하고 설치할 수 있게 됩니다. Android 프레임워크는 이러한 전환을 앱 업데이트로 간주합니다.

권장되는 버전 관리 체계를 따르려면 다음 전략 중 하나를 사용하세요.

  • Google Play 인스턴트 환경의 버전 코드를 1에서 다시 시작합니다.
  • 설치할 수 있는 APK의 버전 코드를 1,000과 같은 큰 수로 늘려 인스턴트 환경의 버전 번호가 올라가기 위한 충분한 공간을 확보하도록 합니다.

인스턴트 게임과 설치 가능한 게임을 별개의 Android 스튜디오 프로젝트 두 개로 개발해도 괜찮습니다. 하지만, 그럴 경우에는 다음 작업을 진행하여 Google Play에서 게임을 게시해야 합니다.

  1. 두 Android 스튜디오 프로젝트에 동일한 패키지 이름을 사용합니다.
  2. Google Play Console에서 두 변형을 동일한 애플리케이션에 업로드합니다.

게임의 버전 설정에 관한 자세한 내용은 앱 버전 지정을 참조하세요.

실행 환경 지원

다른 앱과 마찬가지로 Google Play 인스턴트의 게임도 기기의 제한된 샌드박스 내에서 실행됩니다. 이 실행 환경을 지원하려면 다음 섹션에 나와 있는 단계를 완료하세요.

일반 텍스트 트래픽 선택 해제

Google Play 인스턴트의 게임은 HTTP 트래픽을 지원하지 않습니다. 게임이 Android 9(API 수준 28) 이상을 타겟팅하는 경우 Android는 기본적으로 게임에서 일반 텍스트를 지원하지 않습니다.

하지만, 게임이 Android 8.1(API 수준 27) 이하를 타겟팅하는 경우 네트워크 보안 구성 파일을 만들어야 합니다. 다음 코드 스니펫에 나와 있는 것처럼 이 파일에서 cleartextTrafficPermittedfalse로 설정합니다.

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

타겟 샌드박스 버전 업데이트

Google Play 인스턴트가 지원하는 샌드박스 환경을 타겟팅하도록 인스턴트 게임의 AndroidManifest.xml 파일을 업데이트합니다. 이 업데이트를 완료하려면 다음 코드 스니펫에 나와 있는 것처럼 게임의 <manifest> 요소에 android:targetSandboxVersion 속성을 추가하면 됩니다.

<manifest
   xmlns:android="http://schemas.android.com/apk/res/android"
  ...
   android:targetSandboxVersion="2" ...>

자세한 내용은 targetSandboxVersion 속성에 관한 문서를 참조하세요.

캐시 또는 앱 데이터에 의존하지 않도록 함

다음 상황 중 한 가지가 발생하여 인스턴트 환경 캐시가 삭제되기 전까지 인스턴트 환경은 사용자 기기에 다운로드된 상태로 남아 있습니다.

  • 기기에 사용 가능한 메모리가 부족하여 인스턴트 환경 캐시가 가비지로 수집된 경우
  • 사용자가 기기를 다시 시작한 경우

어느 경우이든 사용자가 인스턴트 환경과 상호작용하려면 인스턴트 환경을 다시 다운로드해야 합니다.

시스템의 저장공간이 매우 부족하면 인스턴트 환경의 사용자 데이터가 내부 저장소에서 삭제될 수 있습니다. 따라서 사용자의 진행 상황이 보존되도록 사용자 데이터를 게임 서버와 주기적으로 동기화하는 것이 좋습니다.

APK 크기 줄이기

다른 유형의 앱과 달리 Google Play 인스턴트 게임의 다운로드 크기는 15 MB로 제한됩니다. 이 크기의 게임을 만들려면 게임 로직을 리팩터링해야 할 수 있습니다. 이 섹션에서 설명하는 몇 가지 도구와 기법을 통해 게임 크기를 최적화할 수 있습니다.

도구

다음 도구 목록으로 게임 크기에 영향을 미치는 요소를 확인할 수 있습니다.

  • APK Analyzer: 컴파일된 APK 콘텐츠의 전체적인 뷰를 제공합니다. 이 뷰를 사용하면 각 요소가 전체 크기에서 차지하는 바이트 수를 확인할 수 있습니다. 이 도구를 사용하여 게임에서 사용하는 리소스와 애셋, 로직 및 네이티브 라이브러리의 크기를 빠르게 확인할 수 있습니다.
  • Bloaty McBloatface: 바이너리 파일의 크기 프로필을 표시합니다.
  • Android GPU 검사기: 게임을 다시 컴파일하지 않고도 텍스처 크기 축소를 통한 파일 크기 효과를 확인할 수 있습니다.

기법

다음은 게임 크기를 줄이는 데 사용할 수 있는 기법의 목록입니다.

  • 게임 로직 중 일부를 추출하여 하나 이상의 기능 모듈에 배치합니다. 이는 크기 제한에 포함되지 않습니다.
  • 게임 텍스처의 해상도를 낮춥니다.
  • 특히 GPU에서 압축되지 않은 텍스처를 사용하고 있다면 WebP 형식을 사용하는 것도 좋습니다. WebP 형식은 JPEG 이미지와 품질은 동일하지만 크기는 15%~30% 더 작은 이미지를 만듭니다. WebP 이미지를 압축 해제하는 데 시간이 더 오래 걸리지만 이러한 압축 해제 시간은 여전히 게임 텍스처를 다운로드하는 시간보다 훨씬 짧습니다. 또한, Google은 이 형식을 오픈소스 게임 엔진에 통합했습니다.
  • 소리와 음악을 압축하거나 재사용합니다.
  • 여러 컴파일 플래그를 사용하여 바이너리 파일을 더 작게 만들 수 있습니다.
    • -fvisibility=hidden – 가장 중요한 항목입니다. cmake에서 다음과 같이 지정할 수 있습니다.
      $ set_target_properties(your-target PROPERTIES CXX_VISIBILITY_PRESET hidden)
      
    • -Oz - 이 항목도 크기를 줄이는 데 중요합니다. gcc를 사용하여 컴파일하는 경우 대신 -Os를 사용하세요.
    • -flto - 파일 크기를 줄이기도 합니다.
    • 링커 플래그 – -ffunction-sections, -fdata-sections와 같은 컴파일러 플래그와 함께 --gc-sections를 사용합니다.
  • Proguard를 사용하여 코드와 리소스를 축소합니다.
  • Gradle 4.4 이상을 사용하여 더 작은 DEX 파일을 생성합니다.
  • 클라우드 애셋 전송 구현

대규모 게임을 여러 APK로 나누기

권장사항을 적용하여 APK 크기를 축소한 후에도 Google Play 인스턴트 환경을 최적화하여 게임을 15 MB의 단일 APK에 맞추는 것이 어려울 수 있습니다. 이 문제를 해결하려면 게임을 여러 APK로 나누면 됩니다. 플레이어는 주요 기본 APK를 다운로드하여 시작하며 플레이하는 동안 나머지 분할 APK는 백그라운드에서 게임에 제공됩니다.

예를 들어, 기본 APK에는 핵심 게임 엔진과 로드 화면을 표시하는 데 필요한 애셋이 포함될 수 있습니다. 기본 APK가 실행되면 로드 화면을 표시하고 게임 및 레벨 데이터가 포함된 추가 분할 APK를 즉시 요청합니다. 분할 APK를 사용할 수 있게 되면 애셋을 게임 엔진에 로드하고 플레이어에게 게임을 시작하는 데 필요한 콘텐츠를 제공할 수 있습니다.

UX 권장사항 채택

인스턴트 환경을 지원하도록 게임을 구성한 후에는 우수한 사용자 환경을 제공하기 위해 다음 섹션에 나오는 로직을 추가하세요.

게임에서 인스턴트 환경이 실행 중인지 확인

일부 게임 로직이 사용자의 인스턴트 환경 사용 여부에 따라 달라지는 경우 isInstantApp() 메서드를 호출합니다. 이 메서드는 현재 실행 중인 프로세스가 인스턴트 환경인 경우 true를 반환합니다.

이 확인 작업을 하면 앱을 제한된 실행 환경에서 실행해야 하는지 아니면 앱에서 플랫폼 기능을 활용할 수 있는지 알 수 있습니다.

설치 메시지 표시

Google Play 인스턴트 환경의 무료 체험판을 빌드한 경우 어느 시점이 되면 게임은 기기에 전체 버전을 설치하라는 메시지를 플레이어에게 표시해야 합니다. 이렇게 하려면 Android용 Google API에서 showInstallPrompt() 메서드를 사용합니다.

플레이어에게 설치 요청 메시지를 표시해야 하는 방법과 시기에 관한 자세한 내용은 Google Play 인스턴트 게임의 UX 권장사항을 참조하세요.

설치된 환경으로 데이터 전송

무료 체험 환경이 플레이어 마음에 들면 게임의 전체 버전을 설치하겠다고 결정할 수 있습니다. 좋은 사용자 환경을 제공하려면 플레이어의 진행 내역이 인스턴트 환경에서 전체 게임 버전으로 이전되는 것이 중요합니다.

플레이어가 Android 8.0(API 수준 26) 이상을 실행하는 기기를 사용 중이며 게임에서 targetSandboxVersion2로 지정된 경우 플레이어의 진행 내역이 게임의 전체 버전으로 자동 전송됩니다. 그러지 않으면 플레이어 진행 내역과 관련된 데이터를 수동으로 전송해야 합니다. 수동으로 전송하려면 다음 API 중 하나를 사용합니다.

  • Android 8.0(API 수준 26) 이상을 실행하는 기기를 사용하는 플레이어에는 Cookie API - 샘플 앱을 사용합니다.
  • 플레이어가 Android 7.1(API 수준 25) 이하를 실행하는 기기에서 개발자의 환경과 상호작용할 수 있는 경우 Storage API - 샘플 앱에 관한 지원을 추가합니다.

참고 자료

다음 추가 리소스에서 Google Play 인스턴트에 관해 자세히 알아보세요.

Codelab: 첫 번째 인스턴트 앱 빌드하기
기존 앱에서 Google Play 인스턴트 지원을 추가합니다.
Codelab: 다기능 인스턴트 앱 빌드하기
다기능 앱을 모듈화합니다.