AdMob+Firebase 101 Android: การตั้งค่าและ ข้อมูลเบื้องต้นเกี่ยวกับ Analytics
เกี่ยวกับ Codelab นี้
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 เพื่อเพิ่มประสิทธิภาพค่าพารามิเตอร์ในเกมโดยไม่ต้องอัปเดตแอป