เกี่ยวกับกฎการเก็บ

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

สถานการณ์ที่พบบ่อยที่ต้องใช้กฎการเก็บ

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

  • โค้ดที่เข้าถึงโดยการสะท้อน: R8 ไม่สามารถระบุได้ว่าเมื่อใดที่มีการเข้าถึงคลาส ฟิลด์ หรือเมธอดด้วยการสะท้อน ตัวอย่างเช่น R8 ไม่สามารถระบุเมธอดที่ค้นหาตามชื่อโดยใช้ Class.getDeclaredMethod() หรือคำอธิบายประกอบที่ดึงข้อมูลด้วย Class.getAnnotation() ในกรณีเหล่านี้ R8 อาจเปลี่ยนชื่อเมธอดและคำอธิบายประกอบเหล่านี้ หรือนำออกทั้งหมด ซึ่งจะทำให้เกิด ClassNotFoundException หรือ NoSuchMethodException ในรันไทม์
  • โค้ดที่เรียกจาก Java Native Interface (JNI): เมื่อโค้ดแบบเนทีฟ (C หรือ C++) เรียกเมธอด Java หรือ Kotlin หรือโค้ด Java หรือ Kotlin เรียกโค้ด C++ ด้วย JNI การเรียกจะอิงตามการค้นหาสตริงแบบไดนามิกของชื่อเมธอด R8 ไม่สามารถมองเห็นการเรียกใช้เมธอดตามสตริงแบบไดนามิก ดังนั้นการเพิ่มประสิทธิภาพของ R8 อาจทำให้โค้ดของคุณเสียหาย

นี่ไม่ใช่รายการสถานการณ์ทั้งหมดที่ต้องใช้กฎการเก็บ แต่สถานการณ์เหล่านี้ครอบคลุมกรณีส่วนใหญ่ที่คุณอาจต้องใช้กฎการเก็บ

หากโค้ดของคุณเองใช้การสะท้อนหรือเรียกจาก JNI คุณสามารถใส่คำอธิบายประกอบโค้ดนั้นด้วย คำอธิบายประกอบ Jetpack Keep แทนการเขียนกฎการเก็บด้วยตนเอง ปลั๊กอิน Gradle จะสร้างกฎการเก็บจากคำอธิบายประกอบในเวลาบิลด์

วิธีเพิ่มกฎการเก็บลงในแอป

การกำหนดค่ากฎการเก็บจะขึ้นอยู่กับ AGP เวอร์ชันที่คุณใช้

โดยปกติแล้วแอปขนาดใหญ่จะมีโค้ดอยู่ในโมดูลไลบรารีหลายโมดูล ในกรณีเช่นนี้ การวางกฎการเก็บไว้ข้างๆ โค้ดที่กฎนั้นมีผลบังคับใช้ภายในโมดูลไลบรารีที่เฉพาะเจาะจงมักจะเป็นวิธีที่ดีกว่า ความแตกต่างที่สำคัญในการดูแลรักษากฎการเก็บสำหรับ ไลบรารีอยู่ที่วิธีที่คุณประกาศกฎเหล่านี้ภายในไฟล์ของโมดูลไลบรารี build.gradle.kts (หรือ build.gradle) ดูข้อมูลเพิ่มเติมได้ที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี

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

เพิ่มกฎลงในไฟล์ที่มีคำต่อท้าย .keep ในไดเรกทอรี src/<variant>/keepRules เช่น src/main/keepRules/custom-rules.keep โปรดทราบว่าการใช้ DSL ที่อัปเดตแล้วสำหรับ AGP 9.3 ขึ้นไปจะเปิดใช้การเพิ่มประสิทธิภาพทั้งโค้ดและทรัพยากร และ ไม่ กำหนดให้คุณต้องกำหนดไฟล์กฎการเก็บ Android เริ่มต้น (proguard-android-optimize.txt) อย่างชัดเจน เนื่องจากไฟล์นี้รวมอยู่ด้วยโดยค่าเริ่มต้น เว้นแต่จะละเว้นอย่างชัดเจน

Kotlin

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

ดึงดูด

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

ละเว้นกฎการเก็บแพลตฟอร์ม Android เริ่มต้น (ขั้นสูง)

AGP มีชุดกฎแพลตฟอร์ม Android เริ่มต้น หากต้องการละเว้นกฎเหล่านี้จากการกำหนดค่าของโปรเจ็กต์และจัดการกฎการเก็บทั้งหมดด้วยตนเอง ให้ตั้งค่า optimization.keepRules.includeDefault เป็น false

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
                keepRules {
                    includeDefault = false // The file with optimization
                    // rules for the Android platform is included by
                    // default. To omit this file, set this option to false.
                }
            }
        }
    }
}

ดึงดูด

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
                keepRules {
                    includeDefault = false // The file with optimization
                    // rules for the Android platform is included by
                    // default. To omit this file, set this option to false.
                }
            }
        }
    }
}

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

เพิ่มกฎลงในไฟล์ proguard-rules.pro ที่อยู่ในไดเรกทอรีรากของโมดูลแอป ไฟล์อาจมีอยู่แล้ว แต่หากไม่มี ให้สร้างไฟล์ขึ้น หากต้องการใช้ กฎในไฟล์ คุณต้องประกาศไฟล์ในไฟล์ระดับโมดูล build.gradle.kts (หรือ build.gradle)

โดยค่าเริ่มต้น ไฟล์บิลด์จะรวมไฟล์ proguard-android-optimize.txt ไว้ด้วย ไฟล์นี้มีกฎที่จำเป็นสำหรับโปรเจ็กต์ Android ส่วนใหญ่ ดังนั้นคุณควรปล่อยให้ไฟล์นี้อยู่ในไฟล์บิลด์ ไฟล์นี้อิงตามและแชร์ เนื้อหากับไฟล์ proguard-common.txt

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

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

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

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

android {
    buildTypes {
        release {
            minifyEnabled = true
            shrinkResources = true

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

เพิ่มกฎการเก็บ

เมื่อเพิ่มกฎการเก็บ คุณจะรวมตัวเลือกส่วนกลางและกำหนดกฎการเก็บของคุณเองได้

  • ตัวเลือกส่วนกลาง: ตัวเลือกส่วนกลางคือคำสั่งทั่วไปที่ส่งผลต่อวิธีที่ R8 ทำงานกับฐานของโค้ดทั้งหมด ดูข้อมูลเพิ่มเติมได้ที่ตัวเลือกส่วนกลาง

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

กฎการเก็บสำหรับผู้เขียนไลบรารี

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