เปิดใช้การเพิ่มประสิทธิภาพแอปด้วย R8

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

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

ภาพรวมการเพิ่มประสิทธิภาพ R8

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

  • การลดขนาดโค้ด (เรียกอีกชื่อหนึ่งว่า Tree Shaking): R8 จะระบุและนำ โค้ดที่เข้าถึงไม่ได้ออกจากแอปพลิเคชันและทรัพยากร Dependency ของไลบรารี โดยการวิเคราะห์จุดเริ่มต้นของแอป (เช่น Activities หรือ Services ที่กำหนดไว้ใน Manifest) R8 จะสร้างกราฟของโค้ดที่อ้างอิงและนำโค้ดที่ไม่มีการอ้างอิงออก

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

    • การแทนที่การเรียกใช้เมธอดด้วยเนื้อหาของเมธอดที่ถูกเรียก (Method Inlining): R8 จะแทนที่ตำแหน่งที่เรียกใช้เมธอดด้วยเนื้อหาจริง ของเมธอดที่ถูกเรียก ซึ่งจะช่วยลดค่าใช้จ่ายในการเรียกใช้ฟังก์ชันและช่วยให้ R8 ทำการเพิ่มประสิทธิภาพเพิ่มเติมได้

    • การผสานคลาส: R8 จะรวมชุดคลาสและอินเทอร์เฟซเป็น คลาสเดียว ซึ่งจะช่วยลดจำนวนคลาสในแอป ลดการใช้หน่วยความจำ และเพิ่มความเร็วในการเริ่มต้น

  • การปรับให้ยากต่อการอ่าน (Obfuscation) (เรียกอีกชื่อหนึ่งว่า การลดขนาด): R8 จะย่อชื่อคลาส ฟิลด์ และเมธอด (เช่น com.example.MyActivity อาจกลายเป็น a.b.a) เพื่อลดขนาดไฟล์ DEX

ตั้งแต่ปลั๊กอิน Android Gradle (AGP) เวอร์ชัน 8.12.0 เป็นต้นมา R8 ยังเพิ่มประสิทธิภาพทรัพยากรในขั้นตอนการเพิ่มประสิทธิภาพด้วย ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ การลดขนาดทรัพยากร ที่เพิ่มประสิทธิภาพ

เปิดใช้การเพิ่มประสิทธิภาพ

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

สำหรับ AGP เวอร์ชัน 9.3 ขึ้นไป

วิธีเปิดใช้การเพิ่มประสิทธิภาพแอปสำหรับ AGP 9.3 ขึ้นไป

  • ตั้งค่า enable = true ในบล็อก optimization ในสคริปต์บิลด์ระดับแอปของบิลด์ที่เผยแพร่
  • เพิ่มกฎการเก็บลงในไฟล์ที่มีคำต่อท้าย.keepในชุดซอร์ส src/<variant>/keepRules เช่น src/main/keepRules/custom-rules.keep

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

ดึงดูด

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

DSL รุ่นเดิมสำหรับ AGP เวอร์ชันต่ำกว่า 9.3

หากต้องการเปิดใช้การเพิ่มประสิทธิภาพแอป ให้ตั้งค่า isMinifyEnabled = true (สำหรับการเพิ่มประสิทธิภาพโค้ด) และ isShrinkResources = true (สำหรับการเพิ่มประสิทธิภาพทรัพยากร) ในสคริปต์บิลด์ระดับแอปของบิลด์ที่เผยแพร่ เราขอแนะนำให้เปิดใช้การตั้งค่าทั้ง 2 รายการเสมอ

DSL รุ่นเดิม (Kotlin)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

DSL รุ่นเดิม (ดึงดูด)

android {
    buildTypes {
        release {

            // Enables code optimizations.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

ปรับปรุงการเพิ่มประสิทธิภาพ R8

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

ใช้ ตัววิเคราะห์การกำหนดค่า R8 เพื่อช่วยปรับแต่งกฎการเก็บ

ตัววิเคราะห์การกำหนดค่า R8 ช่วยให้คุณทำสิ่งต่อไปนี้ได้

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

ตัววิเคราะห์การกำหนดค่า R8 พร้อมให้บริการใน AGP เวอร์ชัน 9.3.0-alpha05 หรือจาก R8 เวอร์ชัน 9.3.7-dev ดูข้อมูลเพิ่มเติมได้ที่หัวข้อวิเคราะห์การกำหนดค่า R8

เพิ่มประสิทธิภาพการลดขนาดทรัพยากรเพื่อให้แอปมีขนาดเล็กลง

AGP เวอร์ชัน 8.12.0 ได้เปิดตัวการลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ซึ่งมีเป้าหมายเพื่อผสานรวมการเพิ่มประสิทธิภาพทรัพยากรและการเพิ่มประสิทธิภาพโค้ดเพื่อสร้างแอปที่เล็กลงและเร็วขึ้น ก่อนที่จะมีการลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ เครื่องมือ Android Asset Packaging Tool (AAPT2) จะสร้างกฎการเก็บที่ถือว่าการลดขนาดทรัพยากรแยกจากการลดขนาดโค้ด ซึ่งมักจะเก็บโค้ดหรือทรัพยากรที่เข้าถึงไม่ได้ซึ่งอ้างอิงถึงกันไว้

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

เปิดใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ

หากต้องการเปิดใช้ไปป์ไลน์การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพใหม่สำหรับ AGP 8.12 หรือ 8.13 ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ gradle.properties ของโปรเจ็กต์

หากคุณใช้ AGP เวอร์ชัน 9.0.0 ขึ้นไป คุณไม่จำเป็นต้องตั้งค่า android.r8.optimizedResourceShrinking=true ระบบจะใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพโดยอัตโนมัติเมื่อเปิดใช้ isShrinkResources = true ในการกำหนดค่าบิลด์

ตรวจสอบและกำหนดค่าการตั้งค่าการเพิ่มประสิทธิภาพ R8

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

bash android.enableR8.fullMode=false # Remove this line from your codebase.

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

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

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

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

การเปลี่ยนแปลงลักษณะการทำงานของ AGP และ R8 เวอร์ชันต่างๆ

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

AGP เวอร์ชัน ฟีเจอร์ที่เปิดตัว
9.3 DSL ที่เรียบง่ายขึ้น:บล็อก `optimization {}` ใหม่ช่วยลดการกำหนดค่าที่จำเป็นลง โดยจะเปิดใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพเสมอ และกฎการเก็บเริ่มต้นของ Android เป็นแบบเลือกไม่ใช้

ชุดซอร์ส`keepRules`: หากใช้ DSL ใหม่ คุณต้องวางกฎการเก็บไว้ในชุดซอร์ส src/<variant>/keepRules ในไฟล์ที่มีคำต่อท้าย .keep ชุดแหล่งข้อมูลยังใช้ได้กับ DSL รุ่นเดิมด้วย

กฎผู้ใช้ KMP (Kotlin MultiPlatform): KMP ไม่จำเป็นต้องตั้งค่า publish = true อีกต่อไป และรองรับชุดซอร์ส src/<variant>/keepRules ที่มีนามสกุล .keep

โปรดทราบว่าระบบยังรองรับ DSL รุ่นเดิมอยู่
9.1 คลาสที่จัดแพ็กเกจใหม่โดยค่าเริ่มต้น: R8 จะจัดแพ็กเกจคลาสใหม่ (ย้ายคลาสไปยังแพ็กเกจที่ไม่มีชื่อที่ระดับบนสุด) เพื่อบีบอัด DEX เพิ่มเติม ซึ่งช่วยลดความจำเป็นในการระบุตัวเลือก -repackageclasses ดูข้อมูลเกี่ยวกับวิธีการทำงานและวิธีเลือกไม่ใช้ได้ที่หัวข้อตัวเลือกส่วนกลาง
9.0 การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ: เปิดใช้โดยค่าเริ่มต้น (ควบคุมโดยใช้ android.r8.optimizedResourceShrinking) การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ช่วยผสานรวมการลดขนาดทรัพยากรเข้ากับไปป์ไลน์การเพิ่มประสิทธิภาพโค้ด ซึ่งจะทำให้แอปมีขนาดเล็กลงและทำงานได้เร็วขึ้น การเพิ่มประสิทธิภาพทั้งการอ้างอิงโค้ดและการอ้างอิงทรัพยากรพร้อมกันจะช่วยระบุและนำทรัพยากรที่อ้างอิงจากโค้ดที่ไม่ได้ใช้เท่านั้นออก ซึ่งเป็นการปรับปรุงที่สำคัญจากกระบวนการเพิ่มประสิทธิภาพที่แยกกันก่อนหน้านี้

ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับแอปที่แชร์ทรัพยากรและโค้ดจำนวนมากในแนวตั้งของปัจจัยรูปแบบต่างๆ โดยมีการปรับปรุงขนาดแอปมากกว่า 50% การลดขนาดที่ได้จะทำให้การดาวน์โหลดมีขนาดเล็กลง การติดตั้งเร็วขึ้น และผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้นด้วยการเริ่มต้นที่เร็วขึ้น การแสดงผลที่ปรับปรุงแล้ว และ ANR ที่น้อยลง

การกรองกฎของไลบรารี: ระบบได้นำการรองรับตัวเลือกส่วนกลาง (เช่น -dontobfuscate) ในกฎผู้ใช้ของไลบรารีออกแล้ว และแอปจะกรองตัวเลือกเหล่านี้ออก ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ เพิ่มตัวเลือกส่วนกลาง

การตรวจสอบค่า Null ของ Kotlin: เพิ่มประสิทธิภาพโดยค่าเริ่มต้น (ควบคุมโดยใช้ -processkotlinnullchecks) นอกจากนี้ เวอร์ชันนี้ยังมีการปรับปรุงความเร็วบิลด์อย่างมาก ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ ตัวเลือกส่วนกลางสำหรับการเพิ่มประสิทธิภาพเพิ่มเติม

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

เพิ่มประสิทธิภาพโดยค่าเริ่มต้น: ระบบได้นำการรองรับ getDefaultProguardFile("proguard-android.txt") ออกแล้ว เนื่องจากมี -dontoptimize ซึ่งควรหลีกเลี่ยง ให้ใช้ "proguard-android-optimize.txt" แทน หากต้องการปิดใช้การเพิ่มประสิทธิภาพในแอปทั่วโลก ให้เพิ่มแฟล็กด้วยตนเองลงในไฟล์ ProGuard
8.12 การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ: เพิ่มการรองรับเบื้องต้น (ควบคุมโดยใช้ android.r8.optimizedResourceShrinking) การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ช่วยผสานรวมการลดขนาดทรัพยากรเข้ากับไปป์ไลน์การเพิ่มประสิทธิภาพโค้ด คุณต้องเปิดใช้ด้วยตนเองใน AGP เวอร์ชันนี้

การย้อนกลับ Logcat: เพิ่มการรองรับการย้อนกลับอัตโนมัติใน หน้าต่าง Logcat ของ Android Studio
8.6 การย้อนกลับที่ปรับปรุงแล้ว: รวมการย้อนกลับชื่อไฟล์และหมายเลขบรรทัดโดยค่าเริ่มต้นสำหรับ minSdk ทุกระดับ (ก่อนหน้านี้ต้องใช้ minSdk 26 ขึ้นไปในเวอร์ชัน 8.2)

การอัปเดต R8 จะช่วยให้มั่นใจได้ว่า Stack Trace จากบิลด์ที่ปรับให้ยากต่อการอ่าน (Obfuscation) จะอ่านได้ง่ายและชัดเจน เวอร์ชันนี้ปรับปรุงวิธีจับคู่หมายเลขบรรทัดและไฟล์แหล่งข้อมูล ทำให้เครื่องมือต่างๆ เช่น Logcat ของ Android Studio ย้อนกลับข้อขัดข้องไปยังซอร์สโค้ดเดิมได้ง่ายขึ้น
8.0 โหมดเต็มรูปแบบโดยค่าเริ่มต้น: โหมดเต็มรูปแบบของ R8 ให้การเพิ่มประสิทธิภาพที่ทรงพลังกว่ามาก โดยจะเปิดใช้โดยค่าเริ่มต้น คุณเลือกไม่ใช้ได้โดยใช้ android.enableR8.fullMode=false
7.0 โหมดเต็มรูปแบบพร้อมให้บริการ: เปิดตัวเป็นฟีเจอร์แบบเลือกใช้โดยใช้ android.enableR8.fullMode=true โหมดเต็มรูปแบบใช้การเพิ่มประสิทธิภาพที่ทรงพลังกว่าโดยกำหนดสมมติฐานที่เข้มงวดมากขึ้นเกี่ยวกับวิธีที่โค้ดของคุณใช้การสะท้อนและการทำงานแบบไดนามิกอื่นๆ แม้ว่าโหมดนี้จะลดขนาดแอปและปรับปรุงประสิทธิภาพ แต่คุณอาจต้องเพิ่มกฎการเก็บเพื่อป้องกันไม่ให้ระบบนำโค้ดที่จำเป็นออก