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 โฟลเดอร์ดังนี้
101-base - โค้ดเริ่มต้นที่คุณจะสร้างใน Codelab นี้
101-complete_and_102-base - โค้ดที่เสร็จสมบูรณ์สำหรับ Codelab นี้และโค้ดเริ่มต้นสำหรับ Codelab 102
102-complete - โค้ดที่เสร็จสมบูรณ์สำหรับ Codelab 102
นำเข้าแอปเริ่มต้น
เปิด Android Studio แล้วเลือก "นำเข้าโปรเจ็กต์" ในหน้าจอต้อนรับ จากนั้นเลือกไดเรกทอรี 101-base จากโค้ดที่คุณดาวน์โหลด
ตอนนี้คุณควรเปิดโปรเจ็กต์ใน Android Studio ได้แล้ว
3. ตั้งค่าหน่วยโฆษณาวิดีโอที่มีการให้รางวัล (ไม่บังคับ)
แอปเริ่มต้นมีหน่วยโฆษณาวิดีโอที่มีการให้รางวัลโดยเฉพาะเพื่อความสะดวกของคุณอยู่แล้ว คุณข้ามขั้นตอนนี้ได้หากไม่ต้องการสร้างบัญชีใหม่ภายใต้บัญชี AdMob
หากต้องการสร้างแอป AdMob ใหม่ในบัญชี โปรดทำตามวิธีการต่อไปนี้
- ไปที่คอนโซล AdMob
- จากเมนูแอป ให้คลิก "เพิ่มแอป"
- เมื่อระบบถามว่า "คุณได้เผยแพร่แอปบน Google Play หรือ App Store แล้วใช่ไหม" ให้ตอบว่า "ไม่"
- ตั้งชื่อแอปว่า "Awesome Drawing Quiz" เลือก "Android" เป็นแพลตฟอร์ม แล้วคลิก "เพิ่ม"
เมื่อสร้างแอป AdMob ในบัญชีแล้ว ให้ทำตามขั้นตอนที่อธิบายไว้ด้านล่างเพื่อสร้างหน่วยโฆษณาวิดีโอที่มีการให้รางวัลใหม่
- คลิกเมนูแอปในส่วนหน้าของ AdMob แล้วเลือก "Awesome Drawing Quiz" จากรายการแอป
- คลิกเพิ่มหน่วยโฆษณาเพื่อสร้างหน่วยโฆษณาวิดีโอที่มีการให้รางวัลใหม่
- เลือกมีการให้รางวัลสำหรับรูปแบบโฆษณา

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

- เมื่อสร้างสำเร็จแล้ว คุณจะเห็นวิธีการที่คล้ายกับต่อไปนี้

- กลับไปที่โปรเจ็กต์ 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
- ไปที่คอนโซล Firebase
- เลือกเพิ่มโปรเจ็กต์ แล้วตั้งชื่อโปรเจ็กต์ว่า "แบบทดสอบวาดภาพสุดเจ๋ง" ตรวจสอบว่าปุ่มตัวเลือกเปิดใช้ Google Analytics สำหรับโปรเจ็กต์นี้เปิดอยู่
- เลือกบัญชี Google Analytics ที่คุณวางแผนจะใช้ สําหรับผู้ใช้ส่วนใหญ่ การเลือกตัวเลือกบัญชีเริ่มต้นสําหรับ Firebase ก็เพียงพอแล้ว แต่หากมีบัญชี Google Analytics อื่นที่ต้องการใช้ ให้เลือกที่นี่
- คลิกสร้างโปรเจ็กต์
เพิ่มแอป Android
- จากหน้าจอภาพรวมของโปรเจ็กต์ใหม่ ให้คลิกเพิ่ม Firebase ลงในแอป Android
- ป้อนชื่อแพ็กเกจของโค้ดแล็บ: com.codelab.awesomedrawingquiz
- ตั้งชื่อเล่นให้แอป: แบบทดสอบวาดภาพสุดเจ๋ง
- เว้นช่อง SHA-1 ว่างไว้เนื่องจากโปรเจ็กต์นี้ไม่จำเป็นต้องใช้ SHA-1
- เลือกลงทะเบียนแอปเพื่อลงทะเบียนแอป
เพิ่มไฟล์ google-services.json ลงในแอป
จากนั้นระบบจะแจ้งให้คุณดาวน์โหลดไฟล์การกำหนดค่าที่มีข้อมูลเมตาของ Firebase ที่จำเป็นทั้งหมดสำหรับแอปของคุณ คลิกดาวน์โหลด google-service.json แล้วคัดลอกไฟล์ไปยังไดเรกทอรี
app ในโปรเจ็กต์

ประกาศเวอร์ชันการขึ้นต่อกัน
มาเริ่มกันด้วยการเพิ่มเวอร์ชันของทรัพยากร Dependency แต่ละรายการที่จำเป็นต่อการผสานรวม Firebase ในโปรเจ็กต์ เปิดไฟล์ dependencies.gradle ที่อยู่ในรูทของโปรเจ็กต์ จากนั้นเพิ่มปลั๊กอินของบริการ Google, SDK ของ Firebase Analytics และ SDK หลักของ Firebase
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 ทั้งหมด เลือกเมนูFile > Sync Project with Gradle Files เพื่อซิงค์โปรเจ็กต์กับไฟล์ Gradle
5. ลิงก์ AdMob กับโปรเจ็กต์ Firebase
ทำตามขั้นตอนด้านล่างเพื่อลิงก์แอปกับ Firebase
- ลงชื่อเข้าใช้บัญชี AdMob ที่ https://apps.admob.com
- คลิกแอปในแถบด้านข้าง
- เลือก "Awesome Drawing Quiz" หากไม่เห็นแอปในรายชื่อแอปล่าสุด ให้คลิกดูแอปทั้งหมดเพื่อค้นหาจากรายชื่อแอปทั้งหมดที่คุณได้เพิ่มลงใน AdMob
- คลิกการตั้งค่าแอปในแถบด้านข้าง
- คลิกลิงก์กับ Firebase
- เลือกตัวเลือก "ลิงก์กับโปรเจ็กต์ Firebase ที่มีอยู่และสร้างแอป Firebase ใหม่" จากนั้นเลือกโปรเจ็กต์ "Awesome Drawing Quiz" จากเมนูแบบเลื่อนลง
- หลังจากคลิกปุ่ม "ดำเนินการต่อ" คุณจะเห็นข้อความ "ลิงก์สำเร็จแล้ว" คลิกปุ่ม "เสร็จสิ้น" เพื่อดำเนินการให้เสร็จสมบูรณ์
เมื่อลิงก์แอป AdMob กับโปรเจ็กต์ Firebase แล้ว คุณจะใช้ฟีเจอร์เพิ่มเติมบางอย่างได้ทั้งในคอนโซล AdMob และ Firebase ดังนี้
การ์ดรายได้ (AdMob)
จากการ์ดรายได้ คุณจะดูแหล่งที่มาของรายได้ทั้งหมดที่เป็นไปได้ในที่เดียวได้ แหล่งที่มาของรายได้ที่รองรับมีดังนี้
- AdMob (โดยประมาณ)
- เครือข่ายโฆษณาที่ใช้สื่อกลาง (ที่พบ)
- การซื้อในแอป
- การซื้อผ่านอีคอมเมิร์ซ

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

รายงานโฆษณาที่มีการให้รางวัล (AdMob)
รายงานโฆษณาที่มีการให้รางวัลมีเมตริกหลากหลายที่จะช่วยให้ผู้เผยแพร่เนื้อหาเข้าใจวิธีที่ผู้ใช้โต้ตอบกับโฆษณาที่มีการให้รางวัล

การ์ดรายได้ทั้งหมด (Firebase)
หลังจากลิงก์แอป AdMob กับ Firebase แล้ว การ์ดรายได้ทั้งหมดในแดชบอร์ด Firebase จะแสดงรายได้จาก AdMob พร้อมกับการซื้อในแอปและการซื้ออีคอมเมิร์ซ

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

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

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

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

7. เพิ่มเหตุการณ์ของแอป
หากต้องการทําความเข้าใจเส้นทางของผู้ใช้ใน Awesome Drawing Quiz อย่างลึกซึ้ง คุณจะต้องกําหนดเหตุการณ์ที่กําหนดเอง 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, 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 | ชื่อของภาพวาดที่แสดงในระดับ (เช่น "กล้วย") |
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 | จำนวนด่านที่ผ่านในเกม |
สร้างคลาสตัวช่วยสำหรับการบันทึกเหตุการณ์ที่กำหนดเอง
หากต้องการบันทึกเหตุการณ์การวิเคราะห์อย่างง่ายดาย คุณจะต้องสร้างคลาส Helper เพื่อจัดการเหตุการณ์ที่กำหนดเอง
ก่อนอื่นให้สร้างไฟล์ 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 ได้กําหนดชื่อและพารามิเตอร์เหตุการณ์บางรายการ (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())
}
}
บันทึกเหตุการณ์ Analytics ในเกม
ในคลาส 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() และอัปเดตฟังก์ชัน 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_success และ level_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. แก้ไขข้อบกพร่องของเหตุการณ์ Analytics
คุณสามารถใช้ DebugView ในคอนโซล Firebase เพื่อยืนยันว่าระบบบันทึกเหตุการณ์อย่างถูกต้อง DebugView ช่วยให้คุณดูข้อมูลเหตุการณ์ดิบที่แอปบันทึกไว้ในอุปกรณ์การพัฒนาได้แบบเกือบเรียลไทม์
ซึ่งมีประโยชน์อย่างยิ่งสําหรับการตรวจสอบความถูกต้องในระยะการวัดผลของการพัฒนา และช่วยให้คุณค้นพบข้อผิดพลาดในการติดตั้งใช้งาน Analytics
เปิดใช้โหมดแก้ไขข้อบกพร่อง
โดยทั่วไปแล้ว ระบบจะจัดกลุ่มเหตุการณ์ที่บันทึกในแอปเป็นชุดในช่วงเวลาประมาณ 1 ชั่วโมงและอัปโหลดพร้อมกัน หากต้องการตรวจสอบการติดตั้งใช้งาน Analytics ในทันที คุณต้องเปิดใช้โหมดแก้ไขข้อบกพร่องในอุปกรณ์ที่ใช้พัฒนาซอฟต์แวร์เพื่ออัปโหลดเหตุการณ์โดยมีความล่าช้าน้อยที่สุด
หากต้องการเปิดใช้โหมดแก้ไขข้อบกพร่อง ให้ทำตามขั้นตอนต่อไปนี้
- เปิดหน้าต่างเครื่องมือ Terminal ใน Android Studio (ดู > หน้าต่างเครื่องมือ > Terminal)

- เรียกใช้คำสั่งต่อไปนี้ (ตรวจสอบว่าอุปกรณ์ Android สำหรับทดสอบเชื่อมต่อกับคอมพิวเตอร์หรือ Android Emulator กำลังทำงานอยู่)
adb shell setprop debug.firebase.analytics.app com.codelab.awesomedrawingquiz
การทำงานนี้จะยังคงอยู่จนกว่าคุณจะปิดใช้โหมดแก้ไขข้อบกพร่องอย่างชัดแจ้งโดยใช้คำสั่งต่อไปนี้
adb shell setprop debug.firebase.analytics.app .none.
แก้ไขข้อบกพร่องของเหตุการณ์ Analytics ด้วย DebugView
เมื่อเปิดใช้โหมดแก้ไขข้อบกพร่องในอุปกรณ์ทดสอบแล้ว ให้ไปที่โปรเจ็กต์ในคอนโซล Firebase แล้วเลือกข้อมูลวิเคราะห์ > DebugView จากเมนู จากนั้นในอุปกรณ์ทดสอบ ให้เล่นเกมเพื่อดูการบันทึกเหตุการณ์และแสดงในรายงาน DebugView

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

ดูรายละเอียดเพิ่มเติมได้ที่บทความในศูนย์ช่วยเหลือเกี่ยวกับ DebugView
9. เปิดใช้มิติข้อมูลและเมตริกที่กำหนดเอง
โดยค่าเริ่มต้น Google Analytics สําหรับ Firebase จะรวบรวมจํานวนเหตุการณ์ทั้งหมด สําหรับพารามิเตอร์เหตุการณ์แต่ละรายการที่คุณสนใจ คุณต้องเปิดการรายงานสําหรับพารามิเตอร์นั้นอย่างชัดเจน จากนั้น Google Analytics สำหรับ Firebase จะแสดงการ์ดเพิ่มเติมเพื่อแสดงสถิติของพารามิเตอร์ที่กำหนดเอง
วิธีลงทะเบียนมิติข้อมูลและเมตริกที่กำหนดเอง
- ไปที่คอนโซล Firebase แล้วเลือกโปรเจ็กต์ Awesome Drawing Quiz ที่คุณสร้างไว้ก่อนหน้านี้
- คลิกข้อมูลวิเคราะห์ > เหตุการณ์จากเมนูการนำทาง
- คลิกจัดการคำจำกัดความที่กำหนดเอง
- คลิกสร้างมิติข้อมูลที่กําหนดเองในแท็บมิติข้อมูลที่กําหนดเอง
- ในช่องชื่อพารามิเตอร์เหตุการณ์ ให้ป้อน level_name แล้วคลิกบันทึกเพื่อลงทะเบียนพารามิเตอร์ให้เสร็จสมบูรณ์

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

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

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

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

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