C++에서 Firebase 시작하기

1. 개요

이 Codelab에서는 Google 애널리틱스를 예로 사용하여 샘플 Android 게임에 C++ Firebase Games SDK를 통합하는 방법을 알아봅니다. 필요한 기능을 추가하고, 플레이어의 진행 상황을 측정하는 기본적인 분석 로직을 통합하고, 테스터와 게임을 공유하여 초기 의견을 받을 수 있습니다.

둘러보기

저자와 함께 이 Codelab을 진행하려면 다음 동영상을 시청하세요.

학습할 내용

  • Android CMake 기반 게임에 Firebase를 추가하는 방법
  • 필요한 C++ 및 Gradle 종속 항목을 파악하는 방법
  • 애널리틱스 이벤트를 로깅하는 방법
  • 분석 이벤트를 디버깅하는 방법
  • 앱 배포를 통해 게임을 공유하는 방법

필요한 항목

  • Android 스튜디오
  • 샘플 코드
  • Google Play 서비스가 설치된 테스트 기기 또는 에뮬레이터

2. 샘플 코드 가져오기

GitHub에서 체크아웃하거나 다운로드합니다.

git clone https://github.com/FirebaseExtended/cmake-way-for-firebase.git

Firebase SDK 다운로드

macOS/Linux:

sh download.sh

Windows (PowerShell에서):

./download.ps1

SDK를 수동으로 다운로드할 수도 있습니다. 이렇게 하면 Firebase C++ SDK를 /third_party에 추출하여 firebase_cpp_sdk라는 폴더에 Firebase SDK의 루트 CMakeLists.txt가 있어야 합니다.

3. 샘플 게임 실행

먼저 샘플 게임을 플레이하여 모든 것이 작동하는지 확인합니다. 절차적으로 생성된 레벨과 점프를 위한 단일 버튼이 있는 간단한 무한 러너 게임입니다.

  1. File > New > Import Project를 선택하거나 스플래시 화면에서 Import Project를 선택합니다.
  2. 저장소에 포함된 proj.android/ 폴더를 엽니다.
  1. [선택사항] proj.android/gradle.properties를 열고 PROP_APP_ABI를 찾습니다. 타겟 아키텍처를 제외한 모든 아키텍처를 삭제하여 빌드 시간을 줄일 수 있습니다. PROP_APP_ABI=x86는 에뮬레이터용으로만 빌드되고 PROP_APP_ABI=armeabi-v7a는 대부분의 휴대전화용으로 빌드됩니다.
  2. 디버그 버튼 fa7d6449514b13c3.png을 클릭하여 게임을 빌드하고 실행합니다. Cocos2dx 게임 엔진을 빌드하는 데 시간이 걸립니다.

4. Firebase Console 설정

  1. Firebase Console에서 새 프로젝트를 만듭니다. 5d2552e8450338d3.png
  2. '아이스크림 러너'와 같은 이름을 지정합니다.
  3. 애널리틱스 사용 설정 255468f27832bb18.png
  4. 애널리틱스 계정 추가 또는 만들기 c7fa1b1004135be3.png
  5. 프로젝트에 새 Android 앱 추가 984b9f20cd590597.png
  6. com.firebase.popsiclerunner를 패키지 이름으로 추가합니다.

fda079aab5b185d4.png

  1. google-services.json을 다운로드하고 proj.android/app 95aae8dd12033335.png에 복사합니다.
  1. Firebase SDK 추가에 관한 안내를 무시하고 '다음'을 클릭합니다.
  2. 설치 확인을 요청하는 메시지가 표시되면 '이 단계 건너뛰기'를 클릭해도 됩니다.

5. 게임에 Firebase 추가

CMakeLists.txt에 Firebase SDK 추가

루트 수준 CMakeLists.txt를 엽니다. 상단에 다음 코드가 있어야 합니다.

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)

set(APP_NAME popsiclerunner)

project(${APP_NAME})

CMakeLists.txt 파일 끝에 다음 줄을 추가합니다.

CMakeLists.txt

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/firebase_cpp_sdk)
target_link_libraries(${APP_NAME} firebase_analytics firebase_app)

add_subdirectory에는 Firebase C++ SDK가 포함되어 있으며 이 게임에서 사용할 수 있습니다.

target_link_libraries Android용으로 빌드된 Firebase의 C++ 라이브러리를 게임에 연결합니다.

Google 서비스 플러그인 추가

Firebase SDK를 연결하려면 Google 서비스 플러그인을 Gradle 빌드 스크립트에 추가해야 합니다. 이렇게 하려면 프로젝트 수준 build.gradle 파일을 엽니다 (proj.android 폴더에 있음). classpath 'com.google.gms:google-services:4.3.3'를 buildscript 종속 항목으로 추가합니다.

build.gradle

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
    }
}

그런 다음 모듈 수준 build.gradle 파일 (proj.android/app 폴더에 있음)에 플러그인을 추가합니다. apply plugin: 'com.android.application' 아래에 apply plugin: 'com.google.gms.google-services'를 추가합니다.

build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

Gradle에서 C++ SDK 찾기

Gradle에 Firebase C++ SDK를 찾을 위치를 알려주려면 settings.gradle 파일 하단에 다음 줄을 추가합니다.

settings.gradle

gradle.ext.firebase_cpp_sdk_dir = "$settingsDir/../third_party/firebase_cpp_sdk/"
includeBuild "$gradle.ext.firebase_cpp_sdk_dir"

Android 종속 항목 추가

Firebase용 Android 종속 항목을 연결하려면 popsicle_runner의 모듈 수준 Gradle 파일 (proj.android/app/build.gradle에 있음)을 열고 끝에 있는 일반적인 dependences { 섹션 바로 앞에 다음을 추가합니다.

build.gradle

apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
firebaseCpp.dependencies {
    analytics
}

AndroidX 및 Jetifier

gradle.properties를 열고 다음을 끝에 추가하여 AndroidX 및 Jetifier 지원을 추가합니다.

gradle.properties

android.useAndroidX = true
android.enableJetifier = true

게임에서 Firebase 초기화

Classes/AppDelegate.cpp를 열어 게임에서 Firebase를 초기화합니다. 맨 위에 다음 #include 지시어를 추가합니다.

AppDelegate.cpp

#include <firebase/app.h>
#include <firebase/analytics.h>

그런 다음 App::Create를 추가하고 필요한 Firebase 기능을 초기화합니다. 이렇게 하려면 AppDelegate::applicationDidFinishLaunching를 찾아 auto scene = MainMenuScene::createScene() 앞에 다음 코드를 추가합니다.

AppDelegate.cpp

{
    using namespace firebase;
    auto app = App::Create(JniHelper::getEnv(), JniHelper::getActivity());
    analytics::Initialize(*app);
}

게임을 디버그하고 Firebase 대시보드를 새로고침하면 1분 정도 후에 새 사용자가 표시됩니다.

6. 애널리틱스 추가

개발 초기 단계에서도 애널리틱스는 베타 테스터가 게임과 상호작용하는 방식을 파악하는 데 유용한 도구입니다. 유지율 보고서와 같이 자동으로 수집되는 분석도 있지만 특정 게임에 맞게 맞춤 이벤트를 추가하는 것이 유용합니다.

플레이어가 레벨을 시작할 때 분석 이벤트를 로깅하는 것이 좋습니다. 레벨 시작 이벤트 수를 사용하면 플레이어가 세션에서 게임을 다시 플레이하는 빈도를 확인할 수 있습니다.

4b5df08c0f6b6938.png

플레이어가 사망하면 플레이어가 얼마나 진행했는지도 이벤트로 기록합니다. 이를 통해 변경사항이 단일 세션의 지속 시간에 어떤 영향을 미치는지 확인할 수 있으며, 플레이어가 더 짧고 어려운 게임을 원하는지 아니면 더 길고 쉬운 게임을 원하는지 파악하는 데 도움이 됩니다.

애널리틱스 헤더 추가

Classes/PopsicleScene.cpp를 열고 상단에 Firebase 헤더를 추가하여 분석 호출을 할 수 있도록 합니다.

PopsicleScene.cpp

#include <firebase/analytics.h>
#include <firebase/analytics/event_names.h>

레벨 시작 이벤트 로깅

Cocos2dx 디렉터에서 이 장면을 스테이징할 때 이벤트를 로깅하려면 스텁된 함수 PopsicleScene::onEnter()를 찾습니다. 여기에 다음 코드를 입력하여 레벨 시작 이벤트를 로깅합니다.

PopsicleScene.cpp

using namespace firebase;
analytics::LogEvent(analytics::kEventLevelStart);

레벨 종료 이벤트 로깅

플레이어가 얼마나 잘하고 있는지 확인하기 위해 플레이어가 마지막에 죽었을 때 얼마나 진행했는지와 함께 레벨 종료 이벤트를 기록해 보겠습니다. 이렇게 하려면 PopsicleScene::gameOver()를 찾아 _gameOver = true;를 설정하기 전에 if(!_gameOver) { 블록 끝에 다음을 추가합니다.

PopsicleScene.cpp

{
    using namespace firebase;
    analytics::LogEvent(analytics::kEventLevelEnd, "distance", _lastDistance);
}

kEventLevelEnd은 레벨 종료 이벤트입니다. "distance"는 '이벤트 매개변수'입니다. 여기에는 마지막으로 기록된 거리가 추가됩니다. 이는 플레이어가 사망하기 전에 이동한 거리를 대략적으로 나타냅니다.

7. 테스트 이벤트

지금 디버그 fa7d6449514b13c3.png를 클릭해도 애널리틱스 대시보드에 이벤트가 보고되기까지 시간이 걸립니다. 이러한 지연에는 두 가지 이유가 있습니다. 1) 배터리를 보존하기 위해 이벤트가 약 1시간에 한 번 일괄 처리되어 업로드되고 2) 보고서가 24시간마다 생성되기 때문입니다.

디버그 모드 사용 설정

기기를 디버그 모드로 설정하여 애널리틱스 이벤트를 디버깅할 수는 있습니다.

먼저 Android 디버그 브리지 (ADB)가 설치되고 설정되어 있는지 확인합니다. adb devices를 입력하면 테스트할 기기가 표시됩니다.

$ adb devices
List of devices attached
emulator-5554   device

그런 다음 다음 adb shell 명령어를 실행합니다.

adb shell setprop debug.firebase.analytics.app com.firebase.popsiclerunner

이렇게 하면 Firebase 애널리틱스에서 이벤트를 즉시 로깅하며 테스트 시 실시간 이벤트가 오염되지 않도록 일반 보고서에서 자동으로 제외됩니다. 나중에 이 작업을 실행취소하려면 다음을 입력하세요.

adb shell setprop debug.firebase.analytics.app .none.

이벤트 보기

Firebase Console에서 'DebugView'를 엽니다. 84472ac3a7ad9aff.png

디버그 fa7d6449514b13c3.png를 클릭하고 게임을 플레이합니다. 게임에서 새 이벤트가 발생하면 거의 즉시 표시됩니다. 5e81dfa682497414.png

level_end 이벤트를 펼치면 로깅한 맞춤 'distance' 매개변수도 표시됩니다. 4451be4a6a97399c.png

8. 테스터 찾기

다음으로 스튜디오 내부, 친한 친구, 커뮤니티 등에서 게임을 확인해야 합니다. Firebase 앱 배포를 사용하면 플레이어를 초대하여 게임을 플레이하도록 할 수 있습니다.

독립 실행형 바이너리 빌드

먼저 빌드 > 번들/APK 빌드 > APK 빌드에서 공유할 독립형 APK를 빌드합니다. 14c6bd5549cdb57a.png

Android 스튜디오에서 빌드된 파일을 찾을 수 있는 대화상자가 표시됩니다. 이메일을 놓친 경우 '이벤트 로그'를 클릭하여 링크를 다시 받을 수 있습니다. ac730e3428689c4c.png

Firebase 앱 배포에 업로드

  1. App Distribution을 열고 '시작하기'를 클릭합니다. dcdafea94e4c1c15.png
  2. '새 출시 버전을 만들려면 .apk를 여기로 드래그하세요'라는 상자에 .apk 파일을 드래그 앤 드롭합니다. 4b6f94a05391c63f.png
  3. 이메일 주소를 첫 번째 테스터로 입력합니다. ce047d710befa44a.png
  4. '다음'을 클릭합니다.
  5. 설명을 추가하고 '배포'를 클릭합니다.

테스터 초대

모든 이메일 주소를 직접 입력하는 대신 초대 링크를 만들 수 있습니다. 이 초대 링크로 사용자를 캡처할 때 테스터 그룹에 사용자를 추가할 수도 있습니다. 예를 들어 내부 테스터와 외부 테스터를 구분할 수 있습니다.

  1. '테스터 및 그룹' 7e380773faff4eb7.png을 클릭합니다.
  2. 새 그룹 6b046c010b14adaf.png를 만들고 'Android 테스터'와 같은 이름을 지정합니다.
  3. '초대 링크'를 클릭합니다. a7fc2c8b01b6883e.png
  4. '새 초대 링크'를 클릭합니다.
  5. 드롭다운에서 그룹을 설정합니다. d1b289e825d93d40.png
  6. '링크 만들기'를 클릭합니다.
  7. '링크 복사'를 클릭하고 원하는 방식으로 공유합니다.

9. 축하합니다

C++ 기반 게임에 분석을 추가하고, 친구를 초대하여 게임을 플레이했으며, Android 개발에서 흔히 사용되는 CMake 및 Gradle 기반 빌드 시스템에서 Firebase 라이브러리를 찾아 연결하는 방법을 알고 있습니다.

학습한 내용

  • Android CMake 기반 게임에 Firebase를 추가하는 방법
  • 필요한 C++ 및 Gradle 종속 항목을 파악하는 방법
  • 애널리틱스 이벤트를 로깅하는 방법
  • 분석 이벤트를 디버깅하는 방법
  • 앱 배포를 통해 게임을 공유하는 방법

다음 단계

  • 익명으로 사용자를 로그인하고 실시간 데이터베이스에 최고 점수를 저장해 보세요.
  • 자체 게임에서 애널리틱스 이벤트를 로깅합니다.
  • iOS 게임에 애널리틱스를 추가해 보세요.

자세히 알아보기

  • 게임별 이벤트 목록을 확인하고 자체 게임에 어떻게 적용할 수 있는지 생각해 보세요.