ภาพรวมของโปรไฟล์พื้นฐาน

โปรไฟล์พื้นฐานช่วยเพิ่มความเร็วในการเรียกใช้โค้ดประมาณ 30% ตั้งแต่การเปิดตัวครั้งแรก ด้วยการหลีกเลี่ยงขั้นตอนการตีความและ การคอมไพล์แบบ Just-In-Time (JIT) ขั้นตอนการคอมไพล์ สำหรับเส้นทางโค้ดที่รวมไว้

เมื่อจัดส่งโปรไฟล์พื้นฐานในแอปหรือไลบรารี Android Runtime (ART) จะเพิ่มประสิทธิภาพเส้นทางโค้ดที่ระบุผ่านการคอมไพล์แบบ Ahead-of-Time (AOT) ซึ่งช่วยปรับปรุงประสิทธิภาพสำหรับผู้ใช้ใหม่ทุกคนและการอัปเดตแอปทุกครั้ง การเพิ่มประสิทธิภาพที่แนะนำโดยโปรไฟล์ (PGO) นี้ช่วยให้แอปเพิ่มประสิทธิภาพการเริ่มต้น ลดการกระตุกของการโต้ตอบ และปรับปรุงประสิทธิภาพรันไทม์โดยรวมสำหรับผู้ใช้ตั้งแต่การเปิดตัวครั้งแรก

การปรับปรุงประสิทธิภาพเหล่านี้ส่งผลโดยตรงต่อเมตริกทางธุรกิจที่ได้รับการปรับปรุง เช่น การคงผู้ใช้ไว้ ธุรกรรม และคะแนน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีที่ ประสิทธิภาพส่งผลต่อเมตริกทางธุรกิจได้ในเรื่องราวจาก Josh, Lyft, TikTok และ Zomato

ประโยชน์ของโปรไฟล์พื้นฐาน

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

โปรไฟล์พื้นฐานช่วยแนะนำการเพิ่มประสิทธิภาพนอกเหนือจากการเริ่มต้นแอปด้วยการโต้ตอบทั่วไปของผู้ใช้ที่ช่วยปรับปรุงรันไทม์ของแอปตั้งแต่การเปิดตัวครั้งแรก การคอมไพล์ AOT ที่แนะนำไม่ขึ้นอยู่กับอุปกรณ์ของผู้ใช้ และสามารถทำได้ครั้งเดียวต่อรุ่นในคอมพิวเตอร์สำหรับการพัฒนาซอฟต์แวร์แทนที่จะเป็นอุปกรณ์เคลื่อนที่ การจัดส่งรุ่นที่มี โปรไฟล์พื้นฐานจะช่วยให้การเพิ่มประสิทธิภาพแอปพร้อมใช้งานได้เร็วกว่าการใช้ โปรไฟล์ Cloud เพียงอย่างเดียว

เมื่อไม่ได้ใช้โปรไฟล์พื้นฐาน ระบบจะคอมไพล์โค้ดแอปทั้งหมดแบบ JIT ในหน่วยความจำหลังจากตีความ หรือเขียนลงในไฟล์ odex ในเบื้องหลังเมื่ออุปกรณ์ไม่ได้ใช้งาน หลังจากติดตั้งหรืออัปเดตแอป ผู้ใช้จะได้รับประสบการณ์การใช้งานที่ไม่เหมาะสมตั้งแต่ครั้งแรกที่ใช้งานจนกว่าจะมีการเพิ่มประสิทธิภาพเส้นทางโค้ดใหม่ แอปจำนวนมากวัดการเพิ่มประสิทธิภาพได้ประมาณ 30% หลังจากเพิ่มประสิทธิภาพแล้ว

โปรไฟล์การเริ่มต้น

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

เริ่มต้นใช้งาน

หากต้องการเริ่มเพิ่มประสิทธิภาพในแอปที่มีอยู่ โปรดดูสร้างโปรไฟล์ พื้นฐาน

บิลด์โปรไฟล์เทียบกับบิลด์ที่เผยแพร่

คุณต้องเข้าใจความแตกต่างในการกำหนดค่าบิลด์ที่จำเป็นเมื่อ สร้าง ไฟล์โปรไฟล์พื้นฐานและโปรไฟล์การเริ่มต้น (เช่น baseline-prof.txt และ startup-prof.txt) เทียบกับเมื่อสร้าง APK ที่เผยแพร่ขั้นสุดท้ายซึ่งใช้โปรไฟล์เหล่านี้

เมื่อสร้างไฟล์โปรไฟล์ (เช่น benchmark):

เมื่อบันทึกโปรไฟล์พื้นฐานด้วยการทดสอบ แอปต้องไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) หากต้องการให้กฎโปรไฟล์ที่สร้างขึ้นตรงกับลายเซ็นของเมธอดในโค้ดอย่างถูกต้อง คุณต้องปิดการปรับให้ยากต่อการอ่าน (Obfuscation) และการเพิ่มประสิทธิภาพ (R8) สำหรับบิลด์ตัวแปรที่ใช้สร้างโปรไฟล์ ตัวแปรนี้ต้องแตกต่างจากตัวแปรบิลด์ที่เผยแพร่ซึ่งเปิดใช้การปรับให้ยากต่อการอ่าน (Obfuscation) และการเพิ่มประสิทธิภาพ คุณทำได้โดยตั้งค่า isMinifyEnabled = false สำหรับบิลด์ตัวแปรการสร้างโปรไฟล์ หากไม่ได้ใช้ปลั๊กอิน Baseline Profile Gradle คุณควรตรวจสอบว่าได้ใช้ -dontobfuscate และ -dontoptimize แล้วด้วย ปลั๊กอิน Baseline Profile Gradle จะจัดการการกำหนดค่านี้ ให้คุณโดยอัตโนมัติ

คุณสามารถตรวจสอบว่าแอปไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) ระหว่างการสร้างโปรไฟล์ได้โดยเปิดไฟล์โปรไฟล์ข้อความที่สร้างขึ้น (เช่น baseline-prof.txt) และตรวจสอบว่าชื่อคลาสและเมธอดไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation)

เมื่อสร้าง APK ที่เผยแพร่ขั้นสุดท้าย:

เมื่อสร้างแอปที่เผยแพร่ แอปควรได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) บิลด์ที่เผยแพร่ต้องมี isMinifyEnabled = true เพื่อรับประโยชน์จากการปรับให้ยากต่อการอ่าน (Obfuscation) การลดขนาด และการเพิ่มประสิทธิภาพ R8 จะเขียนกฎใหม่จากไฟล์โปรไฟล์ที่ไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) โดยอัตโนมัติเพื่อให้ตรงกับโค้ดที่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) และเพิ่มประสิทธิภาพใน APK ที่เผยแพร่ บิลด์จะใช้ประโยชน์จากไฟล์ข้อความที่ไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) โดยการแปลงกฎอย่างถูกต้อง

หากต้องการให้ การเพิ่มประสิทธิภาพเลย์เอาต์ DEX (ซึ่งขับเคลื่อนโดยโปรไฟล์การเริ่มต้น) ทำงานได้ แอปที่เผยแพร่ต้องได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) และใช้ R8 โดยเปิดใช้การเพิ่มประสิทธิภาพทั้งหมด

เวิร์กโฟลว์ขั้นสูง (ที่ไม่ใช่ Gradle):

หากคุณใช้เวิร์กโฟลว์ขั้นสูงที่ไม่ใช่ Gradle (เช่น Bazel, Buck หรือไปป์ไลน์การทำงานอัตโนมัติ CI ที่กำหนดเอง) เพื่อสร้างโปรไฟล์ คุณยังคงต้องปฏิบัติตามหลักการเดียวกัน แอปต้องไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) หรือเพิ่มประสิทธิภาพเมื่อบันทึกโปรไฟล์ อย่างไรก็ตาม เมื่อสร้างแอปที่เผยแพร่ คุณต้องปรับให้ยากต่อการอ่าน (Obfuscation) R8 จะประมวลผลไฟล์กฎข้อความที่ไม่ได้รับการปรับให้ยากต่อการอ่าน (Obfuscation) และแปลงกฎอย่างถูกต้องเพื่อนำไปใช้กับแอปที่เผยแพร่ซึ่งได้รับการปรับให้ยากต่อการอ่าน (Obfuscation)

เชนการพึ่งพาจะให้เวอร์ชันการเผยแพร่ที่เสถียรและเวอร์ชันการเผยแพร่สำหรับการพัฒนา หากต้องการสร้างและติดตั้งโปรไฟล์พื้นฐาน ให้ใช้ปลั๊กอิน Android Gradle, ไลบรารี Macrobenchmark และ Profile Installer เวอร์ชันที่รองรับต่อไปนี้หรือสูงกว่า การพึ่งพาเหล่านี้จำเป็นในเวลาที่ต่างกันและทำงานร่วมกันเป็นทูลเชนเพื่อเปิดใช้โปรไฟล์พื้นฐานที่เหมาะสม

  • Android Gradle Plugin: com.android.tools.build:8.0.0
  • ไลบรารี Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.4.1
  • Profile Installer: androidx.profileinstaller:profileinstaller:1.4.1

เราขอแนะนำให้ใช้ AGP เวอร์ชันล่าสุดเพื่อสร้างและจัดการโปรไฟล์พื้นฐาน ฟังก์ชันการทำงานหลักที่มาพร้อมกับ AGP เวอร์ชันต่างๆ มีดังนี้

AGP เวอร์ชัน ฟีเจอร์
9.1 การรองรับไดเรกทอรีชุดแหล่งที่มาแบบเต็ม (โมดูลไลบรารี): นอกเหนือจากไดเรกทอรีที่ทราบตัวแปรแล้ว คุณยังประกาศไฟล์แหล่งที่มาของโปรไฟล์พื้นฐานหลายไฟล์ด้วยชื่อที่กำหนดเอง เช่น src/free/generated/baselineProfiles/baseline-prof1.txt สำหรับโมดูลไลบรารีและโมดูลแอปได้ด้วย
8.4 การติดตั้งแอปในเครื่องของบิลด์ที่ไม่ได้ใช้การแก้ไขข้อบกพร่องโดยใช้ เครื่องมือบรรทัดคำสั่ง Gradle Wrapper หรือ Android Studio จะติดตั้งโปรไฟล์พื้นฐาน เพื่อให้ประสิทธิภาพ ของบิลด์ที่เผยแพร่ในเครื่องตรงกับเวอร์ชันที่ใช้งานจริงมากขึ้น การอัปเดตนี้ ไม่มีผลต่อประสิทธิภาพการทำงานของโปรไฟล์พื้นฐานในเวอร์ชันที่ใช้งานจริง
8.3
  • การรองรับไดเรกทอรีชุดแหล่งที่มาบางส่วน (โมดูลไลบรารี): ประกาศไฟล์โปรไฟล์พื้นฐานที่ทราบตัวแปร เช่น src/free/generated/baselineProfiles/baseline-prof.txt, สำหรับโมดูลไลบรารี
  • โปรไฟล์พื้นฐานมี คลาสที่ได้รับการยกเลิกการ Sugar
8.2
  • การเขียนกฎใหม่ของ R8: D8 และ R8 สามารถแปลงกฎโปรไฟล์พื้นฐานและโปรไฟล์การเริ่มต้นที่อ่านได้ให้ครอบคลุมกฎทั้งหมดที่คุณต้องใช้เพื่อเพิ่มประสิทธิภาพแอป ซึ่งจะช่วยให้คุณสร้างโปรไฟล์จากบิลด์ที่ไม่ได้ลดขนาดและนำไปใช้กับบิลด์ที่เผยแพร่ซึ่งลดขนาดแล้วได้ เพิ่มความครอบคลุมของเมธอดในโปรไฟล์พื้นฐานประมาณ 30% และเพิ่มประสิทธิภาพแอปประมาณ 15%
  • โปรไฟล์ การเริ่มต้น: สร้างโปรไฟล์พื้นฐานประเภทนี้เพื่อ แจ้งเลย์เอาต์ของโค้ดภายใน DEX เพิ่มประสิทธิภาพการเริ่มต้นอีกประมาณ 15% หรือมากกว่านั้นอย่างมากสำหรับแอปขนาดใหญ่
8.0 เวอร์ชันขั้นต่ำที่แนะนำ: ใช้ปลั๊กอิน Baseline Profile Gradle เพื่อสร้างโปรไฟล์พื้นฐานด้วยงาน Gradle งานเดียว
  • การรองรับไดเรกทอรีชุดแหล่งที่มาแบบเต็ม (โมดูลแอป): ประกาศไฟล์แหล่งที่มาของโปรไฟล์พื้นฐานหลายไฟล์ และใช้ไดเรกทอรีที่ทราบตัวแปร เช่น src/free/generated/baselineProfiles/baseline-prof1.txt
7.4 เวอร์ชันต่ำสุดที่รองรับ: แอปสามารถใช้โปรไฟล์พื้นฐาน จากไลบรารี และระบุโปรไฟล์พื้นฐานของตัวเองใน src/main/baseline-prof.txt ไฟล์
  • ระบบจะแพ็กเกจโปรไฟล์พื้นฐานอย่างถูกต้องเมื่อสร้าง APK จาก App Bundle (ปัญหา #230361284)
  • สำหรับแอปที่มีไฟล์มากกว่าหนึ่ง .dex ไฟล์ ระบบจะแพ็กเกจโปรไฟล์พื้นฐานอย่างถูกต้อง สำหรับไฟล์ .dex หลัก
  • D8 และ R8 รองรับ การสร้างโปรไฟล์การเริ่มต้นจากบิลด์ที่ isMinifyEnabledตั้งค่าเป็นfalse

การตั้งค่าแหล่งที่มาของโปรไฟล์ที่ทราบตัวแปร

การใช้ Android Gradle Plugin (AGP) เวอร์ชัน 8.0 สำหรับแอปพลิเคชันและ AGP เวอร์ชัน 8.3 สำหรับไลบรารีจะช่วยให้คุณวางกฎโปรไฟล์พื้นฐานในไดเรกทอรีชุดแหล่งที่มาเฉพาะได้ โดยไม่ต้องยึดติดกับเส้นทางเดียวที่ตายตัว (เช่น src/main/baseline-prof.txt) และเปิดใช้ไฟล์หลายไฟล์

ซึ่งจะช่วยให้การรองรับตัวแปรมีประสิทธิภาพมากขึ้น โดยช่วยให้คุณกำหนดโปรไฟล์พื้นฐานที่แตกต่างกันซึ่งปรับให้เหมาะกับบิลด์ Flavor และประเภทที่เฉพาะเจาะจง (เช่น การใช้ไดเรกทอรีอย่าง src/variant/baselineProfiles/) ซึ่งจะช่วยให้มั่นใจได้ว่ากฎการเพิ่มประสิทธิภาพจะนำไปใช้อย่างแม่นยำกับไบนารีของแอปพลิเคชันหรือไลบรารีที่ไม่ซ้ำกันแต่ละรายการ

ตัวอย่างการสร้างโปรไฟล์

ตัวอย่างคลาสต่อไปนี้ใช้เพื่อสร้างโปรไฟล์พื้นฐานสำหรับการเริ่มต้นแอป รวมถึงเหตุการณ์การไปยังส่วนต่างๆ และการเลื่อนหลายรายการโดยใช้ Macrobenchmark ไลบรารีที่แนะนำ

class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            uiAutomator {
                // App startup journey.
                startApp(PACKAGE_NAME)

                // Find and click elements using the new DSL
                onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
                onElement { viewIdResourceName == "myLazyColumn" }.also {
                    it.fling(Direction.DOWN)
                    it.fling(Direction.UP)
                }
                pressBack()
            }
        }
    }
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ไลบรารี UI Automator เพื่อทำให้เส้นทางของผู้ใช้เป็นแบบอัตโนมัติได้ที่เขียนการทดสอบอัตโนมัติด้วย UI Automator

คุณสามารถดูโค้ดนี้ในบริบทแบบเต็มและรายละเอียดเพิ่มเติมได้ในส่วนตัวอย่างประสิทธิภาพใน GitHub

ข้อมูลที่ต้องระบุ

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

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

ไลบรารีสามารถระบุโปรไฟล์พื้นฐานของตัวเองและจัดส่งโปรไฟล์ดังกล่าวพร้อมกับรุ่นต่างๆ เพื่อปรับปรุงประสิทธิภาพของแอป ตัวอย่างเช่น โปรดดูส่วนใช้โปรไฟล์พื้นฐานใน ประสิทธิภาพของ Jetpack Compose

วิธีการทำงานของโปรไฟล์พื้นฐาน

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

  1. ระบบจะสร้างกฎโปรไฟล์ที่อ่านได้สำหรับแอปและคอมไพล์เป็นรูปแบบไบนารีในแอป คุณจะพบกฎเหล่านี้ได้ใน assets/dexopt/baseline.prof จากนั้นคุณก็อัปโหลด Android App Bundle (AAB) ไปยัง Google Play ได้ตามปกติ

  2. Google Play จะประมวลผลโปรไฟล์และจัดส่งไปยังผู้ใช้โดยตรงพร้อมกับ APK ระหว่างการติดตั้ง ART จะคอมไพล์เมธอดในโปรไฟล์แบบ AOT ซึ่งทำให้เมธอดเหล่านั้นทำงานได้เร็วขึ้น หากโปรไฟล์มีเมธอดที่ใช้ในการเปิดแอปหรือระหว่างการแสดงผลเฟรม ผู้ใช้อาจได้รับประสบการณ์การเปิดแอปที่เร็วขึ้นและการกระตุกที่ลดลง

  3. โฟลว์นี้ทำงานร่วมกับการรวบรวมโปรไฟล์ Cloud เพื่อปรับแต่งประสิทธิภาพตามการใช้งานแอปจริงเมื่อเวลาผ่านไป

รูปที่ 1 แผนภาพนี้แสดงเวิร์กโฟลว์ของโปรไฟล์พื้นฐาน ตั้งแต่การอัปโหลดไปจนถึงการจัดส่งให้ผู้ใช้ปลายทาง และวิธีที่เวิร์กโฟลว์ดังกล่าวเกี่ยวข้อง กับโปรไฟล์ Cloud

เปรียบเทียบโปรไฟล์พื้นฐานกับโปรไฟล์การเริ่มต้น

คุณใช้ปลั๊กอิน Baseline Profile Gradle เพื่อกำหนดและสร้างไฟล์โปรไฟล์ ปลั๊กอินนี้จะเชื่อมต่อกับกระบวนการบิลด์ และ AGP จะคอมไพล์กฎโปรไฟล์ที่อ่านได้เหล่านี้เป็นรูปแบบไบนารี ซึ่งแพ็กเกจเป็น baseline.prof ภายใน APK หรือ AAB ที่ ART สามารถใช้ได้อย่างมีประสิทธิภาพสำหรับการคอมไพล์ในอุปกรณ์ ตราบใดที่มีขนาดไม่เกิน 1.5 MB

ไฟล์โปรไฟล์ที่สร้างขึ้นมักจะมีชื่อว่า startup-prof.txt และ baseline-prof.txt แม้ว่าเนื้อหาของไฟล์ทั้ง 2 ประเภทอาจดูคล้ายกันในบางครั้ง โดยเฉพาะอย่างยิ่งหากคุณมุ่งเน้นที่การเริ่มต้นเป็นหลัก แต่ไฟล์ทั้ง 2 ประเภทมีวัตถุประสงค์ที่แตกต่างกันและส่งผลต่อประสิทธิภาพในระยะต่างๆ ดังนี้

โปรไฟล์พื้นฐาน

ไฟล์โปรไฟล์พื้นฐานมีชุดกฎที่ครอบคลุมซึ่ง Android Runtime (ART) ใช้เพื่อคอมไพล์เส้นทางโค้ดที่ใช้บ่อยล่วงหน้า ซึ่งจะเพิ่มประสิทธิภาพแอปนอกเหนือจากการเริ่มต้น

โดยทั่วไปแล้วไฟล์โปรไฟล์พื้นฐานจะเป็นซูเปอร์เซ็ตของกฎที่พบในโปรไฟล์การเริ่มต้น ไฟล์นี้มีกฎทั้งหมดที่จำเป็นสำหรับการเพิ่มประสิทธิภาพการเริ่มต้นแอป (สร้างผ่านงาน baselineProfile Gradle) รวมถึงโปรไฟล์เพิ่มเติมสำหรับเส้นทางของผู้ใช้ที่สำคัญอื่นๆ เช่น การเลื่อนและการไปยังส่วนต่างๆ ระหว่างหน้าจอ

ระบบจะสร้างกฎเพิ่มเติมที่ไม่ใช่กฎการเริ่มต้นโดยไม่คำนึงถึงค่าของช่องการกำหนดค่า includeInStartupProfile

โปรไฟล์การเริ่มต้น

ไฟล์โปรไฟล์การเริ่มต้นมีกฎที่เพิ่มประสิทธิภาพสำหรับเส้นทางการเริ่มต้นของแอปโดยเฉพาะ ระหว่างการคอมไพล์ D8 จะแปลง Java bytecode เป็นรูปแบบ DEX จากนั้น R8 จะใช้ไฟล์นี้เพื่อกำหนดเลย์เอาต์ของไฟล์ DEX โดยตรวจสอบว่าโค้ดการเริ่มต้นที่สำคัญอยู่ในไฟล์ DEX หลักเพื่อให้ทำงานได้เร็วขึ้น โดยทั่วไป คุณควรตั้งค่า includeInStartupProfile เป็น true เฉพาะสำหรับสถานการณ์การทดสอบที่จำเป็นสำหรับการแสดงผลเริ่มต้นของแอป ดูข้อมูลเพิ่มเติมได้ที่ สร้างโปรไฟล์การเริ่มต้น

โปรไฟล์ Cloud

โปรไฟล์ Cloud เป็น PGO อีกรูปแบบหนึ่งที่ Google Play Store รวบรวมและเผยแพร่เพื่อการคอมไพล์ในเวลาติดตั้ง โดยทำงานร่วมกับโปรไฟล์พื้นฐาน

แม้ว่าโปรไฟล์ Cloud จะขับเคลื่อนโดยการโต้ตอบของผู้ใช้จริงกับแอป แต่ระบบต้องใช้เวลาหลายชั่วโมงถึงหลายวันในการเผยแพร่หลังจากการอัปเดต ซึ่งจำกัดความพร้อมใช้งาน จนกว่าจะมีการเผยแพร่โปรไฟล์อย่างเต็มรูปแบบ ผู้ใช้แอปใหม่หรือแอปที่อัปเดตจะได้รับประสบการณ์การใช้งานแอปที่ไม่เหมาะสม นอกจากนี้ โปรไฟล์ Cloud ยังรองรับเฉพาะอุปกรณ์ Android ที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป และปรับขนาดได้ดีเฉพาะกับแอปที่มีฐานผู้ใช้ขนาดใหญ่พอ

ลักษณะการทำงานของการคอมไพล์ใน Android เวอร์ชันต่างๆ

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

Android เวอร์ชัน วิธีการคอมไพล์ แนวทางการเพิ่มประสิทธิภาพ
5 ถึง 6 (API ระดับ 21 ถึง 23) AOT แบบเต็ม ระบบจะเพิ่มประสิทธิภาพแอปทั้งหมดระหว่างการติดตั้ง ซึ่งส่งผลให้ต้องรอนานกว่าจะใช้แอปได้ การใช้ RAM และพื้นที่ดิสก์เพิ่มขึ้น และใช้เวลานานขึ้นในการโหลดโค้ดจากดิสก์ ซึ่งอาจเพิ่มเวลาในการเริ่มต้นแบบ Cold
7 ถึง 8.1 (API ระดับ 24 ถึง 27) AOT บางส่วน (โปรไฟล์พื้นฐาน) androidx.profileinstaller จะติดตั้งโปรไฟล์พื้นฐานในการเรียกใช้ครั้งแรกเมื่อโมดูลแอปกำหนดทรัพยากร Dependency นี้ ART สามารถปรับปรุงเพิ่มเติมได้ด้วยการเพิ่มกฎโปรไฟล์เพิ่มเติมระหว่างการใช้งานแอป และคอมไพล์กฎเหล่านั้นเมื่ออุปกรณ์ไม่ได้ใช้งาน ซึ่งจะเพิ่มประสิทธิภาพพื้นที่ดิสก์และเวลาในการโหลดโค้ดจากดิสก์ จึงช่วยลดเวลาที่ต้องรอแอป
9 (API ระดับ 28) ขึ้นไป AOT บางส่วน (โปรไฟล์พื้นฐาน + โปรไฟล์ Cloud) Play ใช้โปรไฟล์พื้นฐานระหว่างการติดตั้งแอปเพื่อเพิ่มประสิทธิภาพ APK และโปรไฟล์ Cloud (หากมี) หลังจากติดตั้งแล้ว ระบบจะอัปโหลดโปรไฟล์ ART ไปยัง Play รวบรวมโปรไฟล์ และแสดงเป็นโปรไฟล์ Cloud ให้ผู้ใช้รายอื่นเมื่อติดตั้งหรืออัปเดตแอป

ปัญหาที่ทราบแล้ว

ปัญหาและวิธีแก้ปัญหาที่เป็นไปได้ หรือปัญหาที่อยู่ระหว่างการพัฒนาวิธีแก้ปัญหาชั่วคราวมีดังนี้

  • การสร้างโปรไฟล์พื้นฐานอาจล้มเหลวเนื่องจากการตั้งค่าสิทธิ์ในอุปกรณ์บางเครื่อง รวมถึงอุปกรณ์ OnePlus หากต้องการแก้ปัญหานี้ ให้ปิดตัวเลือกปิดใช้การตรวจสอบสิทธิ์ ในการตั้งค่าตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์

  • หากต้องการระบุโปรไฟล์พื้นฐานสำหรับไลบรารีให้สำเร็จ ให้ใช้ ปลั๊กอิน Baseline Profile Gradle เวอร์ชัน 1.2.3 หรือ AGP เวอร์ชัน 8.3 ขึ้นไป (ปัญหา #313992099)

  • หากคุณสร้างโปรไฟล์พื้นฐานด้วยคำสั่ง ./gradlew app:generateBaselineProfile การทดสอบประสิทธิภาพในโมดูลการทดสอบก็จะทำงานด้วย และระบบจะทิ้งผลลัพธ์ หากเกิดเหตุการณ์นี้ขึ้น คุณสามารถสร้างเฉพาะ โปรไฟล์พื้นฐานได้โดยเรียกใช้คำสั่งด้วย -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile ปัญหานี้ได้รับการแก้ไขแล้วใน AGP เวอร์ชัน 8.2

  • คำสั่งสร้างโปรไฟล์พื้นฐานสำหรับประเภทบิลด์ทั้งหมด ./gradlew app:generateBaselineProfile จะสร้างโปรไฟล์พื้นฐานสำหรับบิลด์ที่เผยแพร่เท่านั้น ปัญหานี้ได้รับการแก้ไขแล้วใน AGP เวอร์ชัน 8.1

  • ช่องทางการเผยแพร่แอปที่ไม่ใช่ Google Play Store อาจไม่รองรับการใช้โปรไฟล์พื้นฐานในการติดตั้ง ผู้ใช้แอปที่ติดตั้งผ่านช่องทางเหล่านี้จะไม่เห็นประโยชน์จนกว่า dexopt ในเบื้องหลังจะทำงาน ซึ่งมักจะเกิดขึ้นในชั่วข้ามคืน

  • การแชร์แอปภายในของ Play Store ไม่รองรับโปรไฟล์พื้นฐาน แต่ แทร็กการทดสอบภายใน รองรับ

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

แหล่งข้อมูลเพิ่มเติม

แนะนำสำหรับคุณ