กรณีศึกษา

Tinder ลด Cold Start ของแอปลง 47% ด้วยเครื่องมือวิเคราะห์การกำหนดค่า R8 ใหม่

ใช้เวลาอ่าน 4 นาที
3 ผู้เขียน
Ajesh Pai, Ulises Uriel Verduzco Díaz , Tracy Agyemang

Tinder มีพันธกิจในการส่งเสริมและสร้างแรงบันดาลใจให้เกิดความสัมพันธ์ที่แท้จริงด้วยการทำให้การพบปะเป็นเรื่องง่ายและสนุกสำหรับคนโสดรุ่นใหม่ทุกรุ่น อย่างไรก็ตาม เมื่อฐานของโค้ดแอปพลิเคชัน Android มีขนาดใหญ่ขึ้น ความซับซ้อนก็เพิ่มขึ้นตามไปด้วย ก่อนที่จะพยายามเพิ่มประสิทธิภาพครั้งล่าสุด แอปพลิเคชันประมาณ 70% ไม่ได้รับการเพิ่มประสิทธิภาพ โดยมีไฟล์ dex 17 ไฟล์ ซึ่งรวมถึง 3 ไฟล์ที่ใช้สำหรับการเริ่มต้นระบบเท่านั้น แม้ว่าจะเปิดใช้ R8 แล้ว แต่ศักยภาพในการเพิ่มประสิทธิภาพส่วนใหญ่ก็ถูกบล็อกเนื่องจากกฎการเก็บรักษา และทีมไม่สามารถระบุได้ว่ากฎใดที่ขัดขวางการเพิ่มประสิทธิภาพ Tinder จึงหันมาใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 ใหม่เพื่อจัดการกับความท้าทายเหล่านี้ โดยลดเวลาเริ่มต้นระบบและลดข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) ที่ผู้ใช้รับรู้

การใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 ช่วยให้ Tinder ระบุและนำตัวบล็อกการเพิ่มประสิทธิภาพที่ไม่ได้ตั้งใจออกได้สำเร็จ ผลลัพธ์ที่ได้นั้นเกิดขึ้นทันทีและมีประสิทธิภาพ โดย Tinder ลดการเริ่มแอปแบบ Cold Start ได้ 47%, ลดขนาดการดาวน์โหลดแอปลง 28.98% (เหลือ 61.5 MB) และลด ANR ที่ผู้ใช้รับรู้ได้ 28%

เครื่องมือวิเคราะห์การกำหนดค่า 

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

เมตริกหลักที่แสดงในเครื่องมือวิเคราะห์การกำหนดค่า ได้แก่

  • คะแนนการลดขนาด: เปอร์เซ็นต์โค้ดที่ลดขนาดได้ด้วย R8
  • คะแนนการเพิ่มประสิทธิภาพ: เปอร์เซ็นต์ของโค้ดที่เปิดให้เพิ่มประสิทธิภาพ (เช่น การแทรกเมธอด การรวมคลาสแนวนอน)
  • คะแนนการปรับให้ยากต่อการอ่าน (Obfuscation): เปอร์เซ็นต์ของคลาส เมธอด และช่องที่ R8 เปลี่ยนชื่อได้เพื่อลดขนาด

ใช้เครื่องมือวิเคราะห์เพื่อตรวจสอบกฎการเก็บรักษาและผลกระทบของกฎ ดังนี้

  • ค้นหากฎแบบกว้าง: จำกัดขอบเขตของกฎทั้งแพ็กเกจที่จำกัดการเพิ่มประสิทธิภาพ R8 และระบุคลาส เมธอด และฟิลด์ที่เฉพาะเจาะจงซึ่งยกเว้นจากการลดขนาด การเพิ่มประสิทธิภาพ และการสร้างความสับสน
  • ปรับแต่งกฎ: กำหนดเป้าหมายเฉพาะคลาส/เมธอดที่ต้องใช้การสะท้อนเพื่อปลดล็อกการเพิ่มประสิทธิภาพ
  • นำกฎที่ซ้ำซ้อนออก: นำกฎที่ตรงกับคลาส เมธอด หรือฟิลด์เป็นศูนย์ในบิลด์ปัจจุบันออก
  • กฎที่เหมือนกัน: กฎการเก็บรักษาที่เหมือนกันหมายถึงกฎที่กำหนดเป้าหมายคลาส ฟิลด์ และเมธอดเดียวกัน หรือการประกาศกฎการเก็บรักษาที่ซ้ำกันในไฟล์กฎการเก็บรักษาเดียวกันหรือข้ามไฟล์
  • ค้นหากฎที่รวมอยู่: ล้างกฎที่เฉพาะเจาะจงซึ่งครอบคลุมอยู่ในการกำหนดค่าที่กว้างขึ้นแล้ว
  • ระบุไลบรารีที่มีปัญหา: ตรวจสอบผลกระทบด้านการเพิ่มประสิทธิภาพโดยรวมของกฎการเก็บรักษาของผู้ใช้ที่ผสานรวมจากไลบรารีทั้งหมด
R8-Configuration-Analyzer-Screenshot.png
รายงาน R8 Configuration Analyzer ของแอปพลิเคชันตัวอย่าง

เราได้เผยแพร่ทักษะเครื่องมือวิเคราะห์ R8 เพื่อช่วยคุณใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 กับเครื่องมือ Agentic ทักษะนี้จะเพิ่มประสิทธิภาพเวิร์กโฟลว์การพัฒนาอัตโนมัติโดยสรุปรายงาน R8 Configuration Analyzer เพื่อแสดงเมตริกหลัก ได้แก่ คะแนนการเพิ่มประสิทธิภาพ การสร้างความสับสน และการลดขนาด นอกจากนี้ ยังไฮไลต์กฎการเก็บรักษาที่มีผลมากที่สุด 5 ข้อ เพื่อให้คุณทราบข้อมูลเชิงลึกที่ชัดเจนเกี่ยวกับสิ่งที่บล็อกการเพิ่มประสิทธิภาพโค้ด

การระบุตัวบล็อกการเพิ่มประสิทธิภาพที่ซ่อนอยู่

image.png

ก่อนที่จะผสานรวมเครื่องมือวิเคราะห์การกำหนดค่า R8 แอป Android ของ Tinder มีหนี้ทางเทคนิคจำนวนมากเนื่องจากฐานของโค้ดที่ไม่ได้เพิ่มประสิทธิภาพอย่างมาก การขาดการเพิ่มประสิทธิภาพนี้ส่งผลเสียต่อประสบการณ์ของผู้ใช้โดยตรง ทำให้ผู้ใช้พบปัญหา Cold Start ช้า 

เพื่อแก้ไขปัญหาเหล่านี้ ทีม Tinder ได้ใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 เพื่อตรวจสอบการกำหนดค่า R8 อย่างครอบคลุม เครื่องมือวิเคราะห์แสดงให้เห็นว่าการเพิ่มประสิทธิภาพฐานของโค้ดด้วย R8 อยู่ที่ประมาณ 28% แม้จะใช้โหมดเต็มรูปแบบของ R8 ก็ตาม เมื่อใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 ทาง Tinder พบว่าไลบรารีภายในใช้กฎการเก็บรักษาที่กว้างและไม่มีขอบเขต 

# Prevents optimization in all public classes along with all of their public and protected members

-keep public class * {
    public protected *;
}

กฎ "แบบกว้าง" นี้ครอบคลุมทรัพยากร Dependency ต่างๆ ทั่วทั้งแอปโดยไม่ตั้งใจ ซึ่งทำให้ไม่สามารถเพิ่มประสิทธิภาพในคลาสจำนวนมากได้ เนื่องจากกฎที่ครอบคลุมมากเกินไปช่วยป้องกันไม่ให้เกิดข้อขัดข้องขณะรันไทม์ นักพัฒนาแอปจึงมักพลาดการเพิ่มกฎใหม่สำหรับฟีเจอร์ใหม่ที่ใช้การสะท้อน ซึ่งทำให้ปัญหาที่ซ่อนอยู่สะสมมากขึ้นเรื่อยๆ

ทีมใช้ข้อมูลเชิงลึกจากเครื่องมือวิเคราะห์การกำหนดค่า R8 เพื่อติดตามและวิเคราะห์คลาสที่ได้รับผลกระทบจากกฎการเก็บรักษาแบบกว้างจากไลบรารีได้สำเร็จ ทีมค้นพบทันทีว่าการเพิ่มประสิทธิภาพถูกบล็อกในคลาสขนาดใหญ่ที่ไม่ได้เรียกใช้แบบไดนามิกซึ่ง R8 สามารถทำการเพิ่มประสิทธิภาพได้ การปรับแต่งกฎการเก็บรักษาที่เฉพาะเจาะจงนี้ช่วยให้ Tinder ปลดล็อกความสามารถในการเพิ่มประสิทธิภาพที่สำคัญ แก้ไขการกำหนดค่าเดิม และปรับปรุงตัวเลขการเพิ่มประสิทธิภาพโดยรวมได้อย่างมาก โดยคะแนน R8 เพิ่มขึ้นจาก 28% เป็น 50% ซึ่งช่วยเพิ่มประสิทธิภาพทั่วทั้งแอปพลิเคชันได้ทันที และทีม Tinder กำลังทำงานอย่างเต็มที่เพื่อปรับปรุงตัวเลขนี้ให้ดียิ่งขึ้น

  • โหลดเร็วขึ้น: ทีมลดจำนวนผู้ใช้ที่พบปัญหา Cold Start ช้าของแอปลงได้ 47%
  • ขนาดเล็กลง: ขนาดการดาวน์โหลดแอปลดลงจาก 86.6 MB เหลือ 61.5 MB (ลดลง 28.98%)
  • ความเสถียรที่ดีขึ้น: ข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) ที่ผู้ใช้รับรู้ลดลงจาก 0.35% เหลือ 0.28% ซึ่งทำให้ใกล้เคียงกับค่ามัธยฐานของแอปเทียบเท่าอย่างมาก
  • ความซับซ้อนลดลง: จำนวนไฟล์ DEX ทั้งหมดลดลงจาก 17 เหลือ 11 ไฟล์ ซึ่งรวมถึงไฟล์เริ่มต้นเพียง 2 ไฟล์

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

  • การมีส่วนร่วมระดับภูมิภาค: ประเทศที่อุปกรณ์ RAM ต่ำครองส่วนแบ่งตลาดขนาดใหญ่มีการมีส่วนร่วมเพิ่มขึ้นมากที่สุด และการลดอัตรา ANR เป็นกุญแจสำคัญในการปรับปรุงการมีส่วนร่วมในตลาดขนาดใหญ่นี้
  • การเติบโตของการมีส่วนร่วม: การมีส่วนร่วมเพิ่มขึ้น 3% นับตั้งแต่มีการเพิ่มประสิทธิภาพแอป
image.png

การปกป้องประสิทธิภาพในอนาคตด้วยการรวมอย่างต่อเนื่อง

การจัดการกับการลดขนาดโค้ดไม่ใช่การแก้ไขเพียงครั้งเดียว แต่ต้องมีการเฝ้าระวังอย่างต่อเนื่อง ทีม Android ของ Tinder ได้รับแรงบันดาลใจจากประสิทธิภาพที่เพิ่มขึ้นอย่างมากจากการใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 จึงได้ผสานรวมการตรวจสอบการเพิ่มประสิทธิภาพเข้ากับเวิร์กโฟลว์ประจำวันในเชิงรุกเพื่อป้องกันการถดถอย

ทีมของ Tinder ได้เพิ่มงานใหม่ในไปป์ไลน์ CI/CD เพื่อรายงานการเปลี่ยนแปลงในสถิติการเพิ่มประสิทธิภาพ เพื่อให้ทุกคนเห็นว่าการมีส่วนร่วมของตนส่งผลต่อการเพิ่มประสิทธิภาพอย่างไร  เมื่อให้คำแนะนำแก่นักพัฒนาแอปรายอื่นๆ ที่พิจารณาการผสานรวมการกำหนดค่า R8 ทีมได้เน้นย้ำถึงความสำคัญของการตรวจสอบทรัพยากร Dependency ภายใน แม้ว่าไลบรารีของบุคคลที่สามที่ได้รับความนิยมส่วนใหญ่จะมีกฎที่กำหนดไว้อย่างดี แต่โปรเจ็กต์ภายในบริษัทที่ถือว่า "เสถียร" อาจใช้กฎแบบกว้างๆ ซึ่งส่งผลเสียต่อการเพิ่มประสิทธิภาพโดยรวม

สรุปประเด็นสำคัญ

เมื่อต้องเผชิญกับฐานของโค้ดที่ไม่มีการเพิ่มประสิทธิภาพอย่างมากและไฟล์ DEX จำนวนมาก Tinder จึงต้องการวิธีตรวจสอบกฎการลดขนาดของแอปอย่างหมดจด เครื่องมือวิเคราะห์การกำหนดค่า R8 มีเครื่องมือที่จำเป็นและเหมาะสมในการระบุกฎไลบรารีภายในที่กว้างเกินไป คลาสที่ได้รับผลกระทบจากกฎการเก็บรักษา ซึ่งช่วยให้ทีมเพิ่มประสิทธิภาพฐานของโค้ดได้อย่างมั่นใจ ด้วยเหตุนี้ Tinder จึงลด Cold Start ได้เกือบครึ่งหนึ่ง ลดขนาด APK ได้มากกว่า 28% และสร้างรากฐานที่มีประสิทธิภาพและเสถียรยิ่งขึ้นสำหรับผู้ใช้ โดยทีมงานกำลังทำงานอย่างแข็งขันเพื่อปรับปรุงตัวเลขเหล่านี้ให้ดียิ่งขึ้น

วิธีใช้เครื่องมือวิเคราะห์การกำหนดค่า R8

คุณสามารถใช้เครื่องมือวิเคราะห์การกำหนดค่า R8 และฟีเจอร์แบบสแตนด์อโลนได้ตามเวอร์ชันปลั๊กอิน Android Gradle (AGP) ปัจจุบัน ดังนี้

1. รุ่น AGP 9.3: เครื่องมือวิเคราะห์การกำหนดค่า R8 ผสานรวมและเผยแพร่พร้อมกับ AGP 9.3 อย่างสมบูรณ์ เมื่อเรียกใช้บิลด์ที่เผยแพร่ R8 ระบบจะสร้างรายงานในโฟลเดอร์ `build/outputs/mapping/release/configanalyzer.html`

2. งาน Gradle แบบสแตนด์อโลน: AGP 9.3 เปิดตัวงาน Gradle แบบสแตนด์อโลนที่ช่วยให้คุณสร้างรายงานเครื่องมือวิเคราะห์ได้โดยไม่ต้องเรียกใช้บิลด์ที่เผยแพร่แบบเต็ม ซึ่งจะช่วยให้ได้รับความคิดเห็นที่รวดเร็วยิ่งขึ้นเมื่อปรับแต่งกฎการเก็บรักษาในเครื่อง ดังนี้

./gradlew :app:analyzeReleaseR8Config

ระบบจะสร้างรายงานที่ build/reports/r8/r8-config-analyzer-release.html.

3. การใช้งานใน AGP เวอร์ชันเก่า: หากใช้เวอร์ชันที่ต่ำกว่า AGP 9.3 คุณไม่จำเป็นต้องย้ายข้อมูล AGP ทั้งเวอร์ชันเพื่อวิเคราะห์การกำหนดค่า คุณสามารถอัปเดตเวอร์ชัน R8 เป็น 9.3.7-dev ขึ้นไปได้โดยทำตามวิธีการแทนที่ R8 ใน AGP หากต้องการสร้างรายงานในเครื่อง ให้เรียกใช้บิลด์โดยระบุพร็อพเพอร์ตี้ดังนี้

./gradlew assembleRelease  -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับเครื่องมือวิเคราะห์การกำหนดค่า R8

เขียนโดย
อ่านต่อ