ในฐานะผู้เขียนไลบรารี คุณควรตรวจสอบว่านักพัฒนาแอปสามารถผสานรวมไลบรารีของคุณเข้ากับแอปได้อย่างง่ายดาย ขณะเดียวกันก็รักษาประสบการณ์การใช้งานที่มีคุณภาพสูงให้แก่ผู้ใช้ คุณควรตรวจสอบว่าไลบรารีของคุณเข้ากันได้กับการเพิ่มประสิทธิภาพ Android โดยไม่ต้องตั้งค่าเพิ่มเติม หรือระบุในเอกสารว่าไลบรารีอาจไม่เหมาะสำหรับการใช้งานใน Android
เอกสารประกอบนี้มีไว้สำหรับนักพัฒนาไลบรารีที่เผยแพร่แล้ว แต่ก็อาจเป็นประโยชน์สำหรับนักพัฒนาโมดูลไลบรารีภายในในแอปขนาดใหญ่ที่แบ่งออกเป็นโมดูล
หากคุณเป็นนักพัฒนาแอปและต้องการเรียนรู้เกี่ยวกับการเพิ่มประสิทธิภาพแอป Android โปรดดูหัวข้อเปิดใช้การเพิ่มประสิทธิภาพแอป หากต้องการดูข้อมูลเกี่ยวกับว่าควรใช้ไลบรารีใดบ้าง โปรดดูหัวข้อเลือกไลบรารีอย่างชาญฉลาด
ใช้ codegen แทนการสะท้อน
หากเป็นไปได้ ให้ใช้การสร้างโค้ด (codegen) แทนการสะท้อน ทั้ง Codegen และ Reflection เป็นแนวทางทั่วไปในการหลีกเลี่ยงโค้ดที่ซ้ำกันเมื่อเขียนโปรแกรม แต่ codegen เข้ากันได้กับเครื่องมือเพิ่มประสิทธิภาพแอปอย่าง R8 มากกว่า
- เมื่อใช้ codegen ระบบจะวิเคราะห์และแก้ไขโค้ดในระหว่างกระบวนการบิลด์ เนื่องจากไม่มีการเปลี่ยนแปลงที่สำคัญหลังจากเวลาคอมไพล์ เครื่องมือเพิ่มประสิทธิภาพจึงรู้ว่าโค้ดใดบ้างที่จำเป็นต้องใช้และโค้ดใดบ้างที่สามารถนำออกได้อย่างปลอดภัย
- เมื่อใช้การสะท้อนกลับ ระบบจะวิเคราะห์และจัดการโค้ดขณะรันไทม์ เนื่องจากโค้ดยังไม่เสร็จสมบูรณ์จนกว่าจะเรียกใช้ เครื่องมือเพิ่มประสิทธิภาพจึงไม่ทราบว่าจะนําโค้ดใดออกได้ เนื่องจากมีแนวโน้มที่จะนําโค้ดที่ใช้แบบไดนามิกผ่านรีเฟล็กชันออกในระหว่างรันไทม์ ซึ่งทําให้แอปขัดข้องสําหรับผู้ใช้
ไลบรารีสมัยใหม่จำนวนมากใช้ codegen แทนการสะท้อน ดูKSP สำหรับจุดแรกเข้าทั่วไปที่ใช้โดย Room, Dagger2 และอื่นๆ อีกมากมาย
กรณีที่สะท้อนแสงได้
หากจำเป็นต้องใช้ภาพสะท้อน คุณควรสะท้อนไปยังอย่างใดอย่างหนึ่งต่อไปนี้เท่านั้น
- ประเภทที่กําหนดเป้าหมายที่เฉพาะเจาะจง (ผู้ใช้งานหรือคลาสย่อยของอินเทอร์เฟซที่เฉพาะเจาะจง)
- โค้ดที่ใช้คําอธิบายประกอบรันไทม์ที่เฉพาะเจาะจง
การใช้การสะท้อนกลับด้วยวิธีนี้จะช่วยจำกัดต้นทุนรันไทม์และช่วยให้เขียนกฎการเก็บรักษาผู้บริโภคเป้าหมายได้
การสะท้อนกลับรูปแบบที่เฉพาะเจาะจงและมุ่งเน้นนี้เป็นรูปแบบที่คุณจะพบได้ทั้งในเฟรมเวิร์ก Android (เช่น เมื่อสร้างกิจกรรม มุมมอง และ Drawable) และไลบรารี AndroidX (เช่น เมื่อสร้าง WorkManager, ListenableWorker หรือ RoomDatabase) ในทางตรงกันข้าม การสะท้อนกลับแบบเปิดของ Gson ไม่เหมาะสําหรับการใช้งานในแอป Android
เขียนกฎการเก็บรักษาของผู้บริโภค
ไลบรารีควรจัดแพ็กเกจกฎการเก็บ "ผู้บริโภค" ซึ่งใช้รูปแบบเดียวกับกฎการเก็บของแอป ระบบจะรวมกฎเหล่านี้ไว้ในอาร์ติแฟกต์ไลบรารี (AAR หรือ JAR) และนำไปใช้โดยอัตโนมัติในระหว่างการเพิ่มประสิทธิภาพแอป Android เมื่อใช้ไลบรารี
ไลบรารี AAR
หากต้องการเพิ่มกฎของผู้บริโภคสำหรับไลบรารี AAR ให้ใช้ตัวเลือก consumerProguardFiles
ในสคริปต์บิลด์ของโมดูลไลบรารี Android ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับการสร้างโมดูลไลบรารี
Kotlin
android { defaultConfig { consumerProguardFiles("consumer-proguard-rules.pro") } ... }
Groovy
android { defaultConfig { consumerProguardFiles 'consumer-proguard-rules.pro' } ... }
ไลบรารี JAR
หากต้องการรวมกฎกับไลบรารี Kotlin/Java ที่จัดส่งเป็น JAR ให้ใส่ไฟล์กฎในไดเรกทอรี META-INF/proguard/
ของ JAR สุดท้ายพร้อมชื่อไฟล์ใดก็ได้
เช่น หากโค้ดของคุณอยู่ใน <libraryroot>/src/main/kotlin
ให้ใส่ไฟล์กฎของผู้บริโภคที่ <libraryroot>/src/main/resources/META-INF/proguard/consumer-proguard-rules.pro
แล้วระบบจะรวมกฎไว้ในตำแหน่งที่ถูกต้องใน JAR เอาต์พุต
ยืนยันว่า JAR สุดท้ายรวมกฎอย่างถูกต้องโดยตรวจสอบว่ากฎอยู่ในไดเรกทอรี META-INF/proguard
รองรับเครื่องมือบีบอัดวิดีโอต่างๆ (ขั้นสูง)
คุณสามารถปรับแต่งกฎให้กำหนดเป้าหมายเครื่องมือบีบอัดที่เฉพาะเจาะจง (R8 หรือ ProGuard) รวมถึงเวอร์ชันเครื่องมือบีบอัดที่เฉพาะเจาะจงได้ วิธีนี้ช่วยให้ไลบรารีทำงานได้อย่างมีประสิทธิภาพสูงสุดในโปรเจ็กต์ที่ใช้โปรแกรมบีบอัดเวอร์ชันใหม่ ในขณะเดียวกันก็อนุญาตให้ใช้กฎที่มีอยู่ต่อไปในโปรเจ็กต์ที่ใช้โปรแกรมบีบอัดเวอร์ชันเก่า
หากต้องการระบุกฎการบีบอัดที่กําหนดเป้าหมาย คุณต้องใส่กฎเหล่านั้นในตําแหน่งเฉพาะภายในคลัง AAR หรือ JAR ตามที่อธิบายไว้ด้านล่าง
In an AAR library:
consumer-proguard-rules.pro (legacy location)
classes.jar
└── META-INF
└── com.android.tools (targeted shrink rules location)
├── r8-from-<X>-upto-<Y>/<R8-rules-file>
└── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>
In a JAR library:
META-INF
├── proguard/<ProGuard-rules-file> (legacy location)
└── com.android.tools (targeted shrink rules location)
├── r8-from-<X>-upto-<Y>/<R8-rules-file>
└── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>
ซึ่งหมายความว่าระบบจะจัดเก็บกฎการบีบอัดที่กําหนดเป้าหมายไว้ในไดเรกทอรี META-INF/com.android.tools
ของ JAR หรือในไดเรกทอรี META-INF/com.android.tools
ภายในclasses.jar
ของ AAR
ในไดเรกทอรีนั้นอาจมีไดเรกทอรีหลายรายการที่มีชื่อในรูปแบบ r8-from-<X>-upto-<Y>
หรือ proguard-from-<X>-upto-<Y>
เพื่อระบุเวอร์ชันของโปรแกรมบีบอัดที่ใช้เขียนกฎในไดเรกทอรี
โปรดทราบว่าส่วน -from-<X>
และ -upto-<Y>
ไม่บังคับ เวอร์ชัน <Y>
ต้องระบุ และช่วงเวอร์ชันต้องต่อเนื่อง
ตัวอย่างเช่น r8-upto-8.0.0, r8-from-8.0.0-upto-8.2.0
และ r8-from-8.2.0
ประกอบกันเป็นชุดกฎการหดตัวที่กำหนดเป้าหมายที่ถูกต้อง R8 จะใช้กฎที่อยู่ในไดเรกทอรี r8-from-8.0.0-upto-8.2.0
ตั้งแต่เวอร์ชัน 8.0.0 ขึ้นไปแต่ไม่รวมเวอร์ชัน 8.2.0
เมื่อได้รับข้อมูลดังกล่าว ปลั๊กอิน Android Gradle จะเลือกกฎจากไดเรกทอรี R8 ที่ตรงกัน หากไลบรารีไม่ได้ระบุกฎการบีบอัดเป้าหมาย ปลั๊กอิน Gradle ของ Android จะเลือกกฎจากตำแหน่งเดิม (proguard.txt
สำหรับ AAR หรือ META-INF/proguard/<ProGuard-rules-file>
สำหรับ JAR)