กิจกรรมและโปรแกรม

ใช้ R8 เพื่อลดขนาด เพิ่มประสิทธิภาพ และเร่งความเร็วแอป

ใช้เวลาอ่าน 5 นาที
ดูโปรไฟล์ของ Ben Weiss
Ben Weiss วิศวกรนักพัฒนาซอฟต์แวร์สัมพันธ์

ใช้ R8 เพื่อลดขนาด เพิ่มประสิทธิภาพ และเร่งความเร็วแอป

ยินดีต้อนรับเข้าสู่วันแรกของสัปดาห์ที่เน้นเรื่องประสิทธิภาพของ Android

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

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

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

หลังจากอ่านบทความนี้แล้ว โปรดดูวิดีโอแนะนำเครื่องมือเพิ่มประสิทธิภาพ R8 ในสัปดาห์ที่เน้นเรื่องประสิทธิภาพบน YouTube

วิธีที่ R8 ช่วยให้แอปมีประสิทธิภาพมากขึ้น

image.png

มาดูขั้นตอนที่สำคัญที่สุดที่เครื่องมือเพิ่มประสิทธิภาพ R8 ใช้เพื่อปรับปรุงประสิทธิภาพของแอปกัน

Tree Shaking เป็นขั้นตอนที่สำคัญที่สุดในการลดขนาดแอป ในระยะนี้ เครื่องมือเพิ่มประสิทธิภาพ R8 จะนำโค้ดที่ไม่ได้ใช้ออกจากไลบรารีที่แอปของคุณใช้ รวมถึงโค้ดที่ไม่ได้ใช้จากฐานของโค้ดของคุณเอง

Method Inlining จะแทนที่การเรียกใช้เมธอดด้วยโค้ดจริง ซึ่งช่วยปรับปรุงประสิทธิภาพการทำงานขณะรันไทม์

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

การลดขนาดโค้ด ใช้เพื่อเปลี่ยนชื่อคลาส ฟิลด์ และเมธอดให้สั้นลงและไม่มีความหมาย ดังนั้นแทนที่จะเป็น MyDataModel คุณอาจได้คลาสที่ชื่อว่า a ซึ่งเป็นสาเหตุที่ทำให้เกิดความสับสนมากที่สุดเมื่ออ่าน Stack Trace จากแอปที่เพิ่มประสิทธิภาพด้วย R8 (โปรดทราบว่าเราได้ ปรับปรุงส่วนนี้ใน AGP 9.0 แล้ว)

การลดขนาดทรัพยากร จะลดขนาดแอปเพิ่มเติมโดยนำทรัพยากรที่ไม่ได้ใช้ออก เช่น ไฟล์ XML และ Drawable

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

กรณีศึกษา: การปรับปรุงประสิทธิภาพของ Reddit ด้วย R8

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

image.png

คำบรรยาย: วิธีที่ R8 ปรับปรุงประสิทธิภาพของแอป Reddit

ทีมสังเกตเห็นว่าCold Start เร็วขึ้น 40% ข้อผิดพลาด "แอปพลิเคชันไม่ตอบสนอง" (ANR) ลดลง 30% การแสดงผลเฟรมดีขึ้น 25% และขนาดแอปเล็กลง 14%

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

อ่านเพิ่มเติมเกี่ยวกับการปรับปรุงของ Reddit ได้ในบล็อกของเรา

ผลข้างเคียงที่ไม่ใช่ด้านเทคนิคของการใช้ R8

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

image.png

ดังนั้นเราจึงเรียกการเพิ่มประสิทธิภาพโดยเจตนาว่าเป็นคุณธรรม

แนะนำให้คุณสร้างแอปที่มีประสิทธิภาพมากขึ้น

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

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

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

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

เปิดใช้ศักยภาพเต็มรูปแบบของเครื่องมือเพิ่มประสิทธิภาพ R8

เครื่องมือเพิ่มประสิทธิภาพ R8 จะใช้ "โหมดเต็มรูปแบบ" เป็นค่าเริ่มต้นตั้งแต่ปลั๊กอิน Android Gradle เวอร์ชัน 8.0 เป็นต้นไป หากมีการพัฒนาโปรเจ็กต์ของคุณมาหลายปีแล้ว โปรเจ็กต์อาจยังมีแฟล็กเดิมที่ใช้เพื่อปิดใช้เครื่องมือนี้อยู่ ให้ค้นหาบรรทัดนี้ในไฟล์ gradle.properties แล้วนำออก

android.enableR8.fullMode=false // delete this line to enable R8's full potential

ตอนนี้ให้ตรวจสอบว่าคุณได้เปิดใช้ R8 ในไฟล์ build.gradle.kts ของแอปสำหรับตัวแปรที่เผยแพร่แล้วหรือไม่ โดยเปิดใช้ได้ด้วยการตั้งค่า isMinifyEnabled และ isShrinkResources เป็น "จริง" นอกจากนี้ คุณยังส่งไฟล์การกำหนดค่าเริ่มต้นและที่กำหนดเองในขั้นตอนนี้ได้ด้วย

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

กรณีศึกษา: การปรับปรุงประสิทธิภาพของ Disney+

วิศวกรที่ Disney+ ลงทุนในการปรับปรุงประสิทธิภาพของแอปและกำลังเพิ่มประสิทธิภาพประสบการณ์ของผู้ใช้ในแอป บางครั้งการเปลี่ยนแปลงที่ดูเหมือนเล็กน้อยก็อาจส่งผลกระทบอย่างมาก ขณะตรวจสอบการกำหนดค่า R8 ทีมพบว่ามีการใช้แฟล็ก -dontoptimize ซึ่งมาจากไฟล์การกำหนดค่าเริ่มต้นที่ยังคงใช้ในแอปจำนวนมากในปัจจุบัน

หลังจากแทนที่ proguard-android.txt ด้วย proguard-android-optimize.txt ทีม Disney+ พบว่าประสิทธิภาพของแอปดีขึ้นอย่างมาก

image.png

หลังจากเปิดตัวแอปเวอร์ชันใหม่ที่มีการเปลี่ยนแปลงนี้ให้ผู้ใช้แล้ว Disney+ พบว่าแอปเริ่มต้นเร็วขึ้น 30% และผู้ใช้รับรู้ถึงข้อผิดพลาด ANR น้อยลง 25%

ปัจจุบันแอปจำนวนมากยังคงใช้ไฟล์ proguard-android.txt ซึ่งมีแฟล็ก -dontoptimize และนี่คือจุดที่การปรับปรุงเครื่องมือของเราเข้ามามีบทบาท

การสนับสนุนเครื่องมือ

ตั้งแต่ การอัปเดตฟีเจอร์ใหม่ของ Android Studio Narwhal 3 เป็นต้นไป คุณจะเห็นคำเตือน Lint เมื่อใช้ proguard-android.txt 

image.png

และตั้งแต่ AGP 9.0 เป็นต้นไป เราจะยุติการสนับสนุน ไฟล์นี้โดยสมบูรณ์ ซึ่งหมายความว่าคุณจะต้องย้ายข้อมูลไปใช้ proguard-android-optimize.txt

นอกจากนี้ เรายังลงทุนในฟีเจอร์ใหม่ของ Android Studio เพื่อให้การแก้ไขข้อบกพร่องของโค้ดที่เพิ่มประสิทธิภาพด้วย R8 ง่ายกว่าที่เคย ตั้งแต่ AGP 9.0 เป็นต้นไป ตอนนี้คุณสามารถยกเลิกการปรับให้ยากต่อการอ่าน (De-obfuscate) Stack Trace ภายใน Logcat ของ Android Studio สำหรับบิลด์ที่ประมวลผลด้วย R8 โดยอัตโนมัติ ซึ่งจะช่วยให้คุณระบุบรรทัดโค้ดที่ทำให้เกิดปัญหาได้อย่างแม่นยำ แม้ในแอปที่เพิ่มประสิทธิภาพอย่างเต็มที่ เราจะพูดถึงเรื่องนี้อย่างละเอียดมากขึ้นในบล็อกโพสต์วันพรุ่งนี้ในสัปดาห์ที่เน้นเรื่องประสิทธิภาพของ Android

ขั้นตอนถัดไป

ดูวิดีโอแนะนำเครื่องมือเพิ่มประสิทธิภาพ R8 ในสัปดาห์ที่เน้นเรื่องประสิทธิภาพบน YouTube

📣 เข้าร่วมภารกิจด้านประสิทธิภาพ

ถึงเวลาที่คุณจะได้เห็นสิทธิประโยชน์ด้วยตัวคุณเองแล้ว

เราขอท้าให้คุณเปิดใช้โหมดเต็มรูปแบบของ R8 สำหรับแอปของคุณ วันนี้

  1. ทำตามคำแนะนำสำหรับนักพัฒนาแอปเพื่อเริ่มต้นใช้งาน: เปิดใช้การเพิ่มประสิทธิภาพแอป.
  2. ตรวจสอบว่าคุณยังใช้ proguard-android.txt อยู่หรือไม่ แล้วแทนที่ด้วย proguard-android-optimize.txt
  3. จากนั้นวัดผลกระทบ อย่าเพียงแค่ รู้สึก ถึงความแตกต่าง แต่ให้ ยืนยัน ความแตกต่างนั้น วัดการเพิ่มประสิทธิภาพโดยปรับโค้ดจาก แอปตัวอย่าง Macrobenchmark ใน GitHub เพื่อวัดเวลาเริ่มต้นก่อนและหลัง

เรามั่นใจว่าคุณจะเห็นการปรับปรุงประสิทธิภาพของแอปอย่างมีนัยสำคัญ ใช้ #optimizationEnabled หากมีคำถามเกี่ยวกับการเปิดใช้หรือการแก้ปัญหา R8 เราพร้อมช่วยเหลือคุณ

เตรียมคำถามสำหรับเซสชัน Ask Android ในวันศุกร์

ใช้แฮชแท็ก #AskAndroid เพื่อถามคำถามเกี่ยวกับประสิทธิภาพ เราจะตรวจสอบคำถามของคุณตลอดทั้งสัปดาห์และตอบคำถามบางส่วนในเซสชัน Ask Android เกี่ยวกับประสิทธิภาพในวันศุกร์ที่ 21 พฤศจิกายน โปรดติดตามข้อมูลอัปเดตในวันพรุ่งนี้ ซึ่งเราจะเจาะลึกยิ่งขึ้นเกี่ยวกับการแก้ไขข้อบกพร่องและการแก้ปัญหา แต่ตอนนี้ให้เริ่มต้นใช้งาน R8 และเร่งความเร็วแอปของคุณ

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