เมื่อเปิดใช้การเพิ่มประสิทธิภาพแอปด้วยการตั้งค่าเริ่มต้น 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 มองไม่เห็นการเรียกใช้เมธอดแบบสตริงแบบไดนามิก การเพิ่มประสิทธิภาพจึง อาจทำให้โค้ดของคุณใช้งานไม่ได้
นี่ไม่ใช่รายการสถานการณ์ทั้งหมดที่ต้องใช้กฎการเก็บรักษา แต่สถานการณ์เหล่านี้ครอบคลุมกรณีส่วนใหญ่ที่คุณอาจต้องใช้กฎการเก็บรักษา
วิธีเพิ่มกฎการเก็บลงในแอป
การกำหนดค่ากฎการเก็บจะขึ้นอยู่กับเวอร์ชันของ AGP ที่คุณใช้
โดยปกติแล้ว แอปขนาดใหญ่จะมีโค้ดอยู่ในโมดูลไลบรารีหลายโมดูล ในกรณีเช่นนี้ การวางกฎ Keep ไว้ข้างโค้ดที่กฎนั้นใช้ภายในโมดูลไลบรารีที่เฉพาะเจาะจง
มักจะดีกว่า ความแตกต่างที่สำคัญในการรักษากฎการเก็บรักษาสำหรับไลบรารี
อยู่ที่วิธีประกาศกฎเหล่านี้ภายในไฟล์ 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 รุ่นเดิม (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
เพิ่มกฎการเก็บ
เมื่อเพิ่มกฎการเก็บ คุณจะรวมตัวเลือกส่วนกลางและกำหนด กฎการเก็บของคุณเองได้
ตัวเลือกส่วนกลาง: ตัวเลือกส่วนกลางคือคำสั่งทั่วไปที่มีผลต่อวิธีที่ R8 ทำงานในฐานของโค้ดทั้งหมด ดูข้อมูลเพิ่มเติมได้ที่ตัวเลือกส่วนกลาง
กฎ Keep: ต้องออกแบบกฎ Keep อย่างรอบคอบเพื่อให้คุณ ได้รับความสมดุลที่เหมาะสมระหว่างการเพิ่มประสิทธิภาพโค้ดให้ได้มากที่สุดโดยไม่ ทําให้แอปหยุดทํางานโดยไม่ตั้งใจ ดูวิธีเขียนกฎ Keep ได้ที่เพิ่ม กฎ Keep
กฎการเก็บรักษาสำหรับผู้เขียนไลบรารี
หลังจากทราบเกี่ยวกับตัวเลือกส่วนกลางและไวยากรณ์สำหรับกฎการเก็บรักษาแล้ว โปรดดูรายละเอียดเพิ่มเติมที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี