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