AdMob+Firebase 101 Android: 설정 및 애널리틱스 기본사항

1. 소개

광고는 앱의 전반적인 사용자 환경에서 중요한 부분입니다. 광고를 적절하게 구현하면 전반적인 앱 경험을 개선하고 사용자 유지율과 참여도를 높일 수 있습니다. 예를 들어 보상형 광고를 사용하면 동영상 광고를 시청한 사용자에게 인앱 화폐 또는 상품을 제공하여 사용자가 막혀서 이탈할 수 있는 상황에서 새로운 목표를 달성할 수 있도록 지원할 수 있습니다.

하지만 우수한 광고 경험을 만드는 것은 쉽지 않습니다. 이러한 광고를 얼마나 자주 표시해야 하는지 궁금할 수 있습니다. 어디에 언제 표시해야 하나요? 어떤 어워즈를 수여해야 하나요? 안타깝게도 앱마다, 게재위치마다 답이 다릅니다. 모든 경우에 적합한 답변은 없습니다.

Firebase용 Google 애널리틱스, AdMob, Firebase에서 제공하는 강력하면서도 사용하기 쉬운 여러 도구를 사용하면 데이터 기반 방식으로 앱을 세부적으로 조정하는 것이 훨씬 쉽고 간소화됩니다. 오늘은 시작하는 방법을 알려드리겠습니다.

빌드할 항목

이 Codelab은 플레이어가 그림의 이름을 추측할 수 있는 게임인 Awesome Drawing Quiz라는 앱을 빌드하는 방법을 설명하는 세 가지 Codelab 중 첫 번째 Codelab입니다. 게임에 보상형 광고와 Firebase 서비스를 통합하는 방법을 보여줍니다.

이 Codelab에서는 Firebase용 Google 애널리틱스를 통합하여 중요한 앱 이벤트를 기록합니다. 또한 Firebase Console에 표시된 앱 분석을 읽는 방법도 알아봅니다.

이 Codelab을 진행하는 동안 코드 버그, 문법 오류, 불명확한 문구 등의 문제가 발생하면 Codelab 왼쪽 하단에 있는 오류 신고 링크를 통해 신고해 주세요.

학습할 내용

  • 앱에서 Firebase용 Google 애널리틱스를 설정하는 방법
  • 앱 이벤트를 기록하는 방법
  • Firebase Console에 표시된 앱 분석을 읽는 방법

필요한 항목

  • Android 스튜디오 버전 4.1 이상
  • Google 계정
  • Android 5.0 이상이 설치된 테스트 기기(기기를 연결하는 USB 케이블 포함) 또는 Play 스토어/Google API를 지원하는 시스템 이미지로 AVD(Android 가상 기기)를 실행하는 Android Emulator

AdMob 사용 경험 수준을 평가해 주세요.

초급 중급 고급

Firebase 사용 경험 수준을 평가해 주세요.

초급 중급 고급

2. 개발 환경 설정

코드 다운로드

다음 버튼을 클릭하여 이 Codelab의 모든 코드를 다운로드합니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 admob-firebase-codelabs-android라는 루트 폴더가 압축 해제됩니다.

...또는 명령줄에서 GitHub 저장소를 클론합니다.

$ git clone https://github.com/googlecodelabs/admob-firebase-codelabs-android

저장소에는 다음과 같은 네 개의 폴더가 포함되어 있습니다.

  • android_studio_folder.png101-base: 이 Codelab에서 빌드할 시작 코드입니다.
  • android_studio_folder.png101-complete_and_102-base: 이 Codelab의 완성된 코드 및 102 Codelab의 시작 코드
  • android_studio_folder.png102-complete: 102 Codelab을 위해 완료된 코드입니다.

시작 앱 가져오기

Android 스튜디오를 실행하고 시작 화면에서 '프로젝트 가져오기'를 선택합니다. 그런 다음 다운로드한 코드에서 101-base 디렉터리를 선택합니다.

이제 Android 스튜디오에서 프로젝트가 열려 있어야 합니다.

3. 보상형 동영상 광고 단위 설정 (선택사항)

편의를 위해 시작 앱에는 전용 보상형 동영상 광고 단위가 이미 포함되어 있습니다. AdMob 계정에서 새 계정을 만들고 싶지 않다면 이 단계를 건너뛰어도 됩니다.

계정에서 새 AdMob 앱을 만들려면 다음 안내를 따르세요.

  1. AdMob 콘솔로 이동합니다.
  2. 메뉴에서 '앱 추가'를 클릭합니다.
  3. 'Google Play 또는 App Store에 앱을 게시하셨나요?'라는 질문이 표시되면 '아니요'라고 대답합니다.
  4. 앱 이름을 'Awesome Drawing Quiz'로 지정하고 플랫폼으로 'Android'를 선택한 다음 '추가'를 클릭합니다.

계정에서 AdMob 앱을 만든 후 아래 설명된 단계에 따라 새 보상형 동영상 광고 단위를 만드세요.

  1. AdMob 프런트엔드에서 메뉴를 클릭한 다음 앱 목록에서 'Awesome Drawing Quiz'를 선택합니다.
  2. 광고 단위 추가를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.
  3. 광고 형식으로 보상형을 선택합니다.

7672f41ec611101b.png

  1. 원하는 광고 단위 이름을 입력합니다. 그런 다음 리워드 금액을 1로, 리워드 아이템을 '힌트'로 설정합니다 (이는 앱에서 현재 사용자에게 제공하는 리워드임). 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

  1. 성공적으로 생성되면 다음과 비슷한 안내가 표시됩니다. ff872a005a07b75e.png
  2. Android 프로젝트로 돌아가 AdMob 앱 ID와 광고 단위 ID 상수를 이전 단계에서 만든 ID로 업데이트합니다.

strings.xml

<!-- Update the value with your AdMob app id -->
<string name="admob_app_id">YOUR_ADMOB_APP_ID</string>

GameActivity.kt

// Update the value with your Rewarded Video ad unit id
private const val AD_UNIT_ID = "<YOUR_AD_UNIT_ID>";

4. Firebase 프로젝트 설정

Firebase Console에서 새 프로젝트 만들기

  1. Firebase Console로 이동합니다.
  2. 프로젝트 추가를 선택하고 프로젝트 이름을 '멋진 그림 퀴즈'로 지정합니다. 이 프로젝트에 Google 애널리틱스 사용 설정 라디오 버튼이 사용 설정되어 있는지 확인합니다.
  3. 사용할 Google 애널리틱스 계정을 선택합니다. 대부분의 경우 Firebase용 기본 계정 옵션을 선택하면 되지만, 사용하려는 다른 Google 애널리틱스 계정이 있는 경우 여기에서 선택하세요.
  4. 프로젝트 만들기를 클릭합니다.

Android 앱 추가

  1. 새 프로젝트의 개요 화면에서 Android 앱에 Firebase 추가를 클릭합니다.
  2. 코드랩의 패키지 이름(com.codelab.awesomedrawingquiz)을 입력합니다.
  3. 앱의 닉네임을 설정합니다(예: Awesome Drawing Quiz).
  4. 이 프로젝트에는 SHA-1이 필요하지 않으므로 SHA-1 필드를 비워 둡니다.
  5. 앱 등록을 선택하여 앱을 등록합니다.

앱에 google-services.json 파일 추가

다음으로 앱에 필요한 모든 Firebase 메타데이터가 포함된 구성 파일을 다운로드할 수 있는 화면이 표시됩니다. google-service.json 다운로드를 클릭하고 파일을 프로젝트의 android_studio_folder.pngapp 디렉터리에 복사합니다.

32419a0fa25a1405.png

종속 항목 버전 선언

먼저 프로젝트에 Firebase를 통합하는 데 필요한 각 종속 항목의 버전을 추가해 보겠습니다. 프로젝트 루트에 있는 dependencies.gradle 파일을 열고 google-services 플러그인, Firebase 애널리틱스 SDK, Firebase Core SDK 버전을 추가합니다.

dependencies.gradle

ext {
    ...

    // TODO: Declare google-services plugin version (101)
    googleServicesPluginVersion = '4.3.4'

    ...

    // TODO: Declare Firebase BOM version (101)                                                                                                                                                                                                   
    firebaseBomVersion = '26.2.0'

    ...
}

앱에 google-services 플러그인 적용

google-services 플러그인은 google-services.json 파일을 사용하여 Firebase를 사용하도록 애플리케이션을 구성합니다.

프로젝트 루트 디렉터리에 있는 build.gradle 파일에 google-services를 클래스 경로로 추가합니다.

build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ...
    
    dependencies {
        classpath "com.android.tools.build:gradle:$androidPluginVersion"

        // TODO: Add google-services plugin (101)
        classpath "com.google.gms:google-services:$googleServicesPluginVersion"

        ...
    }
}

...

그런 다음 app/build.gradle 파일에 다음 줄을 추가하여 google-services 플러그인을 적용합니다.

app/build.gradle

apply plugin: 'com.android.application'

// TODO: Apply google-services plugin (101)
apply plugin: 'com.google.gms.google-services'

android {
    ...
}

dependencies {
    ...
}

프로젝트에 Firebase SDK 추가

app/build.gradle 파일에서 앱 종속 항목에 애널리틱스 SDK를 추가합니다.

app/build.gradle

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    ...

    // TODO: Import the Firebase BoM (101)
    implementation platform("com.google.firebase:firebase-bom:$firebaseBomVersion")

    // COMPLETE: Add Firebase Analytics dependency (101)
    implementation 'com.google.firebase:firebase-analytics-ktx'

    ...
}

...

프로젝트를 Gradle 파일과 동기화

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 프로젝트를 Gradle 파일과 동기화하세요. File > Sync Project with Gradle Files 메뉴를 선택하여 프로젝트를 Gradle 파일과 동기화합니다.

5. AdMob을 Firebase 프로젝트에 연결

앱을 Firebase에 연결하려면 다음 단계를 완료하세요.

  1. https://apps.admob.com에서 AdMob 계정에 로그인합니다.
  2. 사이드바에서 '앱'을 클릭합니다.
  3. 'Awesome Drawing Quiz'를 선택합니다. 최근 앱 목록에 앱이 표시되지 않으면 모든 앱 보기를 클릭하여 AdMob에 추가한 모든 앱 목록을 검색해 보세요.
  4. 사이드바에서 앱 설정을 클릭합니다.
  5. Firebase에 연결을 클릭합니다.
  6. 기존 Firebase 프로젝트에 연결하고 새 Firebase 앱 만들기 옵션을 선택합니다. 그런 다음 드롭다운 메뉴에서 'Awesome Drawing Quiz' 프로젝트를 선택합니다.
  7. '계속' 버튼을 클릭하면 '연결됨' 메시지가 표시됩니다. '완료' 버튼을 클릭하여 완료합니다.

AdMob 앱을 Firebase 프로젝트에 연결하면 다음과 같이 AdMob 및 Firebase 콘솔에서 몇 가지 추가 기능이 잠금 해제됩니다.

수익 카드 (AdMob)

수익 카드에서 가능한 모든 수익원을 한곳에서 전체적으로 확인할 수 있습니다. 지원되는 수익원은 다음과 같습니다.

  • AdMob (추정)
  • 미디에이션 광고 네트워크 (관찰됨)
  • 인앱 구매
  • 전자상거래 구매

10fe118249e11150.png

사용자 측정항목 카드 (AdMob)

사용자 측정항목 카드를 통해 광고 환경의 변경사항이 사용자 행동에 어떤 영향을 미치는지 확인할 수 있습니다.

5f56366f1b31d4a1.png

보상형 광고 보고서 (AdMob)

보상형 광고 보고서는 게시자가 사용자가 보상형 광고와 상호작용하는 방식을 이해하는 데 도움이 되는 다양한 측정항목을 제공합니다.

658a2868777690ea.png

총수익 카드 (Firebase)

AdMob 앱을 Firebase에 연결하면 Firebase 대시보드의 총수익 카드에 AdMob의 수익과 인앱 구매 및 전자상거래 구매의 수익이 표시됩니다.

98cb283977b023a.png

광고 이벤트 보고 (Firebase)

광고 관련 이벤트 (클릭, 노출, 보상 이벤트)는 자동으로 수집되며 Firebase용 Google 애널리틱스에서 사용할 수 있습니다.

bf77bd8c00c1441b.png

6. 프로젝트 실행

프로젝트를 컴파일하고 실행하면 앱이 시작될 때 다음 화면이 표시됩니다.

15f1d8041988974c.png

게임 시작을 클릭하면 화면에 그림이 표시됩니다. 미션은 상단에 표시된 힌트를 사용하여 그림의 이름을 추측하는 것입니다. 힌트에서 그림 이름의 첫 글자와 길이를 추론할 수 있습니다.

8e87e96256d6874a.png 9c4a0143c3234cb2.png

그림의 이름을 모르는 경우 '건너뛰기' 버튼을 클릭하여 단계를 건너뛸 수 있습니다.

답을 추측하는 데 도움이 되는 추가 힌트가 필요할 수 있습니다. '힌트' 버튼을 클릭하고 리워드 동영상 광고를 시청하면 추가 힌트를 얻을 수 있습니다. 광고 시청을 완료하면 리워드로 추가 글자가 공개됩니다.

edcf6f0d833ea4ea.png 47ab9a07b1c71711.png

7. 앱 이벤트 추가

Awesome Drawing Quiz의 사용자 여정을 자세히 이해하려면 게임에서 사용자의 행동을 추적하는 몇 가지 맞춤 이벤트를 다음과 같이 정의합니다.

이벤트 이름

트리거됨...

매개변수

game_start

사용자가 새 게임을 시작할 때

없음

level_start

사용자가 스테이지 내에서 새로운 레벨 (새 그림 퀴즈)을 시작할 때 (한 단계에 6개의 레벨이 있음)

level_name

level_wrong_answer

사용자가 틀린 답을 제출하는 경우

level_name

ad_reward_prompt

사용자가 힌트 버튼을 탭하고 보상형 동영상 광고를 시청하라는 메시지가 표시되는 경우

ad_unit_id

ad_reward_impression

사용자가 보상형 동영상 광고 시청을 시작할 때

ad_unit_id

level_success

사용자가 정답을 제출할 때 (레벨을 완료할 때)

level_name, number_of_attempts, elapsed_time_sec, hint_used

level_fail

사용자가 레벨을 건너뛸 때

level_name, number_of_attempts, elapsed_time_sec, hint_used

game_complete

게임이 끝났을 때

number_of_correct_answers

각 이벤트와 연결된 각 매개변수의 설명은 다음과 같습니다.

이벤트 이름

매개변수 이름

설명

level_start

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

level_wrong_answer

level_name

사용자가 틀린 답을 제출하는 경우

ad_reward_prompt

ad_unit_id

보상형 동영상 광고를 표시하는 데 사용되는 광고 단위 ID

ad_reward_impression

ad_unit_id

보상형 동영상 광고를 표시하는 데 사용되는 광고 단위 ID

level_success

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

level_success

number_of_attempts

레벨을 클리어하기 위해 시도한 횟수

level_success

elapsed_time_sec

레벨을 완료하는 데 걸린 시간(초)

level_success

hint_used

사용자가 힌트 (보상형 동영상 광고 시청)를 사용하여 레벨을 클리어했는지 여부 (1: 힌트 사용 / 0: 힌트 없이 레벨 클리어)

level_fail

level_name

레벨에 표시된 그림의 이름 (예: 'banana')

level_fail

number_of_attempts

레벨을 클리어하기 위해 시도한 횟수

level_fail

elapsed_time_sec

레벨을 완료하는 데 걸린 시간(초)

level_fail

hint_used

사용자가 힌트 (보상형 동영상 광고 시청)를 사용하여 레벨을 클리어했는지 여부 (1: 힌트 사용 / 0: 힌트 없이 레벨 클리어)

game_complete

number_of_correct_answers

게임에서 완료한 레벨 수

맞춤 이벤트를 로깅하기 위한 도우미 클래스 만들기

분석 이벤트를 쉽게 로깅하려면 맞춤 이벤트를 관리하는 도우미 클래스를 만듭니다.

먼저 새 Kotlin 파일 (Kotlin 클래스 아님)을 만들고 com.codelab.awesomedrawingquiz 패키지 아래에 QuizAnalytics.kt로 이름을 지정합니다. 맞춤 이벤트의 이름과 매개변수를 정의하는 필드를 만듭니다.

QuizAnalytics.kt

private const val EVENT_AD_REWARD_PROMPT = "ad_reward_prompt"

private const val EVENT_AD_REWARD_IMPRESSION = "ad_reward_impression"

private const val EVENT_LEVEL_FAIL = "level_fail"

private const val EVENT_LEVEL_SUCCESS = "level_success"

private const val EVENT_LEVEL_WRONG_ANSWER = "level_wrong_answer"

private const val EVENT_GAME_START = "game_start"

private const val EVENT_GAME_COMPLETE = "game_complete"

private const val PARAM_AD_UNIT_ID = "ad_unit_id"

private const val PARAM_ELAPSED_TIME_SEC = "elapsed_time_sec"

private const val PARAM_HINT_USED = "hint_used"

private const val PARAM_NUMBER_OF_ATTEMPTS = "number_of_attempts"

private const val PARAM_NUMBER_OF_CORRECT_ANSWERS = "number_of_correct_answers"

다음으로 게임에서 맞춤 이벤트를 로깅하는 데 도움이 되는 확장 프로그램 함수를 추가합니다. 대부분의 맞춤 이벤트에는 각 이벤트의 컨텍스트를 더 많이 파악할 수 있도록 매개변수가 포함되어 있습니다. 또한 애널리틱스에서 이미 정의한 이벤트 이름과 매개변수 (FirebaseAnalytics.Event.LEVEL_NAMEFirebaseAnalytics.Event.LEVEL_START)가 있으므로 이를 사용하겠습니다.

QuizAnalytics.kt

...

fun FirebaseAnalytics.logGameStart() = logEvent(EVENT_GAME_START, null)

fun FirebaseAnalytics.logLevelStart(levelName: String) {
    logEvent(FirebaseAnalytics.Event.LEVEL_START) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
    }
}

fun FirebaseAnalytics.logLevelWrongAnswer(levelName: String) {
    logEvent(EVENT_LEVEL_WRONG_ANSWER) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
    }
}

fun FirebaseAnalytics.logAdRewardPrompt(adUnitId: String) {
    logEvent(EVENT_AD_REWARD_PROMPT) {
        param(PARAM_AD_UNIT_ID, adUnitId)
    }
}

fun FirebaseAnalytics.logAdRewardImpression(adUnitId: String) {
    logEvent(EVENT_AD_REWARD_IMPRESSION) {
        param(PARAM_AD_UNIT_ID, adUnitId)
    }
}

fun FirebaseAnalytics.logLevelSuccess(
    levelName: String,
    numberOfAttempts: Int,
    elapsedTimeSec: Int,
    hintUsed: Boolean
) {
    logEvent(EVENT_LEVEL_SUCCESS) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
        param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
        param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
        param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
    }
}

fun FirebaseAnalytics.logLevelFail(
    levelName: String,
    numberOfAttempts: Int,
    elapsedTimeSec: Int,
    hintUsed: Boolean
) {
    logEvent(EVENT_LEVEL_FAIL) {
        param(FirebaseAnalytics.Param.LEVEL_NAME, levelName)
        param(PARAM_NUMBER_OF_ATTEMPTS, numberOfAttempts.toLong())
        param(PARAM_ELAPSED_TIME_SEC, elapsedTimeSec.toLong())
        param(PARAM_HINT_USED, if (hintUsed) 1 else 0)
    }
}

fun FirebaseAnalytics.logGameComplete(
    numberOfCorrectAnswers: Int
) {
    logEvent(EVENT_GAME_COMPLETE) {
        param(PARAM_NUMBER_OF_CORRECT_ANSWERS, numberOfCorrectAnswers.toLong())
    }
}

게임에서 애널리틱스 이벤트 로깅

GameViewModel 클래스에서 FirebaseAnalytics 인스턴스의 새 속성을 추가합니다.

GameViewModel.kt

class GameViewModel(
    ...
    // TODO: Accept FirebaseAnalytics instance as a parameter (101)
    private val analytics: FirebaseAnalytics,
) : ViewModel() {
   ...
}

그런 다음 AwesomeDrawingQuizViewModelFactory 클래스에서 이전 GameViewModel에서와 같이 새 속성을 추가합니다.

AwesomeDrawingQuizViewModelFactory.kt

class AwesomeDrawingQuizViewModelFactory(
    ...
    // TODO: Accept FirebaseAnalytics instance as a parameter (101)
    private val analytics: FirebaseAnalytics,
) : ViewModelProvider.Factory {
    ...
}

다음으로 AwesomeDrawingQuiz 클래스에서 provideFirebaseAnalytics() 함수를 추가하고 FirebaseAnalytics 인스턴스를 AwesomeDrawingViewModelFactory에 전달하도록 provideViewModelFactory() 함수를 업데이트합니다.

AwesomeDrawingQuiz.kt

class AwesomeDrawingQuiz : Application() {

    ...

    fun provideViewModelFactory() = AwesomeDrawingQuizViewModelFactory(
        this,
        provideGameSettings(),
        // TODO: Pass FirebaseAnalytics instance as a parameter (101)
        provideFirebaseAnalytics(),
    )

    // TODO: Provide FirebaseAnalytics instance (101)
    private fun provideFirebaseAnalytics() = Firebase.analytics

    ...

}

이제 맞춤 이벤트를 구현할 준비가 되었습니다. 먼저 startGame() 함수에서 logGameStart()을 호출하여 게임이 시작되었음을 나타냅니다.

logGameStart()FirebaseAnalytics 클래스의 확장 함수이므로 FirebaseAnalytics 클래스의 인스턴스에서 호출할 수 있습니다.

GameViewModel.kt

fun startGame() {
    ...

    // TODO: Log game_start event (101)
    analytics.logGameStart()

    ...
}

다음으로 checkAnswer() 함수에 level_successlevel_wrong_answer 이벤트를 추가합니다.

GameViewModel.kt

fun checkAnswer(userAnswer: String) {
    ...
    if (correct) {
        ...

        // TODO: Log level_success event (101)
        analytics.logLevelSuccess(
            levelName = drawing.word,
            numberOfAttempts = numAttempts,
            elapsedTimeSec = elapsedTimeInSeconds,
            hintUsed = isHintUsed,
        )

        ...
    } else {
        // TODO: Log level_wrong_answer event (101)
        analytics.logLevelWrongAnswer(levelName = drawing.word)

        ...
    }
}

다음으로 skipLevel() 함수에서 level_fail 이벤트를 추가하여 레벨을 실패로 표시합니다.

GameViewModel.kt

fun skipLevel() {
   ...

    // TODO: Log level_fail event (101)
    analytics.logLevelFail(
        levelName = drawing.word,
        numberOfAttempts = numAttempts,
        elapsedTimeSec = elapsedTimeInSeconds,
        hintUsed = isHintUsed,
    )

    ...
}

다음으로 logAdRewardPrompt()logAdRewardImpression() 함수를 구현하여 보상형 동영상 광고와 관련된 사용자의 행동을 추적합니다.

GameViewModel.kt

fun logAdRewardPrompt(adUnitId: String) {
    // TODO: Log ad_reward_prompt event (101)
    analytics.logAdRewardPrompt(adUnitId)
}

fun logAdRewardImpression(adUnitId: String) {
    // TODO: Log ad_reward_impression event (101)
    analytics.logAdRewardImpression(adUnitId)
}

마지막으로 requestNewDrawing()finishGame() 함수를 수정하여 level_start 및 game_complete 맞춤 이벤트를 추가합니다.

GameViewModel.kt

private fun requestNewDrawing() {
    ...

    drawingRequestDisposable = drawingDao.getRandomDrawings(seenWords)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { d ->
            ...

            // TODO: Log level_start event (101)
            analytics.logLevelStart(d.word)

            ...
        }
}

private fun finishGame() {
    // TODO: Log game_complete event (101)
    analytics.logGameComplete(numCorrectAnswers)

    ...
}

8. 애널리틱스 이벤트 디버그

Firebase Console의 DebugView를 사용하여 이벤트가 올바르게 로깅되는지 확인할 수 있습니다. DebugView를 사용하면 개발 기기에서 앱이 로깅하는 원시 이벤트 데이터를 거의 실시간으로 확인할 수 있습니다.

이 기능은 개발 중 계측 단계에서 검증하는 데 매우 유용하며, 분석 구현 시의 오류를 발견하는 데 도움이 됩니다.

디버그 모드 사용 설정

일반적으로 앱에서 로깅된 이벤트는 약 1시간 동안 일괄 처리된 후 함께 업로드됩니다. 즉석에서 분석 구현을 검증하려면 개발 기기에서 디버그 모드를 사용 설정하여 지연 시간을 최소화하여 이벤트를 업로드해야 합니다.

디버그 모드를 사용 설정하려면 다음 단계를 완료하세요.

  1. Android 스튜디오에서 터미널 도구 창을 엽니다 (보기 > 도구 창 > 터미널).

c8dc1b4f08a224b8.png

  1. 다음 명령어를 실행합니다 (테스트 Android 기기가 컴퓨터에 연결되어 있거나 Android Emulator가 실행 중인지 확인).
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz

이 동작은 다음 명령어를 실행하여 디버그 모드를 명시적으로 사용 중지할 때까지 유지됩니다.

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

DebugView로 애널리틱스 이벤트 디버그

테스트 기기에서 디버그 모드를 사용 설정한 후 Firebase Console에서 프로젝트로 이동하여 메뉴에서 애널리틱스 > DebugView를 선택합니다. 그런 다음 테스트 기기에서 게임을 플레이하여 이벤트가 DebugView 보고서에 기록되고 표시되는지 확인합니다.

827059255d09ac00.png

이벤트 이름을 클릭하면 각 이벤트에 대한 세부정보를 확인할 수 있습니다. 예를 들어 다음 스크린샷은 level_start 이벤트와 연결된 매개변수 세부정보를 보여줍니다.

475db00d05d03ab8.png

자세한 내용은 DebugView 고객센터 도움말을 참고하세요.

9. 맞춤 측정기준 및 측정항목 사용 설정

기본적으로 Firebase용 Google 애널리틱스는 총 이벤트 수를 수집합니다. 관심 있는 각 이벤트 매개변수에 대해 해당 매개변수의 보고를 명시적으로 사용 설정해야 합니다. 그러면 Firebase용 Google 애널리틱스에서 맞춤 매개변수의 통계를 보여주는 추가 카드를 표시할 수 있습니다.

맞춤 측정기준 및 측정항목을 등록하려면 다음 단계를 따르세요.

  1. Firebase Console로 이동하여 이전에 만든 Awesome Drawing Quiz 프로젝트를 선택합니다.
  2. 탐색 메뉴에서 애널리틱스 > 이벤트를 클릭합니다.
  1. 맞춤 정의 관리를 클릭합니다.
  2. 맞춤 측정기준 탭에서 맞춤 측정기준 만들기를 클릭합니다.
  3. '이벤트 매개변수 이름' 필드에 level_name을 입력하고 저장을 클릭하여 매개변수 등록을 완료합니다.

3d20ee9d7de74e9b.png

  1. 그런 다음 맞춤 측정항목 탭을 선택하고 맞춤 측정항목 만들기를 클릭합니다.
  2. 다음 매개변수의 매개변수 이름과 측정 단위를 입력합니다.

매개변수 이름

매개변수 유형

측정 단위

number_of_attempts

숫자

표준

hint_used

숫자

표준

elapsed_time_sec

숫자

number_of_correct_answers

숫자

표준

10. 이벤트 보고서에서 통계 확인하기

게임에 몇 가지 이벤트를 추가했으므로 게임의 사용자 행동에 관한 질문에 답할 수 있습니다. Firebase 이벤트 보고서에서 얻을 수 있는 몇 가지 유용한 정보는 다음과 같습니다.

어떤 레벨에서 오답이 가장 많이 나왔나요?

이 질문에 답하려면 각 수준별로 트리거된 level_wrong_answer 이벤트 수를 알아야 합니다.

이벤트 보고서에서 level_wrong_answer 아이콘을 클릭합니다. level_wrong_answer 이벤트 보고서에서 level_name 카드를 찾습니다. 카드에 level_name 매개변수와 연결된 값이 다음과 같이 표시됩니다.

25da426bbc0c612c.png

위 스크린샷에 따르면 horizon의 오답 수가 가장 많으므로 다른 레벨에 비해 사용자에게 어렵다는 것을 쉽게 알 수 있습니다.

여기에서 얻은 유용한 정보를 바탕으로 초보 사용자에게 어려운 레벨을 제공하지 않아 높은 유지율을 유지할 수 있습니다.

레벨을 클리어하기 위해 시도한 횟수는 평균 몇 번인가요?

멋진 그림 퀴즈에서 사용자는 각 레벨의 답변을 원하는 만큼 제출할 수 있습니다.

level_success 이벤트의 number_of_attempts 매개변수에 대한 매개변수 보고를 사용 설정했으므로 해당 매개변수의 세부 측정항목을 확인할 수 있습니다.

이벤트 보고서에서 level_success 이벤트를 클릭합니다. level_success 이벤트 보고서에서 number_of_attemps 카드를 찾습니다. 해당 카드에 다음과 같이 평균 시도 횟수가 표시됩니다.

43de290f9f1a0ac9.png

여기에서 얻은 통계를 사용하여 게임의 평균 난이도를 최적화할 수 있습니다. 예를 들어 평균 시도 횟수가 1에 너무 가까우면 게임을 조금 더 어렵게 만드는 것이 좋습니다.

사용자가 마지막에 레벨을 클리어하지 못했지만 힌트를 얻어 질문을 해결하려고 시도했나요?

사용자가 레벨을 건너뛰기로 결정하면 level_fail 이벤트가 트리거됩니다. 사용자의 결정에는 여러 가지 이유가 있을 수 있습니다.

하지만 사용자가 보상형 동영상 광고를 시청한 후 게임에서 힌트를 제공할 수 있으므로 사용자가 힌트의 도움을 받아 레벨을 클리어하려고 했는지 여부를 아는 것이 중요합니다.

이벤트 보고서에서 level_fail 이벤트를 클릭합니다. level_fail 이벤트 보고서에서 hint_used 카드를 찾습니다. hint_used 이벤트 매개변수의 평균 수가 표시됩니다. 힌트가 사용된 경우 매개변수 값은 1이고 힌트가 사용되지 않은 경우 0입니다.

313814372cd7c8a4.png

hint_used 카드에 표시된 숫자가 0에 가까우면 보상 (힌트)이 사용자에게 충분히 도움이 되지 않는다는 신호입니다. 또한 보상형 동영상 광고의 수익을 늘릴 기회를 놓치게 됩니다.

따라서 사용자가 게임에 더 깊이 참여할 수 있도록 더 큰 보상을 제공하여 보상형 동영상 광고의 수익을 늘리는 것이 좋습니다.

각 게임에서 평균적으로 몇 개의 레벨이 클리어되었나요?

Awesome Drawing Quiz의 각 게임에는 총 6개의 레벨이 있습니다. 사용자가 6개 레벨을 완료하면 (각 레벨을 클리어했는지 실패했는지와 관계없이) number_of_correct_answers을 매개변수로 사용하여 game_complete 이벤트가 트리거됩니다. number_of_correct_answers 매개변수는 사용자가 정답을 제공한 레벨 수를 나타냅니다.

이벤트 보고서에서 game_complete 이벤트를 클릭합니다. game_complete 이벤트 보고서에서 number_of_correct_answers 카드를 찾습니다. number_of_correct_answers 이벤트 매개변수의 평균 수가 표시됩니다.

d9eeaa019d1bceb4.png

클리어한 레벨의 평균 수가 너무 낮다면 사용자가 초반 레벨을 더 쉽게 클리어하여 흥미를 잃지 않고 게임을 계속 플레이할 수 있도록 게임의 레벨을 재정렬하는 것이 좋습니다.

11. 완료

AdMob+Firebase 101 Android Codelab을 완료했습니다. 이 Codelab의 완료된 코드는 android_studio_folder.png101-complete_and_102-base 폴더에서 확인할 수 있습니다.

AdMob+Firebase Codelab의 다음 부분에서는 유입경로를 사용하여 앱 이벤트 흐름을 시각화하는 방법을 알아봅니다. 다음 파트에서는 원격 구성과 A/B 테스트를 사용하여 앱 업데이트 없이 게임의 매개변수 값을 최적화하는 방법도 다룹니다.