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 หรือยัง" คำตอบ "NO"
- ตั้งชื่อแอป "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
- เลือกเพิ่มโปรเจ็กต์ แล้วตั้งชื่อโปรเจ็กต์ของคุณว่า "Awesome Drawing Quiz" ตรวจสอบว่าปุ่มตัวเลือกเปิดใช้ Google Analytics สำหรับโปรเจ็กต์นี้เปิดอยู่
- เลือกบัญชี Google Analytics ที่คุณวางแผนจะใช้ โดยส่วนใหญ่ การเลือกตัวเลือกบัญชีเริ่มต้นสำหรับ Firebase ก็น่าจะเพียงพอแล้ว แต่หากคุณมีบัญชี Google Analytics อื่นที่ต้องการใช้ ให้เลือกบัญชีนั้นที่นี่
- คลิกสร้างโปรเจ็กต์
เพิ่มแอป Android
- จากหน้าจอภาพรวมของโปรเจ็กต์ใหม่ ให้คลิกเพิ่ม Firebase ลงในแอป Android
- ป้อนชื่อแพ็กเกจของ Codelab: com.codelab.awesomedrawingquiz
- ตั้งชื่อเล่นให้แอป: Awesome Drawing Quiz
- เว้นช่อง SHA-1 ว่างไว้เนื่องจากไม่จำเป็นสำหรับ SHA-1 สำหรับโปรเจ็กต์นี้
- เลือกลงทะเบียนแอปเพื่อลงทะเบียนแอป
เพิ่มไฟล์ google-services.json ในแอป
ถัดไป ระบบจะแจ้งคุณในหน้าจอที่คุณสามารถดาวน์โหลดไฟล์การกำหนดค่าที่มีข้อมูลเมตา Firebase ทั้งหมดที่จำเป็นสำหรับแอป คลิกดาวน์โหลด google-service.json แล้วคัดลอกไฟล์ไปยังไดเรกทอรี app ในโปรเจ็กต์ของคุณ
ประกาศเวอร์ชันทรัพยากร 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
- ลงชื่อเข้าใช้บัญชี AdMob ที่ https://apps.admob.com
- คลิก "แอป" ในแถบด้านข้าง
- เลือก "แบบทดสอบการวาดภาพสุดเจ๋ง" หากไม่เห็นแอปในรายชื่อแอปล่าสุด ให้คลิกดูแอปทั้งหมดเพื่อค้นหาจากรายชื่อแอปทั้งหมดที่คุณเพิ่มลงใน 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. เพิ่มเหตุการณ์ของแอป
เพื่อทำความเข้าใจเส้นทางของผู้ใช้อย่างลึกซึ้งในแบบทดสอบการวาดภาพสุดเจ๋ง คุณจะกำหนดเหตุการณ์ที่กำหนดเอง 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 อย่างรวดเร็ว คุณต้องเปิดใช้โหมดแก้ไขข้อบกพร่องในอุปกรณ์การพัฒนาเพื่ออัปโหลดเหตุการณ์โดยใช้ความล่าช้าน้อยที่สุด
หากต้องการเปิดใช้โหมดแก้ไขข้อบกพร่อง ให้ทําตามขั้นตอนต่อไปนี้
- เปิดหน้าต่างเครื่องมือเทอร์มินัลใน Android Studio (มุมมอง > หน้าต่างเครื่องมือ > เทอร์มินัล)
- เรียกใช้คำสั่งต่อไปนี้ (ตรวจสอบว่าอุปกรณ์ 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
คุณเข้าถึงข้อมูลโดยละเอียดเกี่ยวกับแต่ละเหตุการณ์ได้โดยคลิกที่ชื่อเหตุการณ์ ภาพหน้าจอต่อไปนี้แสดงรายละเอียดพารามิเตอร์ที่เชื่อมโยงกับเหตุการณ์ level_start
ดังตัวอย่างต่อไปนี้
โปรดดูรายละเอียดเพิ่มเติมที่บทความในศูนย์ช่วยเหลือของ DebugView
9. เปิดใช้มิติข้อมูลและเมตริกที่กำหนดเอง
โดยค่าเริ่มต้น Google Analytics สําหรับ Firebase จะรวบรวมจํานวนเหตุการณ์ทั้งหมด คุณต้องเปิดการรายงานสําหรับพารามิเตอร์นั้นอย่างชัดแจ้งสําหรับพารามิเตอร์เหตุการณ์แต่ละรายการที่สนใจ จากนั้น Google Analytics สำหรับ Firebase จะสามารถแสดงการ์ดเพิ่มเติมเพื่อแสดงสถิติของพารามิเตอร์ที่กำหนดเอง
วิธีบันทึกมิติข้อมูลและเมตริกที่กำหนดเอง
- ไปที่คอนโซล Firebase แล้วเลือกโปรเจ็กต์แบบทดสอบการวาดภาพสุดเจ๋งที่คุณสร้างไว้ก่อนหน้านี้
- คลิก Analytics > เหตุการณ์จากเมนูการนำทาง
- คลิกจัดการคำจำกัดความที่กำหนดเอง
- ในแท็บมิติข้อมูลที่กำหนดเอง ให้คลิกสร้างมิติข้อมูลที่กำหนดเอง
- ในช่องชื่อพารามิเตอร์เหตุการณ์ ให้ป้อน 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
อาจมีหลายสาเหตุในการตัดสินใจของผู้ใช้
อย่างไรก็ตาม เนื่องจากเกมสามารถให้คำแนะนำหลังจากที่ดูโฆษณาวิดีโอที่มีการให้รางวัล คุณจึงต้องทราบว่าผู้ใช้พยายามผ่านด่านโดยใช้คำแนะนำหรือไม่
คลิกเหตุการณ์ 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
เหตุการณ์จากรายงานเหตุการณ์ ค้นหาการ์ด number_of_correct_answers
ในรายงานเหตุการณ์ game_complete คุณจะเห็นจำนวนพารามิเตอร์เหตุการณ์โดยเฉลี่ย number_of_correct_answers
รายการ
หากจำนวนระดับที่เคลียร์ไปแล้วโดยเฉลี่ยต่ำเกินไป คุณควรพิจารณาจัดเรียงด่านในเกมใหม่เพื่อช่วยให้ผู้ใช้ผ่านด่านก่อนหน้าได้ง่ายขึ้น เพื่อให้ผู้ใช้เล่นเกมของคุณต่อได้โดยไม่เบื่อ
11. เสร็จเรียบร้อย
คุณศึกษา Codelab เกี่ยวกับ Android ของ AdMob+Firebase 101 เสร็จสมบูรณ์แล้ว คุณดูโค้ดที่สมบูรณ์ของ Codelab นี้ได้ในโฟลเดอร์ 101-complete_and_102-base
ในส่วนถัดไปของ Codelab ของ AdMob+Firebase คุณจะได้เรียนรู้เกี่ยวกับวิธีใช้ Funnel เพื่อแสดงภาพโฟลว์เหตุการณ์ของแอป ในส่วนถัดไปจะกล่าวถึงวิธีใช้การกำหนดค่าระยะไกลและการทดสอบ A/B เพื่อเพิ่มประสิทธิภาพค่าพารามิเตอร์ในเกมโดยไม่ต้องอัปเดตแอป