ในฐานะผู้เขียนไลบรารี คุณควรตรวจสอบว่านักพัฒนาแอปสามารถผสานรวมไลบรารีของคุณเข้ากับแอปได้อย่างง่ายดาย ขณะเดียวกันก็รักษาประสบการณ์การใช้งานที่มีคุณภาพสูงให้แก่ผู้ใช้ คุณควรตรวจสอบว่าไลบรารีของคุณเข้ากันได้กับการเพิ่มประสิทธิภาพ 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
เพิ่มประสิทธิภาพการสร้างไลบรารี AAR (ขั้นสูง)
โดยทั่วไปแล้ว คุณไม่ควรเพิ่มประสิทธิภาพการสร้างคลังโดยตรง เนื่องจากการเพิ่มประสิทธิภาพที่เป็นไปได้ในเวลาที่สร้างคลังมีจํากัดมาก เฉพาะในระหว่างการสร้างแอปพลิเคชันเมื่อรวมไลบรารีเป็นส่วนหนึ่งของแอปพลิเคชันเท่านั้นที่ R8 จะทราบวิธีใช้เมธอดทั้งหมดของไลบรารีและพารามิเตอร์ที่ส่ง ในฐานะนักพัฒนาไลบรารี คุณต้องพิจารณาหลายขั้นตอนของการเพิ่มประสิทธิภาพและคงลักษณะการทำงานไว้ ทั้งในช่วงที่สร้างไลบรารีและสร้างแอป ก่อนที่จะเพิ่มประสิทธิภาพไลบรารีนั้น
หากยังต้องการเพิ่มประสิทธิภาพไลบรารีเมื่อสร้าง โปรดทราบว่า Android Gradle Plugin รองรับการดำเนินการนี้
Kotlin
android { buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } configureEach { consumerProguardFiles("consumer-rules.pro") } } }
Groovy
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } configureEach { consumerProguardFiles "consumer-rules.pro" } } }
โปรดทราบว่าลักษณะการทํางานของ proguardFiles
แตกต่างจาก consumerProguardFiles
อย่างมาก
proguardFiles
จะใช้เมื่อสร้าง ซึ่งมักจะใช้ร่วมกับgetDefaultProguardFile("proguard-android-optimize.txt")
เพื่อกำหนดว่าควรเก็บส่วนใดของไลบรารีไว้ในระหว่างการสร้าง อย่างน้อยที่สุด นี่เป็น API สาธารณะของคุณconsumerProguardFiles
ในทางตรงกันข้ามจะได้รับการแพ็กเกจไว้ในไลบรารีเพื่อส่งผลต่อการเพิ่มประสิทธิภาพที่จะเกิดขึ้นในภายหลัง ระหว่างการสร้างแอปที่ใช้ไลบรารีของคุณ
เช่น หากไลบรารีใช้การแสดงผลเพื่อสร้างคลาสภายใน คุณอาจต้องกำหนดกฎการเก็บทั้งในส่วน proguardFiles
และ consumerProguardFiles
หากคุณใช้ -repackageclasses
ในบิลด์ของไลบรารี ให้จัดแพ็กเกจคลาสใหม่เป็นแพ็กเกจย่อยภายในแพ็กเกจของไลบรารี เช่น ใช้ -repackageclasses 'com.example.mylibrary.internal'
แทน -repackageclasses 'internal'
รองรับเครื่องมือบีบอัดวิดีโอต่างๆ (ขั้นสูง)
คุณสามารถปรับแต่งกฎให้กำหนดเป้าหมายเครื่องมือบีบอัดที่เฉพาะเจาะจง (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)