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

เมื่อเปิดใช้การเพิ่มประสิทธิภาพแอปด้วยการตั้งค่าเริ่มต้น 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 มองไม่เห็นการเรียกใช้เมธอดแบบสตริงแบบไดนามิก การเพิ่มประสิทธิภาพจึง อาจทำให้โค้ดของคุณใช้งานไม่ได้

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

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

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

Kotlin

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

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile("proguard-android-optimize.txt"),

                // File with your custom rules
                "proguard-rules.pro"
            )
           // ...
        }
    }
    // ...
}

Groovy

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile('proguard-android-optimize.txt'),

                // File with your custom rules.
                'proguard-rules.pro'
            )
           // ...
        }
    }
    // ...
}

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

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

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

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

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

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

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