AdMob+Firebase 101 Android: การตั้งค่า & ข้อมูลเบื้องต้นเกี่ยวกับ Analytics

1. บทนำ

โฆษณาเป็นส่วนสำคัญของประสบการณ์ของผู้ใช้แอปโดยรวม การติดตั้งใช้งานโฆษณาที่ดีจะช่วยปรับปรุงประสบการณ์แอปโดยรวม และยังปรับปรุงการคงผู้ใช้ไว้และการมีส่วนร่วมของผู้ใช้อีกด้วย ตัวอย่างเช่น โฆษณาที่มีการให้รางวัลช่วยให้คุณสามารถระบุสกุลเงินหรือไอเท็มในแอปสำหรับผู้ใช้ในการดูโฆษณาวิดีโอ เพื่อให้ผู้ใช้สามารถไต่ระดับถึงระดับใหม่ เพื่อป้องกันไม่ให้ผู้ใช้ติดขัดหรือเลิกใช้งาน

อย่างไรก็ตาม การสร้างประสบการณ์ใช้งานโฆษณาที่ยอดเยี่ยมนั้นไม่ใช่เรื่องง่าย คุณอาจมีคำถาม เช่น คุณควรแสดงโฆษณาเหล่านี้บ่อยเพียงใด คุณควรแสดงชิ้นงานดังกล่าวที่ไหนและเมื่อใด รางวัลควรเป็นอะไร อย่างไรก็ตาม คำตอบนั้นแตกต่างไปตามแอปแต่ละรายการและตามแต่ละตำแหน่ง ไม่มีคำตอบที่ตายตัว

Google Analytics สำหรับ Firebase, AdMob และเครื่องมืออื่นๆ ที่ทรงพลังแต่ใช้งานง่ายของ Firebase ทำให้คุณปรับแต่งแอปโดยอิงตามข้อมูลได้ง่ายและมีประสิทธิภาพมากขึ้น วันนี้เราจะแสดงวิธีเริ่มต้นใช้งาน

สิ่งที่คุณจะสร้าง

Codelab นี้เป็น Codelab แรกจาก 3 อย่างที่จะแนะนำคุณตลอดขั้นตอนการสร้างแอปชื่อ Awesome Drawing Quiz ซึ่งเป็นเกมที่ให้ผู้เล่นเดาชื่อภาพวาด ซึ่งจะสาธิตวิธีการรวมเอาโฆษณาที่มีการให้รางวัลและบริการ Firebase เข้ากับเกม

ใน Codelab นี้ คุณจะได้ผสานรวม Google Analytics สำหรับ Firebase เพื่อบันทึกเหตุการณ์สำคัญบางอย่างในแอป และได้เรียนรู้วิธีอ่านการวิเคราะห์แอปที่แสดงในคอนโซล Firebase ด้วย

หากพบปัญหา (ข้อบกพร่องของโค้ด ข้อผิดพลาดด้านไวยากรณ์ การใช้คำที่ไม่ชัดเจน ฯลฯ) ขณะดำเนินการใน Codelab โปรดรายงานปัญหาผ่านลิงก์รายงานข้อผิดพลาดที่มุมล่างซ้ายของ Codelab

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่า Google Analytics สำหรับ Firebase ในแอป
  • วิธีบันทึกเหตุการณ์ของแอป
  • วิธีอ่านการวิเคราะห์แอปที่แสดงในคอนโซล Firebase

สิ่งที่คุณต้องมี

  • Android Studio เวอร์ชัน 4.1 ขึ้นไป
  • บัญชี Google
  • อุปกรณ์ทดสอบที่ใช้ Android 5.0 ขึ้นไปที่มีสาย USB เพื่อเชื่อมต่ออุปกรณ์ หรือโปรแกรมจำลอง Android ที่ใช้ AVD (อุปกรณ์เสมือน Android) ที่มีอิมเมจระบบที่รองรับ Play Store/Google APIs

คุณจะให้คะแนนประสบการณ์การใช้งาน AdMob ในระดับใด

มือใหม่ ระดับกลาง ผู้ชำนาญ

คุณจะให้คะแนนประสบการณ์การใช้งาน Firebase ในระดับใด

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์

ดาวน์โหลดโค้ด

คลิกปุ่มต่อไปนี้เพื่อดาวน์โหลดโค้ดทั้งหมดสำหรับ Codelab นี้:

แตกไฟล์ ZIP ที่ดาวน์โหลด การดำเนินการนี้จะคลายแพ็กโฟลเดอร์รูทชื่อ admob-firebase-codelabs-android

...หรือโคลนที่เก็บ GitHub จากบรรทัดคำสั่ง

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

ที่เก็บประกอบด้วย 4 โฟลเดอร์ดังต่อไปนี้

  • android_studio_folder.png101-base — โค้ดเริ่มต้นที่คุณจะสร้างใน Codelab นี้
  • android_studio_folder.png101-complete_and_102-base — โค้ดสำหรับ Codelab นี้และ เงื่อนไขเริ่มต้นสำหรับ Codelab 102
  • android_studio_folder.png102-complete — โค้ดสำหรับ Codelab 102 เสร็จสมบูรณ์

นำเข้าแอปเริ่มต้น

เปิด Android Studio แล้วเลือก "นำเข้าโปรเจ็กต์" ในหน้าจอต้อนรับ จากนั้นเลือกไดเรกทอรี 101-base จากโค้ดที่คุณดาวน์โหลดมา

ตอนนี้คุณควรเปิดโปรเจ็กต์ใน Android Studio แล้ว

3. ตั้งค่าหน่วยโฆษณาวิดีโอที่มีการให้รางวัล (ไม่บังคับ)

แอปเริ่มต้นมีหน่วยโฆษณาวิดีโอที่มีการให้รางวัลโดยเฉพาะเพื่อความสะดวกของคุณ คุณสามารถข้ามขั้นตอนนี้ไปได้ หากไม่ต้องการสร้างบัญชีใหม่ในบัญชี AdMob

ทำตามวิธีการต่อไปนี้เพื่อสร้างแอป AdMob ใหม่ในบัญชี

  1. ไปที่คอนโซล AdMob
  2. จากเมนูแอป ให้คลิก "เพิ่มแอป"
  3. เมื่อระบบถามว่า "คุณได้เผยแพร่แอปใน Google Play หรือ App Store หรือยัง" คำตอบ "NO"
  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 และรหัสหน่วยโฆษณาเป็นค่าเดิมที่คุณสร้างไว้ในขั้นตอนก่อนหน้า

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

  1. ไปที่คอนโซล Firebase
  2. เลือกเพิ่มโปรเจ็กต์ แล้วตั้งชื่อโปรเจ็กต์ของคุณว่า "Awesome Drawing Quiz" ตรวจสอบว่าปุ่มตัวเลือกเปิดใช้ Google Analytics สำหรับโปรเจ็กต์นี้เปิดอยู่
  3. เลือกบัญชี Google Analytics ที่คุณวางแผนจะใช้ โดยส่วนใหญ่ การเลือกตัวเลือกบัญชีเริ่มต้นสำหรับ Firebase ก็น่าจะเพียงพอแล้ว แต่หากคุณมีบัญชี Google Analytics อื่นที่ต้องการใช้ ให้เลือกบัญชีนั้นที่นี่
  4. คลิกสร้างโปรเจ็กต์

เพิ่มแอป Android

  1. จากหน้าจอภาพรวมของโปรเจ็กต์ใหม่ ให้คลิกเพิ่ม Firebase ลงในแอป Android
  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

ประกาศเวอร์ชันทรัพยากร Dependency

เริ่มด้วยการเพิ่มเวอร์ชันของทรัพยากร Dependency แต่ละรายการที่จำเป็นต่อการผสานรวม 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

เพิ่ม google-services เป็น classpath ในไฟล์ build.gradle ที่อยู่ในไดเรกทอรีรากของโปรเจ็กต์

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"

        ...
    }
}

...

จากนั้นใช้ปลั๊กอิน google-services โดยเพิ่มบรรทัดในไฟล์ app/build.gradle ดังนี้

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 ให้เพิ่ม Analytics SDK ไปยังทรัพยากร Dependency ของแอป

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 เพื่อตรวจสอบว่าทรัพยากร Dependency ทั้งหมดพร้อมใช้งานสำหรับแอป เลือก ไฟล์ > เมนูซิงค์โปรเจ็กต์ด้วยไฟล์ Gradle เพื่อซิงค์โปรเจ็กต์กับไฟล์ Gradle

5. ลิงก์ AdMob กับโปรเจ็กต์ Firebase

ทำตามขั้นตอนด้านล่างเพื่อลิงก์แอปกับ Firebase

  1. ลงชื่อเข้าใช้บัญชี AdMob ที่ https://apps.admob.com
  2. คลิก "แอป" ในแถบด้านข้าง
  3. เลือก "แบบทดสอบการวาดภาพสุดเจ๋ง" หากไม่เห็นแอปในรายชื่อแอปล่าสุด ให้คลิกดูแอปทั้งหมดเพื่อค้นหาจากรายชื่อแอปทั้งหมดที่คุณเพิ่มลงใน 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)

ระบบจะรวบรวมเหตุการณ์เฉพาะโฆษณา (การคลิก การแสดงผล และเหตุการณ์รางวัล) โดยอัตโนมัติและพร้อมใช้งานใน Google Analytics สําหรับ Firebase

bf77bd8c00c1441b.png

6. เรียกใช้โปรเจ็กต์

เมื่อคุณคอมไพล์และเรียกใช้โปรเจ็กต์แล้ว คุณจะเห็นหน้าจอต่อไปนี้เมื่อแอปเริ่มทำงาน

15f1d8041988974c.png

เมื่อคุณคลิกเริ่มเกม คุณจะเห็นภาพวาดบนหน้าจอ ภารกิจของคุณคือการเดาชื่อภาพวาดโดยใช้คำแนะนำที่แสดงอยู่ด้านบน ซึ่งคุณสามารถอนุมานตัวอักษรแรกและความยาวของชื่อภาพวาดได้

8e87e96256d6874a.png 9c4a0143c3234cb2.png

หากไม่รู้ว่าภาพวาดชื่ออะไร คุณข้ามระดับได้โดยคลิกปุ่ม "ข้าม"

คุณอาจต้องการเงื่อนงำเพิ่มเติมที่จะช่วยคุณเดาคำตอบ คุณสามารถดูเบาะแสเพิ่มเติมโดยคลิกปุ่ม "คำแนะนำ" และดูโฆษณาวิดีโอที่มีการให้รางวัล เมื่อดูโฆษณาจบแล้ว ระบบจะระบุตัวอักษรเพิ่มอีก 1 ตัวเป็นรางวัล

edcf6f0d833ea4ea.png 47ab9a07b1c71711.png

7. เพิ่มเหตุการณ์ของแอป

เพื่อทำความเข้าใจเส้นทางของผู้ใช้อย่างลึกซึ้งในแบบทดสอบการวาดภาพสุดเจ๋ง คุณจะกำหนดเหตุการณ์ที่กำหนดเอง 2-3 เหตุการณ์เพื่อติดตามพฤติกรรมของผู้ใช้ในเกม ดังนี้

ชื่อเหตุการณ์

ทริกเกอร์...

พารามิเตอร์

game_start

เมื่อผู้ใช้เริ่มเกมใหม่

ไม่มี

level_start

เมื่อผู้ใช้เริ่มระดับใหม่ (แบบทดสอบการวาดภาพใหม่) ภายในขั้นตอน (มี 6 ระดับใน 1 ขั้น)

level_name

level_wrong_answer

เมื่อผู้ใช้ส่งคำตอบผิด

level_name

ad_reward_prompt

เมื่อผู้ใช้แตะปุ่มคำแนะนำ และได้รับข้อความแจ้งให้ดูโฆษณาวิดีโอที่มีการให้รางวัล

ad_unit_id

ad_reward_impression

เมื่อผู้ใช้เริ่มดูโฆษณาวิดีโอที่มีการให้รางวัล

ad_unit_id

level_success

เมื่อผู้ใช้ส่งคำตอบที่ถูกต้อง (ล้างระดับ)

level_name, จำนวน_attempts, elapsed_time_sec, hint_used

level_fail

เมื่อผู้ใช้ข้ามระดับ

level_name, จำนวน_attempts, elapsed_time_sec, hint_used

game_complete

เมื่อเกมจบลง

number_of_correct_answers

คำอธิบายของแต่ละพารามิเตอร์ที่เชื่อมโยงกับแต่ละเหตุการณ์มีดังนี้

ชื่อเหตุการณ์

ชื่อพารามิเตอร์

คำอธิบาย

level_start

level_name

ชื่อของภาพวาดที่แสดงในระดับ (เช่น "กล้วย")

level_wrong_answer

level_name

เมื่อผู้ใช้ส่งคำตอบผิด

ad_reward_prompt

ad_unit_id

รหัสหน่วยโฆษณาที่ใช้แสดงโฆษณาวิดีโอที่มีการให้รางวัล

ad_reward_impression

ad_unit_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

จำนวนระดับที่เคลียร์ในเกม

สร้างคลาสตัวช่วยสำหรับการบันทึกเหตุการณ์ที่กำหนดเอง

หากต้องการบันทึกเหตุการณ์ Analytics อย่างง่ายดาย คุณจะต้องสร้างชั้นเรียนตัวช่วยเพื่อจัดการเหตุการณ์ที่กำหนดเอง

ขั้นแรก ให้สร้างไฟล์ Kotlin ใหม่ (ไม่ใช่คลาส Kotlin) และตั้งชื่อเป็น QuizAnalytics.kt ในแพ็กเกจ com.codelab.awesomedrawingquiz สร้างช่องที่ระบุชื่อของเหตุการณ์ที่กำหนดเองและพารามิเตอร์ของเหตุการณ์

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"

ถัดไป ให้เพิ่มฟังก์ชันส่วนขยายที่จะช่วยคุณบันทึกเหตุการณ์ที่กำหนดเองในเกม โปรดทราบว่าเหตุการณ์ที่กําหนดเองส่วนใหญ่จะมีพารามิเตอร์ เพื่อให้คุณมีบริบทมากขึ้นของแต่ละเหตุการณ์ นอกจากนี้ โปรดทราบว่า Analytics กำหนดชื่อและพารามิเตอร์เหตุการณ์ 2-3 รายการ (FirebaseAnalytics.Event.LEVEL_NAME และ FirebaseAnalytics.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 {
    ...
}

จากนั้นเพิ่มฟังก์ชัน provideFirebaseAnalytics() ในคลาส AwesomeDrawingQuiz และอัปเดตฟังก์ชัน 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()

    ...
}

ถัดไป เพิ่มเหตุการณ์ level_success และ level_wrong_answer ในฟังก์ชัน checkAnswer()

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)

        ...
    }
}

ถัดไป ให้เพิ่มเหตุการณ์ level_fail ในฟังก์ชัน skipLevel() เพื่อทําเครื่องหมายระดับเป็นล้มเหลว

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. แก้ไขข้อบกพร่องเหตุการณ์ Analytics

คุณสามารถใช้ DebugView ในคอนโซล Firebase เพื่อยืนยันว่าเหตุการณ์ได้รับการบันทึกอย่างถูกต้อง DebugView ช่วยให้คุณดูข้อมูลเหตุการณ์ดิบที่แอปของคุณบันทึกไว้ในอุปกรณ์การพัฒนาได้แบบเกือบเรียลไทม์

ซึ่งจะเป็นประโยชน์มากสำหรับการตรวจสอบในขั้นตอนการพัฒนาการใช้เครื่องมือ และช่วยให้คุณพบข้อผิดพลาดในการใช้ข้อมูลวิเคราะห์ได้

เปิดใช้โหมดแก้ไขข้อบกพร่อง

โดยทั่วไปแล้ว เหตุการณ์ที่บันทึกไว้ในแอปของคุณจะรวมอยู่ด้วยกันในช่วงระยะเวลาประมาณ 1 ชั่วโมง แล้วอัปโหลดไว้ด้วยกัน หากต้องการตรวจสอบการติดตั้งใช้งาน Analytics อย่างรวดเร็ว คุณต้องเปิดใช้โหมดแก้ไขข้อบกพร่องในอุปกรณ์การพัฒนาเพื่ออัปโหลดเหตุการณ์โดยใช้ความล่าช้าน้อยที่สุด

หากต้องการเปิดใช้โหมดแก้ไขข้อบกพร่อง ให้ทําตามขั้นตอนต่อไปนี้

  1. เปิดหน้าต่างเครื่องมือเทอร์มินัลใน Android Studio (มุมมอง > หน้าต่างเครื่องมือ > เทอร์มินัล)

c8dc1b4f08a224b8.png

  1. เรียกใช้คำสั่งต่อไปนี้ (ตรวจสอบว่าอุปกรณ์ Android ทดสอบเชื่อมต่อกับคอมพิวเตอร์หรือโปรแกรมจำลอง Android ทำงานอยู่)
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz

การทำงานนี้จะยังคงอยู่จนกว่าคุณจะปิดใช้โหมดแก้ไขข้อบกพร่องอย่างชัดแจ้งโดยใช้คำสั่งต่อไปนี้

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

แก้ไขข้อบกพร่องเหตุการณ์ Analytics ด้วย DebugView

เมื่อคุณเปิดใช้โหมดแก้ไขข้อบกพร่องในอุปกรณ์ทดสอบแล้ว ไปที่โปรเจ็กต์ในคอนโซล Firebase แล้วเลือก Analytics > DebugView จากเมนู จากนั้นเล่นเกมในอุปกรณ์ทดสอบเพื่อดูเหตุการณ์ที่บันทึกและแสดงในรายงาน DebugView

827059255d09ac00.png

คุณเข้าถึงข้อมูลโดยละเอียดเกี่ยวกับแต่ละเหตุการณ์ได้โดยคลิกที่ชื่อเหตุการณ์ ภาพหน้าจอต่อไปนี้แสดงรายละเอียดพารามิเตอร์ที่เชื่อมโยงกับเหตุการณ์ level_start ดังตัวอย่างต่อไปนี้

475db00d05d03ab8.png

โปรดดูรายละเอียดเพิ่มเติมที่บทความในศูนย์ช่วยเหลือของ DebugView

9. เปิดใช้มิติข้อมูลและเมตริกที่กำหนดเอง

โดยค่าเริ่มต้น Google Analytics สําหรับ Firebase จะรวบรวมจํานวนเหตุการณ์ทั้งหมด คุณต้องเปิดการรายงานสําหรับพารามิเตอร์นั้นอย่างชัดแจ้งสําหรับพารามิเตอร์เหตุการณ์แต่ละรายการที่สนใจ จากนั้น Google Analytics สำหรับ Firebase จะสามารถแสดงการ์ดเพิ่มเติมเพื่อแสดงสถิติของพารามิเตอร์ที่กำหนดเอง

วิธีบันทึกมิติข้อมูลและเมตริกที่กำหนดเอง

  1. ไปที่คอนโซล Firebase แล้วเลือกโปรเจ็กต์แบบทดสอบการวาดภาพสุดเจ๋งที่คุณสร้างไว้ก่อนหน้านี้
  2. คลิก Analytics > เหตุการณ์จากเมนูการนำทาง
  1. คลิกจัดการคำจำกัดความที่กำหนดเอง
  2. ในแท็บมิติข้อมูลที่กำหนดเอง ให้คลิกสร้างมิติข้อมูลที่กำหนดเอง
  3. ในช่องชื่อพารามิเตอร์เหตุการณ์ ให้ป้อน level_name แล้วคลิกบันทึกเพื่อลงทะเบียนพารามิเตอร์ให้เสร็จสมบูรณ์

3d20ee9d7de74e9b.png

  1. จากนั้นเลือกแท็บเมตริกที่กำหนดเอง แล้วคลิกสร้างเมตริกที่กำหนดเอง
  2. ป้อนชื่อพารามิเตอร์ หน่วยวัดสำหรับพารามิเตอร์ต่อไปนี้

ชื่อพารามิเตอร์

ประเภทพารามิเตอร์

หน่วยวัด

number_of_attempts

ตัวเลข

มาตรฐาน

hint_used

ตัวเลข

มาตรฐาน

elapsed_time_sec

ตัวเลข

วินาที

number_of_correct_answers

ตัวเลข

มาตรฐาน

10. รับข้อมูลเชิงลึกจากรายงานเหตุการณ์

เมื่อเพิ่มเหตุการณ์ 2-3 เหตุการณ์ในเกมแล้ว คุณควรจะตอบคำถามเกี่ยวกับพฤติกรรมของผู้ใช้เกมได้ ต่อไปนี้คือข้อมูลเชิงลึกบางส่วนที่คุณจะได้รับจากรายงานเหตุการณ์ Firebase

ระดับใดมีจำนวนคำตอบผิดมากที่สุด

ในการตอบคำถามนี้ คุณควรดูจำนวนเหตุการณ์ level_wrong_answer ที่มีการทริกเกอร์ในแต่ละระดับ

คลิก level_wrong_answer จากรายงานเหตุการณ์ ค้นหาการ์ด level_name ในรายงานเหตุการณ์ level_wrong_answer คุณจะเห็นค่าที่เชื่อมโยงกับพารามิเตอร์ level_name ในการ์ดดังกล่าวดังนี้

25da426bbc0c612c.png

จากภาพหน้าจอด้านบน คุณจะเห็นได้ง่ายๆ ว่าขอบฟ้ามีคำตอบที่ผิดมากที่สุด ซึ่งหมายความว่าผู้ใช้ใช้งานได้ยากเมื่อเทียบกับระดับอื่นๆ

ข้อมูลเชิงลึกจากที่นี่ทำให้คุณตัดสินใจได้ว่าจะไม่มอบระดับที่ยากให้กับผู้ใช้มือใหม่เพื่อรักษาอัตราการคงผู้ใช้ไว้ที่สูงเอาไว้

โดยเฉลี่ยแล้ว คุณพยายามเคลียร์ระดับใดระดับหนึ่ง

ในแบบทดสอบการวาดภาพสุดเจ๋ง ผู้ใช้จะส่งคำตอบสำหรับแต่ละระดับได้มากเท่าที่ต้องการ

เนื่องจากคุณเปิดใช้การรายงานพารามิเตอร์ในพารามิเตอร์ number_of_attempts ในเหตุการณ์ level_success คุณจึงดูเมตริกโดยละเอียดของพารามิเตอร์นั้นได้

คลิกเหตุการณ์ level_success จากรายงานเหตุการณ์ ค้นหาการ์ด number_of_attemps ในรายงานเหตุการณ์ level_success คุณจะเห็นจำนวนครั้งโดยเฉลี่ยในบัตรนั้นๆ ดังนี้

43de290f9f1a0ac9.png

คุณใช้ข้อมูลเชิงลึกจากที่นี่เพื่อเพิ่มระดับความยากของเกมโดยเฉลี่ยได้ ตัวอย่างเช่น หากจำนวนครั้งที่กำหนดโดยเฉลี่ยใกล้เคียงกับ 1 ครั้งเกินไป คุณอาจพิจารณาทำให้เกมท้าทายขึ้นอีกเล็กน้อย

ผู้ใช้พยายามตอบคำถามด้วยการรับคำแนะนำ แม้ว่าจะตอบคำถามไม่ได้ในขั้นสุดท้ายก็ตาม

เมื่อผู้ใช้ตัดสินใจข้ามระดับ ระบบจะทริกเกอร์เหตุการณ์ level_fail อาจมีหลายสาเหตุในการตัดสินใจของผู้ใช้

อย่างไรก็ตาม เนื่องจากเกมสามารถให้คำแนะนำหลังจากที่ดูโฆษณาวิดีโอที่มีการให้รางวัล คุณจึงต้องทราบว่าผู้ใช้พยายามผ่านด่านโดยใช้คำแนะนำหรือไม่

คลิกเหตุการณ์ level_fail จากรายงานเหตุการณ์ ค้นหาการ์ด hint_used ในรายงานเหตุการณ์ level_fail คุณจะเห็นจำนวนพารามิเตอร์เหตุการณ์โดยเฉลี่ย hint_used รายการ โปรดทราบว่าค่าของพารามิเตอร์คือ 1 หากมีการใช้คำแนะนำ และ 0 หากไม่มีการใช้คำแนะนำ

313814372cd7c8a4.png

หากตัวเลขในการ์ด hint_used เข้าใกล้ 0 แสดงว่ารางวัล (คำแนะนำ) ไม่มีประโยชน์มากพอสำหรับผู้ใช้เหล่านี้ นอกจากนี้ คุณจะเสียโอกาสในการเพิ่มรายได้จากโฆษณาวิดีโอที่มีการให้รางวัลอีกด้วย

ดังนั้น จึงควรเสนอรางวัลที่มากขึ้น เพื่อให้ผู้ใช้มีส่วนร่วมกับเกมได้ลึกซึ้งยิ่งขึ้น ซึ่งทำให้คุณได้รับรายได้เพิ่มขึ้นจากโฆษณาวิดีโอที่มีการให้รางวัล

โดยเฉลี่ยแล้วแต่ละเกมเคลียร์ได้กี่ระดับ

แต่ละเกมในแบบทดสอบการวาดภาพสุดเจ๋งจะมีทั้งหมด 6 ระดับ เมื่อผู้ใช้ผ่าน 6 ระดับแล้ว (ไม่ว่าจะล้างหรือล้มเหลวในแต่ละระดับ) ระบบจะทริกเกอร์เหตุการณ์ game_complete ด้วย number_of_correct_answers เป็นพารามิเตอร์ พารามิเตอร์ number_of_correct_answers ระบุจำนวนระดับที่ผู้ใช้ให้คำตอบที่ถูกต้อง

คลิก game_complete เหตุการณ์จากรายงานเหตุการณ์ ค้นหาการ์ด number_of_correct_answers ในรายงานเหตุการณ์ game_complete คุณจะเห็นจำนวนพารามิเตอร์เหตุการณ์โดยเฉลี่ย number_of_correct_answers รายการ

d9eeaa019d1bceb4.png

หากจำนวนระดับที่เคลียร์ไปแล้วโดยเฉลี่ยต่ำเกินไป คุณควรพิจารณาจัดเรียงด่านในเกมใหม่เพื่อช่วยให้ผู้ใช้ผ่านด่านก่อนหน้าได้ง่ายขึ้น เพื่อให้ผู้ใช้เล่นเกมของคุณต่อได้โดยไม่เบื่อ

11. เสร็จเรียบร้อย

คุณศึกษา Codelab เกี่ยวกับ Android ของ AdMob+Firebase 101 เสร็จสมบูรณ์แล้ว คุณดูโค้ดที่สมบูรณ์ของ Codelab นี้ได้ในโฟลเดอร์ android_studio_folder.png101-complete_and_102-base

ในส่วนถัดไปของ Codelab ของ AdMob+Firebase คุณจะได้เรียนรู้เกี่ยวกับวิธีใช้ Funnel เพื่อแสดงภาพโฟลว์เหตุการณ์ของแอป ในส่วนถัดไปจะกล่าวถึงวิธีใช้การกำหนดค่าระยะไกลและการทดสอบ A/B เพื่อเพิ่มประสิทธิภาพค่าพารามิเตอร์ในเกมโดยไม่ต้องอัปเดตแอป