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

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

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

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

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

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

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

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

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

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

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

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

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

  • ปลั๊กอิน Android Gradle: com.android.tools.build:8.0.0
  • คลัง Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • โปรแกรมติดตั้งโปรไฟล์: androidx.profileinstaller:profileinstaller:1.4.1

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

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

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

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

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

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

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

โปรไฟล์ Cloud

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

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

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

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

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

ปัญหาที่ทราบ

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

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

  • อุปกรณ์ Firebase Test Lab ไม่รองรับการสร้างโปรไฟล์พื้นฐาน ซึ่งรวมถึงอุปกรณ์ Test Lab ที่มีการจัดการโดย Gradle (ปัญหา #285187547)

  • หากต้องการระบุโปรไฟล์พื้นฐานสำหรับคลังอย่างสมบูรณ์ ให้ใช้ปลั๊กอิน 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 อาจรบกวนการติดตั้งโปรไฟล์ ปิดใช้การเพิ่มประสิทธิภาพแบตเตอรี่ในอุปกรณ์ที่ใช้ทดสอบเพื่อให้การติดตั้งโปรไฟล์มีประสิทธิภาพ

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