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

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

  • ปลั๊กอิน Android Gradle: com.android.tools.build:8.0.0
  • ไลบรารีการทดสอบประสิทธิภาพแบบมาโคร: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • โปรแกรมติดตั้งโปรไฟล์: androidx.profileinstaller:profileinstaller:1.4.1

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

เวอร์ชัน AGP ฟีเจอร์
8.4 การติดตั้งแอปในเครื่องของบิลด์ที่แก้ไขข้อบกพร่องไม่ได้โดยใช้เครื่องมือบรรทัดคำสั่ง Gradle Wrapper หรือโปรไฟล์ Baseline สำหรับการติดตั้ง Android Studio ดังนั้นประสิทธิภาพของบิลด์ในเครื่องจะใกล้เคียงกับเวอร์ชันที่ใช้งานจริงมากขึ้น การอัปเดตนี้ไม่มีผลต่อประสิทธิภาพเวอร์ชันที่ใช้งานจริงของโปรไฟล์พื้นฐาน
8.3
  • การรองรับไดเรกทอรีชุดแหล่งที่มาอย่างเต็มรูปแบบ (โมดูลไลบรารี): ตอนนี้คุณสามารถประกาศไฟล์แหล่งที่มาของโปรไฟล์พื้นฐานหลายไฟล์และใช้ไดเรกทอรีที่รองรับตัวแปร เช่น src/free/generated/baselineProfiles/baseline-prof1.txt กับโมดูลไลบรารีและโมดูลแอปได้แล้ว
  • โปรไฟล์พื้นฐานรวมถึงชั้นเรียนที่เลิกใช้น้ำตาล
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. ขั้นตอนนี้จะทำงานร่วมกับการรวมโปรไฟล์ Cloud เพื่อปรับแต่งประสิทธิภาพตามการใช้งานจริงของแอปเมื่อเวลาผ่านไป

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

โปรไฟล์ในระบบคลาวด์

โปรไฟล์ระบบคลาวด์เป็น 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 บางส่วน (โปรไฟล์พื้นฐาน) โปรไฟล์พื้นฐานจะติดตั้งโดย 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 อาจไม่รองรับการใช้โปรไฟล์พื้นฐานในการติดตั้ง ผู้ใช้แอปที่ติดตั้งผ่านช่องทางเหล่านี้จะไม่เห็นประโยชน์จนกว่าจะเรียกใช้ดีกซ์ซอปพื้นหลัง ซึ่งน่าจะใช้เวลาชั่วข้ามคืน

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

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

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