การเพิ่มประสิทธิภาพสำหรับผู้เขียนคลัง

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