ทำโปรไฟล์สิ่งที่สร้าง

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

หากคุณกำลังใช้ Android Studio 4.0 ขึ้นไป วิธีที่ดีที่สุดในการตรวจสอบประสิทธิภาพของบิลด์ ปัญหาเกิดขึ้นโดยการใช้เครื่องมือวิเคราะห์บิลด์

นอกจากนี้ ยังมีอีก 2 ตัวเลือกในการทำโปรไฟล์สิ่งที่สร้างขึ้นนอก Android Studio

  1. เครื่องมือ gradle-profiler แบบสแตนด์อโลน เครื่องมือที่แข็งแกร่งสำหรับการวิเคราะห์งานสร้างของคุณอย่างละเอียด

  2. Gradle ตัวเลือก --profile เครื่องมือที่สะดวกง่ายดายจากบรรทัดคำสั่ง Gradle

การใช้เครื่องมือ gradle-profiler แบบสแตนด์อโลน

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

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

ตัวอย่างการตั้งค่าโปรเจ็กต์สำหรับการเปรียบเทียบมีดังนี้

  • เวอร์ชันของปลั๊กอิน
  • เวอร์ชัน Gradle
  • การตั้งค่า JVM (ขนาดฮีป ขนาดถาวร การเก็บขยะ ฯลฯ)
  • จำนวนผู้ปฏิบัติงาน Gradle (org.gradle.workers.max)
  • ตัวเลือกต่อปลั๊กอินเพื่อเพิ่มประสิทธิภาพให้ดียิ่งขึ้น

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

การดําเนินการนี้จะเปรียบเทียบบิลด์ล่าสุดโดยสมบูรณ์เนื่องจาก --benchmark เรียกใช้ งานหลายครั้งโดยไม่ต้องเปลี่ยนโปรเจ็กต์ จากนั้นจะ สร้างรายงาน HTML ภายใต้ไดเรกทอรี profile-out/ ที่แสดง เวลาบิลด์

สถานการณ์อื่นๆ ที่อาจมีประโยชน์ในการเปรียบเทียบมากกว่ามีดังนี้

  • การเปลี่ยนแปลงโค้ดในเนื้อหาเมธอดในชั้นเรียนที่คุณทำงานส่วนใหญ่
  • การเปลี่ยนแปลง API ในโมดูลที่ใช้ภายในโปรเจ็กต์ของคุณ ขณะที่น้อยกว่า บ่อยครั้งกว่าการเปลี่ยนแปลงโค้ดของคุณเอง ซึ่งมีผลกระทบมากกว่า มีประโยชน์ในการวัดผล
  • แก้ไขเลย์เอาต์เพื่อจำลองการทำซ้ำใน UI
  • การแก้ไขสตริงเพื่อจำลองการจัดการกับงานแปล
  • ล้างบิลด์เพื่อจำลองการเปลี่ยนแปลงของบิลด์ (เช่น Android Gradle การอัปเดตปลั๊กอิน การอัปเดต Gradle หรือการแก้ไขโค้ดบิลด์ของคุณเอง ภายใต้ buildSrc)

ในการเปรียบเทียบกรณีการใช้งานเหล่านี้ คุณสามารถสร้างสถานการณ์ที่ ใช้เพื่อขับเคลื่อนการดำเนินการ gradle-profiler และนำไปใช้ตามความเหมาะสม การเปลี่ยนแปลงในแหล่งที่มาของคุณ คุณตรวจสอบสถานการณ์ที่พบบ่อยได้ที่ด้านล่าง

การทำโปรไฟล์การตั้งค่าหน่วยความจำ/CPU ต่างๆ

ในการเปรียบเทียบการตั้งค่าหน่วยความจำและ CPU ที่แตกต่างกัน คุณสามารถสร้าง หลายสถานการณ์ที่ใช้ค่าต่างกันสำหรับ org.gradle.jvmargs สำหรับ ตัวอย่างเช่น คุณสามารถสร้างสถานการณ์จำลองได้ดังนี้

# <root-project>/scenarios.txt
clean_build_2gb_4workers {
    tasks = [":app:assembleDebug"]
    gradle-args = ["--max-workers=4"]
    jvm-args = ["-Xmx2048m"]
    cleanup-tasks = ["clean"]
}
clean_build_parallelGC {
    tasks = [":app:assembleDebug"]
    jvm-args = ["-XX:+UseParallelGC"]
    cleanup-tasks = ["clean"]
}

clean_build_G1GC_4gb {
    tasks = [":app:assembleDebug"]
    jvm-args = ["-Xmx4096m", "-XX:+UseG1GC"]
    cleanup-tasks = ["clean"]
}

กำลังเรียกใช้ gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt จะแสดง 3 สถานการณ์ และคุณจะสามารถเปรียบเทียบระยะเวลา :app:assembleDebug ใช้เวลาในการตั้งค่าแต่ละรายการ

การทำโปรไฟล์ปลั๊กอิน Gradle เวอร์ชันต่างๆ

เพื่อดูว่าการเปลี่ยนเวอร์ชันของปลั๊กอิน Gradle จะส่งผลอย่างไร สร้างสถานการณ์เปรียบเทียบ การดำเนินการนี้ต้องใช้ การเตรียมที่จะแทรกเวอร์ชันปลั๊กอินจากสถานการณ์ต่างๆ เปลี่ยน ระดับรูท Build.gradle ของคุณ

# <root-project>/build.gradle
buildscript {
    def agpVersion = providers.systemProperty("agpVersion").forUseAtConfigurationTime().orNull ?: '4.1.0'

    ext.kotlin = providers.systemProperty('kotlinVersion').forUseAtConfigurationTime().orNull ?: '1.4.0'

    dependencies {
        classpath "com.android.tools.build:gradle:$agpVersion"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
    }
}

คุณระบุปลั๊กอิน Android Gradle และปลั๊กอิน Kotlin Gradle ได้แล้ว เวอร์ชันจากไฟล์สถานการณ์ และสถานการณ์ได้เพิ่มเมธอดใหม่ให้กับ ไฟล์ต้นฉบับ:

# <root-project>/scenarios.txt
non_abi_change_agp4.1.0_kotlin1.4.10 {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    System-properties {
      "agpVersion" = "4.1.0"
      "kotlinVersion" = "1.4.10"
}

non_abi_change_agp4.2.0_kotlin1.4.20 {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    System-properties {
      "agpVersion" = "4.2.0-alpha16"
      "kotlinVersion" = "1.4.20"
}

การทำโปรไฟล์บิลด์ที่เพิ่มขึ้น

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

# <root-project>/scenarios.txt
non_abi_change {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
}

abi_change {
    tasks = [":app:assembleDebug"]
    apply-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
}

layout_change {
    tasks = [":app:assembleDebug"]
    apply-android-layout-change-to = "app/src/main/res/your_layout_file.xml"
}
string_resource_change {
    tasks = [":app:assembleDebug"]
    apply-android-resource-value-change-to = "app/src/main/res/values/strings.xml"
}

กำลังเรียกใช้ gradle-profiler --benchmark --project-dir &lt;root-project> --scenario-file scenarios.txt จะสร้างรายงาน HTML ที่มีข้อมูลการเปรียบเทียบ

คุณสามารถรวมสถานการณ์ที่เพิ่มขึ้น กับการตั้งค่าอื่นๆ ได้ เช่น ขนาดฮีป จำนวนผู้ปฏิบัติงานหรือเวอร์ชัน Gradle:

# <root-project>/scenarios.txt
non_abi_change_4g {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx4096m"]
}

non_abi_change_4g_8workers {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx4096m"]
    gradle-args = ["--max-workers=8"]
}

non_abi_change_3g_gradle67 {
    tasks = [":app:assembleDebug"]
    apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
                              "app/src/main/java/com/example/your_app/your_code_file.kt"]
    jvm-args = ["-Xmx3072m"]
    version = ["6.7"]
}

การทำโปรไฟล์บิลด์ที่ไม่สะอาด

ในการเปรียบเทียบบิลด์สะอาด คุณสามารถสร้างสถานการณ์ที่จะ ที่ใช้ขับเคลื่อนการดำเนินการ Gradle-profiler

# <root-project>/scenarios.txt
clean_build {
    tasks = [":app:assembleDebug"]
    cleanup-tasks = ["clean"]
}

หากต้องการเรียกใช้สถานการณ์นี้ ให้ใช้คำสั่งต่อไปนี้

gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt

ใช้ตัวเลือก --profile ของ Gradle

หากต้องการสร้างและดูโปรไฟล์บิลด์จากบรรทัดคำสั่ง Gradle ให้ดำเนินการ ขั้นตอนต่อไปนี้

  1. เปิดเทอร์มินัลบรรทัดคำสั่งที่รูทของโปรเจ็กต์
  2. สร้างบิลด์ที่ปลอดภัยโดยป้อนคำสั่งต่อไปนี้ ขณะที่คุณสร้างโปรไฟล์ คุณควรสร้างบิลด์ที่สะอาดระหว่างการสร้างโปรไฟล์แต่ละครั้ง เนื่องจาก Gradle ข้ามงานเมื่ออินพุตของงาน (เช่น ซอร์สโค้ด) ไม่ เปลี่ยน ดังนั้น บิลด์ที่สองที่ไม่มีการเปลี่ยนแปลงอินพุตจะทำงานได้เร็วกว่าเสมอ เนื่องจาก ระบบจะไม่เรียกใช้ซ้ำ เพื่อเรียกใช้งาน clean ระหว่าง บิลด์ของคุณจะช่วยให้ทำโปรไฟล์ของกระบวนการบิลด์โดยสมบูรณ์ได้
    // On Mac or Linux, run the Gradle wrapper using "./gradlew".
    gradlew clean
    
  3. เรียกใช้บิลด์การแก้ไขข้อบกพร่องของเวอร์ชันผลิตภัณฑ์เวอร์ชันใดเวอร์ชันหนึ่ง เช่น "dev" รสชาติ ที่มีแฟล็กต่อไปนี้
    gradlew --profile --offline --rerun-tasks assembleFlavorDebug
    
    • --profile: เปิดใช้การทำโปรไฟล์
    • --offline: ปิดใช้ Gradle ไม่ให้ดึงข้อมูลออนไลน์ ทรัพยากร Dependency ซึ่งช่วยให้แน่ใจว่าความล่าช้าใดๆ ที่เกิดจาก Gradle การพยายามอัปเดตทรัพยากร Dependency จะไม่รบกวนการทำงานของ ที่ใช้ในการทำโปรไฟล์ คุณควรสร้างโปรเจ็กต์แล้ว 1 ครั้งเพื่อให้ ตรวจสอบว่า Gradle ดาวน์โหลดและแคชทรัพยากร Dependency แล้ว
    • --rerun-tasks: บังคับให้ Gradle เรียกใช้งานทั้งหมดอีกครั้ง และไม่ต้องสนใจ การเพิ่มประสิทธิภาพงาน
  4. รูปที่ 1 มุมมองโปรเจ็กต์ที่ระบุตำแหน่งที่ตั้งของ รายงานโปรไฟล์

    หลังจากสร้างเสร็จแล้ว ให้ใช้หน้าต่างโปรเจ็กต์เพื่อไปที่ ไดเรกทอรี project-root/build/reports/profile/ (เป็น แสดงในรูปที่ 1)

  5. คลิกขวาที่ไฟล์ profile-timestamp.html แล้วเลือก เปิดในเบราว์เซอร์ > ค่าเริ่มต้น รายงานควรมีลักษณะคล้ายกับ รูปที่ 2 คุณสามารถตรวจสอบแต่ละแท็บในรายงานเพื่อดูข้อมูลเกี่ยวกับ บิลด์ เช่น แท็บการเรียกใช้งาน ซึ่งแสดงเวลาที่ Gradle ใช้เวลา เพื่อดำเนินการกับบิลด์แต่ละรายการ

    รูปที่ 2 ดูรายงานในเบราว์เซอร์

  6. ไม่บังคับ: ก่อนทําการเปลี่ยนแปลงในโปรเจ็กต์หรือบิลด์ การกำหนดค่า ให้พูดคำสั่งซ้ำในขั้นตอนที่ 3 แต่ไม่ต้องระบุ แฟล็ก --rerun-tasks เนื่องจาก Gradle พยายามประหยัดเวลาโดย การดำเนินการอีกครั้งซึ่งอินพุตยังเหมือนเดิม (ระบุเป็น UP-TO-DATEในแท็บการเรียกใช้งานของรายงานดังที่แสดง ในรูปที่ 3) คุณจะระบุได้ว่างานใดกำลังทำงาน ไม่ควรเป็นอย่างนั้น ตัวอย่างเช่น หาก ไม่ได้ทำเครื่องหมาย :app:processDevUniversalDebugManifest เป็น UP-TO-DATE อาจแนะนำว่าการกำหนดค่าบิลด์ของคุณ อัปเดตไฟล์ Manifest แบบไดนามิกสำหรับทุกบิลด์ แต่งานบางอย่างจะต้อง ทำงานระหว่างบิลด์แต่ละรายการ เช่น :app:checkDevDebugManifest

    รูปที่ 3 กำลังดูผลลัพธ์ของการเรียกใช้งาน

ตอนนี้คุณมีรายงานโปรไฟล์การสร้างแล้ว คุณสามารถเริ่มค้นหา โดยการตรวจสอบข้อมูลในแต่ละแท็บของ รายงาน การตั้งค่าบิลด์บางรายการต้องใช้การทดลองเนื่องจากประโยชน์อาจ โปรเจ็กต์และเวิร์กสเตชันจะแตกต่างกัน เช่น โปรเจ็กต์ที่มี Codebase อาจได้ประโยชน์จากการลดขนาดโค้ด เพื่อนำโค้ดที่ไม่ได้ใช้งานออกและลดขนาดแอป แต่ขนาดที่เล็กกว่า อาจได้รับประโยชน์มากขึ้นจากการปิดใช้การย่อโค้ดไปเลย นอกจากนี้ การเพิ่มขนาดฮีปของ Gradle (โดยใช้ org.gradle.jvmargs) อาจส่งผลเสียต่อประสิทธิภาพในเครื่องที่มีหน่วยความจำต่ำ

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

รูปที่ 4 ดูรายงานใหม่หลังจากเพิ่มประสิทธิภาพบิลด์ อย่างรวดเร็ว