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

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

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

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

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

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

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

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

โปรไฟล์สตาร์ทอัพ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

โปรไฟล์ Cloud

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

แม้ว่าโปรไฟล์ในระบบคลาวด์จะขับเคลื่อนโดยการโต้ตอบของผู้ใช้จริงกับแอป แต่ระบบจะใช้เวลาหลายชั่วโมงถึงหลายวันหลังจากอัปเดตในการเผยแพร่ ซึ่งจำกัด ความพร้อมใช้งาน จนกว่าจะมีการกระจายโปรไฟล์อย่างเต็มรูปแบบ ประสิทธิภาพของแอป จะต่ำกว่าที่ควรจะเป็นสำหรับผู้ใช้แอปใหม่หรือแอปที่อัปเดต นอกจากนี้ Cloud Profiles ยังรองรับเฉพาะอุปกรณ์ 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 ในการเรียกใช้ครั้งแรกเมื่อ โมดูลแอปกำหนด ทรัพยากร Dependency นี้ ART สามารถปรับปรุง สิ่งนี้ได้เพิ่มเติมโดยการเพิ่ม กฎโปรไฟล์เพิ่มเติม ขณะที่ใช้แอป และ คอมไพล์กฎเหล่านั้นเมื่อ อุปกรณ์ไม่ได้ใช้งาน ซึ่งจะช่วย เพิ่มประสิทธิภาพพื้นที่ในดิสก์ และเวลาในการโหลดโค้ดจาก ดิสก์ จึงช่วยลด เวลารอของแอป
9 (API ระดับ 28) และ สูงกว่า AOT บางส่วน (Baseline + โปรไฟล์ Cloud) Play ใช้ Baseline Profile ระหว่างการติดตั้งแอปเพื่อ เพิ่มประสิทธิภาพ APK และ Cloud Profile หากมี หลังจากติดตั้งแล้ว ระบบจะอัปโหลดโปรไฟล์ ART ไปยัง Play รวบรวม แล้วแสดงเป็นโปรไฟล์ในระบบคลาวด์แก่ผู้ใช้รายอื่นเมื่อติดตั้งหรืออัปเดตแอป

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

ปัญหาและวิธีแก้ปัญหาที่อาจเกิดขึ้น หรือปัญหาที่อยู่ระหว่างการพัฒนาวิธีแก้ไขเบื้องต้นมีดังนี้

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

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

  • หากต้องการจัดเตรียม Baseline Profile สำหรับไลบรารีให้สำเร็จ ให้ใช้ ปลั๊กอิน Baseline Profile Gradle 1.2.3 หรือ AGP 8.3 เป็นอย่างน้อย (ปัญหา #313992099)

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

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

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

  • การแชร์แอปภายในของ Play Store ไม่รองรับ Baseline Profile แต่แทร็กการทดสอบภายใน รองรับ

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

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