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 Virtual Device)를 실행하는 Android Emulator

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

초급 중급 고급

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

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 개발 환경 설정

코드 다운로드

다음 버튼을 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

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

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

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

저장소에는 다음과 같은 4개의 폴더가 포함됩니다.

  • android_studio_folder.png기초 — 이 Codelab에서 빌드할 시작 코드입니다.
  • android_studio_folder.png101-complete_and_102-base — 이 Codelab 및 102 Codelab의 시작 조건을 정의합니다.
  • android_studio_folder.png102-complete — 102 Codelab을 위해 완료된 코드입니다.

시작 앱 가져오기

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

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

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

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

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

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

계정에서 AdMob 앱을 만들었다면 아래의 단계에 따라 새로운 보상형 동영상 광고 단위를 만드세요.

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

7672f41ec611101b.png

  1. 원하는 광고 단위의 이름을 입력합니다. 그런 다음 보상 수량을 1로, 보상 항목을 "hint" (앱에서 현재 사용자에게 제공하는 보상)로 설정합니다. 광고 단위 만들기를 클릭하여 새 보상형 동영상 광고 단위를 만듭니다.

6d067814a2c38264.png

  1. 성공적으로 생성되면 ff872a005a07b75e.png과 비슷한 안내가 표시됩니다.
  2. Android 프로젝트로 돌아가서 AdMob 앱 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. 프로젝트 추가를 선택하고 프로젝트 이름을 'Awesome Drawing Quiz'로 지정합니다. 이 프로젝트에 Google 애널리틱스 사용 설정 라디오 버튼이 켜져 있는지 확인합니다.
  3. 사용할 Google 애널리틱스 계정을 선택합니다. 대부분의 경우 Firebase용 기본 계정 옵션으로 충분하지만 다른 Google 애널리틱스 계정을 사용하려는 경우 여기에서 해당 계정을 선택하세요.
  4. 프로젝트 만들기를 클릭합니다.

Android 앱 추가하기

  1. 새 프로젝트의 개요 화면에서 Android 앱에 Firebase 추가를 클릭합니다.
  2. Codelab의 패키지 이름(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 Analytics 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 파일과 동기화합니다. 파일 > Sync Project with Gradle Files 메뉴를 사용하여 프로젝트를 Gradle 파일과 동기화합니다.

5. Firebase 프로젝트에 AdMob 연결

앱을 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 Console에서 다음과 같은 추가 기능이 제공됩니다.

수익 카드 (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

그림의 이름이 무엇인지 모를 경우 ‘SKIP’ 버튼을 클릭하여 레벨을 건너뛸 수 있습니다.

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

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_fail

사용자가 레벨을 건너뛸 때

레벨_이름, 시도_횟수, 경과_시간_초, 힌트_사용됨

game_complete

게임이 끝났을 때

number_of_correct_answers

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

이벤트 이름

매개변수 이름

설명

level_start

level_name

레벨에 표시되는 그림의 이름 (예: '바나나')

level_wrong_answer

level_name

사용자가 오답을 제출한 경우

ad_reward_prompt

ad_unit_id

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

ad_reward_impression

ad_unit_id

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

level_success

level_name

레벨에 표시되는 그림의 이름 (예: '바나나')

level_success

number_of_attempts

레벨 통과를 시도할 수 있는 횟수

level_success

elapsed_time_sec

레벨을 달성하는 데 걸린 시간(초)

level_success

hint_used

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

level_fail

level_name

레벨에 표시되는 그림의 이름 (예: '바나나')

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() {
   ...
}

다음으로, 이전에 GameViewModel에서 한 것처럼 AwesomeDrawingQuizViewModelFactory 클래스에서 새 속성을 추가합니다.

AwesomeDrawingQuizViewModelFactory.kt

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

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

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 스튜디오에서 Terminal 도구 창을 엽니다 (View > Tool Windows > Terminal).

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

위의 스크린샷에 따르면 지평선의 오답이 가장 많으므로 다른 수준에 비해 사용자가 어려움을 겪고 있음을 쉽게 알 수 있습니다.

여기에서 얻은 통계를 활용하면 초보 사용자에게 높은 유지율을 유지하기 위해 어려운 레벨을 제공하지 않을지 결정할 수 있습니다.

레벨을 완료하기 위해 시도한 평균 횟수는 얼마인가요?

Awesome Drawing Quiz에서 사용자는 각 레벨에 원하는 만큼 답변을 제출할 수 있습니다.

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개의 레벨을 완료하면 (각 레벨의 클리어 또는 실패 여부에 상관없이) game_complete 이벤트가 number_of_correct_answers를 매개변수로 사용하여 트리거됩니다. 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 테스트를 사용하여 게임에서 매개변수 값을 최적화하는 방법도 다룹니다.