เพิ่มตัวเลือกส่วนกลาง

R8 มีตัวเลือกส่วนกลางที่แก้ไขการเพิ่มประสิทธิภาพของ R8 ทั่วทั้งแอป หรือส่งผลต่อกฎการเก็บทุกรายการ ตัวเลือกเหล่านี้จะได้รับการดูแลในไฟล์ proguard-rules.pro พร้อมกับกฎการเก็บรักษา ตัวเลือกส่วนกลางบางรายการเหล่านี้ จะกำหนดค่าการเพิ่มประสิทธิภาพเพิ่มเติม ส่วนตัวเลือกอื่นๆ จะปิด การเพิ่มประสิทธิภาพบางด้าน

ตัวเลือกส่วนกลางสำหรับการเพิ่มประสิทธิภาพเพิ่มเติม

ตัวเลือกส่วนกลางต่อไปนี้ช่วยให้เพิ่มประสิทธิภาพได้เพิ่มเติม

  • -repackageclasses [<optional-package-name>]: จัดแพ็กเกจคลาสใหม่เป็นแพ็กเกจเดียวที่ระบุ เพื่อลดขนาดแอปเพิ่มเติม หากไม่ระบุชื่อแพ็กเกจที่ไม่บังคับ ระบบจะย้ายคลาสไปยังแพ็กเกจเริ่มต้นที่ว่างเปล่า การตั้งค่านี้เป็นค่าที่แนะนำสำหรับแอป
  • -allowaccessmodification: อนุญาตให้ R8 เปลี่ยน (โดยปกติคือขยาย) ระดับการเข้าถึงของคลาส ฟิลด์ และเมธอดเพื่อทำการเพิ่มประสิทธิภาพที่ครอบคลุมมากขึ้น เปิดใช้เมื่อใช้ proguard-android-optimize.txt ตั้งแต่ปลั๊กอิน Android Gradle (AGP) 8.2 เป็นต้นมา การกำหนดค่านี้จะเป็นค่าเริ่มต้นหากคุณใช้ R8 ในโหมดเต็ม

ต่อไปนี้เป็นตัวอย่างการกำหนดค่าที่เปิดใช้การเพิ่มประสิทธิภาพเพิ่มเติม

-repackageclasses
-allowaccessmodification

ตัวเลือกส่วนกลางในการจำกัดการเพิ่มประสิทธิภาพ

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

  • -dontoptimize: ป้องกันการเพิ่มประสิทธิภาพโค้ด เช่น การแทรกเมธอด ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง
  • -dontshrink: ป้องกันการนำโค้ดที่ไม่ได้อ้างอิงออกและการเพิ่มประสิทธิภาพโค้ด ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง
  • -dontobfuscate: ป้องกันการย่อชื่อคลาสและเมธอด ซึ่งจะมีประโยชน์อย่างยิ่งในการปิดการปกปิดโค้ดระหว่างการแก้ไขข้อบกพร่องเพื่อให้อ่าน Stack Trace ได้ง่ายขึ้น ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง
  • -keepattributes <attributes>: ยอมรับรายการแอตทริบิวต์ที่คั่นด้วยคอมมา ซึ่งควรเก็บไว้ หากไม่ได้ใช้ค่าเริ่มต้น proguard-android-optimize.txt R8 จะลบแอตทริบิวต์ทั้งหมด รวมถึง RuntimeVisibleAnnotations และ Signature แต่การเก็บแอตทริบิวต์เหล่านี้ไว้ก็อาจเป็นประโยชน์หากจำเป็นในกรณีต่างๆ เช่น การสะท้อน ดูรายการแอตทริบิวต์ที่คุณระบุได้ที่เก็บแอตทริบิวต์

เก็บแอตทริบิวต์

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

การดำเนินการแบบรีเฟลกทีฟบางอย่างกำหนดให้ต้องเก็บแอตทริบิวต์ที่เฉพาะเจาะจงไว้เพื่อ การดำเนินการที่สำเร็จ เช่น

  • เมื่อเข้าถึงโครงสร้างคลาสด้านในหรือด้านนอกโดยใช้ getEnclosingMethod() หรือ getDeclaredClasses() คุณจะต้องมีแอตทริบิวต์ EnclosingMethod และ InnerClasses
  • เมื่อเข้าถึงลายเซ็นทั่วไปโดยใช้ getTypeParameters() คุณจะต้องระบุแอตทริบิวต์ Signature
  • เมื่อเข้าถึงคำอธิบายประกอบโดยใช้ getAnnotation() คุณจะต้องมีแอตทริบิวต์ RuntimeVisibleAnnotations

แอตทริบิวต์ที่ต้องระบุโดยทั่วไป

เมื่อใช้ไฟล์ Proguard เริ่มต้น (proguard-android-optimize.txt หรือ proguard-android.txt) ปลั๊กอิน Android Gradle (AGP) จะเก็บแอตทริบิวต์ต่อไปนี้ไว้ โปรดทราบว่าแอตทริบิวต์บางรายการเหล่านี้ต้องใช้ AGP เวอร์ชันใหม่กว่า

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

หมายเหตุ: แอตทริบิวต์นี้จะคงอยู่โดยค่าเริ่มต้นตั้งแต่ AGP 7.1 และจำเป็นต้องคงไว้อย่างชัดเจนในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น
EnclosingMethod แอตทริบิวต์นี้จะอยู่ในคลาสภายในที่ไม่ใช่คลาสภายในหรือคลาสที่ไม่ระบุชื่อ โดยจะระบุเมธอดหรือตัวเริ่มต้นที่มีคลาสอยู่โดยตรง
InnerClasses แอตทริบิวต์นี้จะบันทึกข้อมูลเกี่ยวกับคลาสที่ซ้อนกัน (คลาสภายใน คลาสที่ซ้อนกันแบบคงที่ คลาสภายใน และคลาสที่ไม่ระบุชื่อ) ที่กำหนดไว้ภายในคลาสอื่น
LineNumberTable แอตทริบิวต์นี้จะแมปวิธีการของไบต์โค้ดกับหมายเลขบรรทัดที่เกี่ยวข้องในไฟล์ต้นฉบับ

หมายเหตุ: ระบบจะเก็บแอตทริบิวต์นี้ไว้โดยค่าเริ่มต้นตั้งแต่ Android Gradle Plugin (AGP) 8.6 เป็นต้นไป และจะต้องเก็บไว้อย่างชัดเจนในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น
RuntimeVisibleAnnotations แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่มองเห็นได้ในขณะรันไทม์โดยการรีเฟลกชัน

โดยปกติแล้ว หากใช้คำอธิบายประกอบในรันไทม์ แอปและกฎสำหรับผู้ใช้ไลบรารีจะต้องการคำอธิบายประกอบนี้เท่านั้นจากแอตทริบิวต์ *Annotation
RuntimeVisibleParameterAnnotations แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่มองเห็นได้ในรันไทม์โดยการรีเฟลกชันในพารามิเตอร์ของเมธอด
RuntimeVisibleTypeAnnotations แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่ใช้กับการใช้งานประเภทต่างๆ แทนที่จะเป็นเพียงการประกาศ แอตทริบิวต์นี้จะปรากฏในเวลาเรียกใช้
Signature แอตทริบิวต์นี้จะจัดเก็บลายเซ็นประเภททั่วไปเพิ่มเติมสำหรับคลาส เมธอด และฟิลด์ โดยเฉพาะเมื่อใช้ Generics (เช่น List<String>)
SourceFile แอตทริบิวต์นี้จะจัดเก็บชื่อของไฟล์ต้นฉบับ (ไฟล์ .kt หรือ .java) ที่ใช้คอมไพล์คลาส โดยดีบักเกอร์จะใช้ไฟล์นี้เป็นหลักเพื่อแสดงบรรทัดซอร์สโค้ดต้นฉบับเมื่อดำเนินการทีละขั้นตอนในโค้ด Java ที่คอมไพล์แล้ว ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ติดตามการดำเนินการกลับไปยังโค้ดที่เขียนไว้ได้

หมายเหตุ: แอตทริบิวต์นี้จะคงไว้โดยค่าเริ่มต้นตั้งแต่ AGP 8.2 และจะต้องคงไว้โดยชัดแจ้งในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น

สำหรับแอปที่ใช้ proguard-android-optimize.txt กฎการเก็บรักษาที่กำหนดโดย AGP จะเพียงพอในสถานการณ์ส่วนใหญ่ อย่างไรก็ตาม หากคุณเขียนโค้ดสำหรับไลบรารี คุณควรระบุแอตทริบิวต์ทั้งหมดที่ไลบรารีของคุณต้องการในกฎการเก็บรักษาของผู้บริโภค แม้ว่าจะมีการกำหนดไว้ในรายการนี้ก็ตาม ซึ่งจะช่วยให้มั่นใจได้ว่าคลังของคุณจะมีความแข็งแกร่งในกรณีที่นักพัฒนาแอปตัดสินใจไม่รวม proguard-android-optimize.txt

แอตทริบิวต์การเก็บรักษาเพิ่มเติม

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

แอตทริบิวต์ คำอธิบาย
MethodParameters แอตทริบิวต์นี้ให้ข้อมูลเกี่ยวกับพารามิเตอร์ของเมธอด โดยเฉพาะชื่อและแฟล็กการเข้าถึง
Exceptions แอตทริบิวต์นี้แสดงข้อยกเว้นที่ตรวจสอบแล้วซึ่งมีการประกาศเมธอดให้ส่ง

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

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

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

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