ทักษะ Android
ดูใน GitHubตัววิเคราะห์ R8
android skills add --skill r8-analyzerคุณควรเพิ่มประสิทธิภาพแอปให้มีขนาดเล็กและทำงานได้เร็วที่สุดเพื่อมอบประสบการณ์การใช้งานที่ดีที่สุดแก่ผู้ใช้ ตัวเพิ่มประสิทธิภาพแอปของเราที่เรียกว่า R8 จะปรับปรุงแอปของคุณให้มีประสิทธิภาพมากขึ้นโดยนำโค้ดและทรัพยากรที่ไม่ได้ใช้ออก เขียนโค้ดใหม่เพื่อเพิ่มประสิทธิภาพรันไทม์ และอื่นๆ ซึ่งหมายความว่าผู้ใช้จะได้รับสิ่งต่อไปนี้
- เริ่มเล่นวิดีโอได้เร็วขึ้น
- ลดการใช้งานหน่วยความจำ
- ปรับปรุงการแสดงผลและประสิทธิภาพรันไทม์
- ลดจำนวน ANR
ภาพรวมการเพิ่มประสิทธิภาพ R8
R8 ใช้กระบวนการหลายขั้นตอนเพื่อเพิ่มประสิทธิภาพแอปในด้านขนาดและความเร็ว การดำเนินการที่สำคัญมีดังนี้
การลดขนาดโค้ด (เรียกอีกชื่อหนึ่งว่า Tree Shaking): R8 จะระบุและนำ โค้ดที่เข้าถึงไม่ได้ออกจากแอปพลิเคชันและทรัพยากร Dependency ของไลบรารี โดยการวิเคราะห์จุดเริ่มต้นของแอป (เช่น
ActivitiesหรือServicesที่กำหนดไว้ใน Manifest) R8 จะสร้างกราฟของโค้ดที่อ้างอิงและนำโค้ดที่ไม่มีการอ้างอิงออกการเพิ่มประสิทธิภาพเชิงตรรกะ: R8 จะเขียนโค้ดใหม่เพื่อปรับปรุงประสิทธิภาพการดำเนินการ และลดค่าใช้จ่าย เทคนิคที่สำคัญมีดังนี้
การแทนที่การเรียกใช้เมธอดด้วยเนื้อหาของเมธอดที่ถูกเรียก (Method Inlining): R8 จะแทนที่ตำแหน่งที่เรียกใช้เมธอดด้วยเนื้อหาจริง ของเมธอดที่ถูกเรียก ซึ่งจะช่วยลดค่าใช้จ่ายในการเรียกใช้ฟังก์ชันและช่วยให้ R8 ทำการเพิ่มประสิทธิภาพเพิ่มเติมได้
การผสานคลาส: R8 จะรวมชุดคลาสและอินเทอร์เฟซเป็น คลาสเดียว ซึ่งจะช่วยลดจำนวนคลาสในแอป ลดการใช้หน่วยความจำ และเพิ่มความเร็วในการเริ่มต้น
การปรับให้ยากต่อการอ่าน (Obfuscation) (เรียกอีกชื่อหนึ่งว่า การลดขนาด): R8 จะย่อชื่อคลาส ฟิลด์ และเมธอด (เช่น
com.example.MyActivityอาจกลายเป็นa.b.a) เพื่อลดขนาดไฟล์ DEX
ตั้งแต่ปลั๊กอิน Android Gradle (AGP) เวอร์ชัน 8.12.0 เป็นต้นมา R8 ยังเพิ่มประสิทธิภาพทรัพยากรในขั้นตอนการเพิ่มประสิทธิภาพด้วย ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ การลดขนาดทรัพยากร ที่เพิ่มประสิทธิภาพ
เปิดใช้การเพิ่มประสิทธิภาพ
หากต้องการเปิดใช้การเพิ่มประสิทธิภาพแอป ให้ใช้ DSL ที่เหมาะสมตามเวอร์ชัน AGP ของโปรเจ็กต์ เราขอแนะนำให้เปิดใช้การเพิ่มประสิทธิภาพแอปในแอปเวอร์ชันสุดท้ายที่คุณทดสอบก่อนเผยแพร่เท่านั้น ซึ่งโดยปกติจะเป็นบิลด์ที่เผยแพร่ เนื่องจากกระบวนการเพิ่มประสิทธิภาพจะเพิ่มเวลาบิลด์ของโปรเจ็กต์และอาจทำให้การแก้ไขข้อบกพร่องยากขึ้นเนื่องจากวิธีที่กระบวนการนี้แก้ไขโค้ด
สำหรับ AGP เวอร์ชัน 9.3 ขึ้นไป
วิธีเปิดใช้การเพิ่มประสิทธิภาพแอปสำหรับ AGP 9.3 ขึ้นไป
- ตั้งค่า
enable = trueในบล็อกoptimizationในสคริปต์บิลด์ระดับแอปของบิลด์ที่เผยแพร่ - เพิ่มกฎการเก็บลงในไฟล์ที่มีคำต่อท้าย
.keepในชุดซอร์สsrc/<variant>/keepRulesเช่นsrc/main/keepRules/custom-rules.keep
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
ดึงดูด
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
DSL รุ่นเดิมสำหรับ AGP เวอร์ชันต่ำกว่า 9.3
หากต้องการเปิดใช้การเพิ่มประสิทธิภาพแอป ให้ตั้งค่า isMinifyEnabled = true (สำหรับการเพิ่มประสิทธิภาพโค้ด)
และ isShrinkResources = true (สำหรับการเพิ่มประสิทธิภาพทรัพยากร) ในสคริปต์บิลด์ระดับแอปของบิลด์ที่เผยแพร่ เราขอแนะนำให้เปิดใช้การตั้งค่าทั้ง 2 รายการเสมอ
DSL รุ่นเดิม (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
DSL รุ่นเดิม (ดึงดูด)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
ปรับปรุงการเพิ่มประสิทธิภาพ R8
สิทธิประโยชน์ด้านประสิทธิภาพของ R8 สัมพันธ์โดยตรงกับปริมาณฐานของโค้ดที่ R8 สามารถเพิ่มประสิทธิภาพได้ ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อรับสิทธิประโยชน์สูงสุดจาก R8
- เปิดใช้ R8 ในโหมดเต็มรูปแบบ
- เปิดใช้การปรับให้ยากต่อการอ่าน (Obfuscation) การเพิ่มประสิทธิภาพ และการลดขนาด
- เปิดใช้การลดขนาดทรัพยากรและการลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ
- ปรับแต่งกฎการเก็บเพื่อให้คลาส ฟิลด์ และ เมธอดได้รับการเพิ่มประสิทธิภาพสูงสุด
ใช้ ตัววิเคราะห์การกำหนดค่า R8 เพื่อช่วยปรับแต่งกฎการเก็บ
ตัววิเคราะห์การกำหนดค่า R8 ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ติดตามและปรับปรุงคุณภาพการกำหนดค่า R8 โดยรวมด้วยการตรวจสอบเมตริกที่รายงานโดยตัววิเคราะห์การกำหนดค่า R8
- ค้นหากฎการเก็บที่กว้างที่สุด ซึ่งเป็นกฎที่ป้องกันการเพิ่มประสิทธิภาพมากที่สุด
- และทำความเข้าใจการเพิ่มประสิทธิภาพที่กฎดังกล่าวป้องกันเพื่อปรับแต่งกฎ
ตัววิเคราะห์การกำหนดค่า R8 พร้อมให้บริการใน AGP เวอร์ชัน 9.3.0-alpha05 หรือจาก R8 เวอร์ชัน 9.3.7-dev ดูข้อมูลเพิ่มเติมได้ที่หัวข้อวิเคราะห์การกำหนดค่า R8
เพิ่มประสิทธิภาพการลดขนาดทรัพยากรเพื่อให้แอปมีขนาดเล็กลง
AGP เวอร์ชัน 8.12.0 ได้เปิดตัวการลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ซึ่งมีเป้าหมายเพื่อผสานรวมการเพิ่มประสิทธิภาพทรัพยากรและการเพิ่มประสิทธิภาพโค้ดเพื่อสร้างแอปที่เล็กลงและเร็วขึ้น ก่อนที่จะมีการลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ เครื่องมือ Android Asset Packaging Tool (AAPT2) จะสร้างกฎการเก็บที่ถือว่าการลดขนาดทรัพยากรแยกจากการลดขนาดโค้ด ซึ่งมักจะเก็บโค้ดหรือทรัพยากรที่เข้าถึงไม่ได้ซึ่งอ้างอิงถึงกันไว้
การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพจะพิจารณาทรัพยากรเป็นส่วนหนึ่งของโค้ดโปรแกรม ซึ่งสร้างกราฟการอ้างอิง เมื่อไม่มีการอ้างอิงคอลเล็กชันโค้ดหรือทรัพยากร คอลเล็กชันดังกล่าวจะไม่ได้รับการปกป้องตามกฎการเก็บและสามารถนำออกได้
เปิดใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ
หากต้องการเปิดใช้ไปป์ไลน์การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพใหม่สำหรับ AGP 8.12 หรือ 8.13 ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ gradle.properties ของโปรเจ็กต์
หากคุณใช้ AGP เวอร์ชัน 9.0.0 ขึ้นไป คุณไม่จำเป็นต้องตั้งค่า android.r8.optimizedResourceShrinking=true ระบบจะใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพโดยอัตโนมัติเมื่อเปิดใช้ isShrinkResources = true ในการกำหนดค่าบิลด์
ตรวจสอบและกำหนดค่าการตั้งค่าการเพิ่มประสิทธิภาพ R8
หากต้องการเปิดใช้ R8 เพื่อใช้ความสามารถในการเพิ่มประสิทธิภาพอย่างเต็มรูปแบบ ให้นำบรรทัดต่อไปนี้
ออกจากไฟล์ gradle.properties ของโปรเจ็กต์ (หากมี)
bash android.enableR8.fullMode=false # Remove this line from your codebase.
โปรดทราบว่าการเปิดใช้การเพิ่มประสิทธิภาพแอปจะทำให้เข้าใจ Stack Trace ได้ยาก โดยเฉพาะอย่างยิ่งหาก R8 เปลี่ยนชื่อคลาสหรือเมธอด หากต้องการรับ Stack Trace ที่ ตรงกับซอร์สโค้ดอย่างถูกต้อง โปรดดูหัวข้อกู้คืน Stack Trace เดิม
หากเปิดใช้ R8 คุณควรสร้างโปรไฟล์การเริ่มต้นเพื่อให้ประสิทธิภาพการเริ่มต้น ดียิ่งขึ้น
หากคุณเปิดใช้การเพิ่มประสิทธิภาพแอปแล้วทำให้เกิดข้อผิดพลาด ให้ลองใช้กลยุทธ์ต่อไปนี้เพื่อแก้ไข
- เพิ่มกฎการเก็บ เพื่อเก็บโค้ดบางส่วนไว้โดยไม่เปลี่ยนแปลง
- ใช้การเพิ่มประสิทธิภาพทีละน้อย
- อัปเดตโค้ดให้ใช้ไลบรารีที่เหมาะกับการเพิ่มประสิทธิภาพมากกว่า
หากสนใจเพิ่มประสิทธิภาพความเร็วบิลด์ โปรดดูหัวข้อ กำหนดค่าวิธีที่ R8 ทำงาน เพื่อดูข้อมูลเกี่ยวกับวิธีกำหนดค่า R8 ตามสภาพแวดล้อมของคุณ
การเปลี่ยนแปลงลักษณะการทำงานของ AGP และ R8 เวอร์ชันต่างๆ
ตารางต่อไปนี้สรุปฟีเจอร์หลักที่เปิดตัวในปลั๊กอิน Android Gradle (AGP) และคอมไพเลอร์ R8 เวอร์ชันต่างๆ
| AGP เวอร์ชัน | ฟีเจอร์ที่เปิดตัว |
|---|---|
| 9.3 |
DSL ที่เรียบง่ายขึ้น:บล็อก `optimization {}` ใหม่ช่วยลดการกำหนดค่าที่จำเป็นลง โดยจะเปิดใช้การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพเสมอ และกฎการเก็บเริ่มต้นของ Android เป็นแบบเลือกไม่ใช้
ชุดซอร์ส`keepRules`: หากใช้ DSL ใหม่ คุณต้องวางกฎการเก็บไว้ในชุดซอร์ส src/<variant>/keepRules ในไฟล์ที่มีคำต่อท้าย .keep ชุดแหล่งข้อมูลยังใช้ได้กับ DSL รุ่นเดิมด้วย
กฎผู้ใช้ KMP (Kotlin MultiPlatform): KMP ไม่จำเป็นต้องตั้งค่า publish = true อีกต่อไป และรองรับชุดซอร์ส src/<variant>/keepRules ที่มีนามสกุล .keep
โปรดทราบว่าระบบยังรองรับ DSL รุ่นเดิมอยู่ |
| 9.1 |
คลาสที่จัดแพ็กเกจใหม่โดยค่าเริ่มต้น: R8 จะจัดแพ็กเกจคลาสใหม่ (ย้ายคลาสไปยังแพ็กเกจที่ไม่มีชื่อที่ระดับบนสุด) เพื่อบีบอัด DEX เพิ่มเติม ซึ่งช่วยลดความจำเป็นในการระบุตัวเลือก -repackageclasses ดูข้อมูลเกี่ยวกับวิธีการทำงานและวิธีเลือกไม่ใช้ได้ที่หัวข้อตัวเลือกส่วนกลาง
|
| 9.0 |
การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ: เปิดใช้โดยค่าเริ่มต้น (ควบคุมโดยใช้ android.r8.optimizedResourceShrinking) การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ช่วยผสานรวมการลดขนาดทรัพยากรเข้ากับไปป์ไลน์การเพิ่มประสิทธิภาพโค้ด ซึ่งจะทำให้แอปมีขนาดเล็กลงและทำงานได้เร็วขึ้น การเพิ่มประสิทธิภาพทั้งการอ้างอิงโค้ดและการอ้างอิงทรัพยากรพร้อมกันจะช่วยระบุและนำทรัพยากรที่อ้างอิงจากโค้ดที่ไม่ได้ใช้เท่านั้นออก ซึ่งเป็นการปรับปรุงที่สำคัญจากกระบวนการเพิ่มประสิทธิภาพที่แยกกันก่อนหน้านี้ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับแอปที่แชร์ทรัพยากรและโค้ดจำนวนมากในแนวตั้งของปัจจัยรูปแบบต่างๆ โดยมีการปรับปรุงขนาดแอปมากกว่า 50% การลดขนาดที่ได้จะทำให้การดาวน์โหลดมีขนาดเล็กลง การติดตั้งเร็วขึ้น และผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้นด้วยการเริ่มต้นที่เร็วขึ้น การแสดงผลที่ปรับปรุงแล้ว และ ANR ที่น้อยลง การกรองกฎของไลบรารี: ระบบได้นำการรองรับตัวเลือกส่วนกลาง (เช่น -dontobfuscate) ในกฎผู้ใช้ของไลบรารีออกแล้ว และแอปจะกรองตัวเลือกเหล่านี้ออก ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ เพิ่มตัวเลือกส่วนกลางการตรวจสอบค่า Null ของ Kotlin: เพิ่มประสิทธิภาพโดยค่าเริ่มต้น (ควบคุมโดยใช้ -processkotlinnullchecks) นอกจากนี้ เวอร์ชันนี้ยังมีการปรับปรุงความเร็วบิลด์อย่างมาก ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ ตัวเลือกส่วนกลางสำหรับการเพิ่มประสิทธิภาพเพิ่มเติมเพิ่มประสิทธิภาพแพ็กเกจที่เฉพาะเจาะจง: คุณสามารถใช้ packageScope เพื่อเพิ่มประสิทธิภาพแพ็กเกจที่เฉพาะเจาะจง ซึ่งเป็นการรองรับเวอร์ชันทดลอง ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ เพิ่มประสิทธิภาพแพ็กเกจที่ระบุด้วย packageScopeเพิ่มประสิทธิภาพโดยค่าเริ่มต้น: ระบบได้นำการรองรับ getDefaultProguardFile("proguard-android.txt") ออกแล้ว เนื่องจากมี -dontoptimize ซึ่งควรหลีกเลี่ยง ให้ใช้ "proguard-android-optimize.txt" แทน หากต้องการปิดใช้การเพิ่มประสิทธิภาพในแอปทั่วโลก ให้เพิ่มแฟล็กด้วยตนเองลงในไฟล์ ProGuard
|
| 8.12 |
การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ: เพิ่มการรองรับเบื้องต้น (ควบคุมโดยใช้ android.r8.optimizedResourceShrinking) การลดขนาดทรัพยากรที่เพิ่มประสิทธิภาพ ช่วยผสานรวมการลดขนาดทรัพยากรเข้ากับไปป์ไลน์การเพิ่มประสิทธิภาพโค้ด คุณต้องเปิดใช้ด้วยตนเองใน AGP เวอร์ชันนี้การย้อนกลับ Logcat: เพิ่มการรองรับการย้อนกลับอัตโนมัติใน หน้าต่าง Logcat ของ Android Studio |
| 8.6 |
การย้อนกลับที่ปรับปรุงแล้ว: รวมการย้อนกลับชื่อไฟล์และหมายเลขบรรทัดโดยค่าเริ่มต้นสำหรับ minSdk ทุกระดับ (ก่อนหน้านี้ต้องใช้ minSdk 26 ขึ้นไปในเวอร์ชัน 8.2)การอัปเดต R8 จะช่วยให้มั่นใจได้ว่า Stack Trace จากบิลด์ที่ปรับให้ยากต่อการอ่าน (Obfuscation) จะอ่านได้ง่ายและชัดเจน เวอร์ชันนี้ปรับปรุงวิธีจับคู่หมายเลขบรรทัดและไฟล์แหล่งข้อมูล ทำให้เครื่องมือต่างๆ เช่น Logcat ของ Android Studio ย้อนกลับข้อขัดข้องไปยังซอร์สโค้ดเดิมได้ง่ายขึ้น |
| 8.0 |
โหมดเต็มรูปแบบโดยค่าเริ่มต้น: โหมดเต็มรูปแบบของ R8 ให้การเพิ่มประสิทธิภาพที่ทรงพลังกว่ามาก โดยจะเปิดใช้โดยค่าเริ่มต้น คุณเลือกไม่ใช้ได้โดยใช้ android.enableR8.fullMode=false
|
| 7.0 |
โหมดเต็มรูปแบบพร้อมให้บริการ: เปิดตัวเป็นฟีเจอร์แบบเลือกใช้โดยใช้ android.enableR8.fullMode=true โหมดเต็มรูปแบบใช้การเพิ่มประสิทธิภาพที่ทรงพลังกว่าโดยกำหนดสมมติฐานที่เข้มงวดมากขึ้นเกี่ยวกับวิธีที่โค้ดของคุณใช้การสะท้อนและการทำงานแบบไดนามิกอื่นๆ แม้ว่าโหมดนี้จะลดขนาดแอปและปรับปรุงประสิทธิภาพ แต่คุณอาจต้องเพิ่มกฎการเก็บเพื่อป้องกันไม่ให้ระบบนำโค้ดที่จำเป็นออก
|