กำหนดค่าบิวด์

ระบบบิลด์ของ Android จะคอมไพล์ทรัพยากรและซอร์สโค้ดของแอป แล้วแพ็ก เป็น APK หรือ Android App Bundle ที่คุณสามารถทดสอบ, นำไปใช้งาน, ลงนาม และ จัดจำหน่ายได้

ในภาพรวมการสร้าง Gradle และโครงสร้างการสร้าง Android เราได้พูดถึงแนวคิดการสร้างและโครงสร้างของแอป Android ตอนนี้ก็ถึงเวลาที่จะกำหนดค่าการสร้างแล้ว

อภิธานศัพท์การบิลด์ Android

Gradle และปลั๊กอิน Android Gradle ช่วยคุณกำหนดค่าด้านต่อไปนี้ ของการบิลด์

ประเภทการสร้าง

ประเภทบิลด์จะกำหนดพร็อพเพอร์ตี้บางอย่างที่ Gradle ใช้เมื่อสร้างและ แพ็กเกจแอป โดยปกติแล้วจะมีการกำหนดค่าประเภทบิลด์สำหรับ ขั้นตอนต่างๆ ของวงจรการพัฒนา

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

คุณต้องกำหนดประเภทบิลด์อย่างน้อย 1 ประเภทเพื่อ สร้างแอป Android Studio จะสร้างประเภทบิลด์ดีบักและรีลีส โดยค่าเริ่มต้น หากต้องการเริ่มปรับแต่งการตั้งค่าการแพ็กเกจสำหรับแอป โปรดดูวิธีกำหนดค่าประเภทบิลด์

รสชาติของผลิตภัณฑ์
Product Flavor แสดงถึงแอปเวอร์ชันต่างๆ ที่คุณสามารถ เผยแพร่ให้ผู้ใช้ เช่น เวอร์ชันฟรีและเวอร์ชันที่ต้องชำระเงิน คุณสามารถ ปรับแต่ง Product Flavor เพื่อใช้โค้ดและทรัพยากรที่แตกต่างกันขณะแชร์ และนำส่วนที่ใช้ร่วมกันในแอปทุกเวอร์ชันกลับมาใช้ใหม่ได้ Product Flavor เป็นตัวเลือก และคุณต้องสร้างด้วยตนเอง หากต้องการเริ่มสร้างแอปเวอร์ชันต่างๆ ให้ดูวิธีกำหนดค่า Product Flavor
สร้างตัวแปร
ตัวแปรบิลด์คือผลลัพธ์ที่ได้จากการรวมประเภทบิลด์และรสชาติผลิตภัณฑ์ และ เป็นการกำหนดค่าที่ Gradle ใช้เพื่อสร้างแอปของคุณ การใช้ตัวแปรบิลด์จะช่วยให้ คุณสร้างเวอร์ชันดีบักของรสชาติผลิตภัณฑ์ได้ในระหว่างการพัฒนา และสร้างเวอร์ชันรีลีสที่ลงชื่อของรสชาติผลิตภัณฑ์เพื่อการจัดจำหน่ายได้ แม้ว่าคุณจะไม่ได้กำหนดค่าตัวแปรของบิวด์โดยตรง แต่คุณก็กำหนดค่า ประเภทบิวด์และรสชาติของผลิตภัณฑ์ที่ประกอบกันเป็นตัวแปรของบิวด์ได้ การสร้างประเภทบิลด์ หรือรสชาติผลิตภัณฑ์เพิ่มเติมจะสร้างตัวแปรบิลด์เพิ่มเติมด้วย หากต้องการดูวิธีสร้างและจัดการตัวแปรของบิลด์ โปรดอ่านภาพรวมกำหนดค่าตัวแปรของบิลด์
รายการในไฟล์ Manifest
คุณระบุค่าสำหรับพร็อพเพอร์ตี้บางอย่างของไฟล์ Manifest ในการกำหนดค่าตัวแปรบิลด์ได้ ค่าการสร้างเหล่านี้จะลบล้างค่าที่มีอยู่ใน ไฟล์ Manifest ซึ่งจะมีประโยชน์หากคุณต้องการสร้างแอปหลายรูปแบบ ที่มีชื่อแอปพลิเคชัน, SDK เวอร์ชันขั้นต่ำ หรือ SDK เวอร์ชันเป้าหมายแตกต่างกัน เมื่อมีไฟล์ Manifest หลายรายการ เครื่องมือผสานไฟล์ Manifest จะ ผสานการตั้งค่าไฟล์ Manifest
การขึ้นต่อกัน
ระบบบิลด์จะจัดการการอ้างอิงโปรเจ็กต์จากระบบไฟล์ในเครื่อง และจากที่เก็บข้อมูลระยะไกล ซึ่งหมายความว่าคุณไม่ต้องค้นหา ดาวน์โหลด และคัดลอกแพ็กเกจไบนารีของ Dependency ลงในไดเรกทอรีโปรเจ็กต์ด้วยตนเอง ดูข้อมูลเพิ่มเติมได้ที่หัวข้อเพิ่มการพึ่งพาบิลด์
การลงนาม
ระบบบิลด์ช่วยให้คุณระบุการตั้งค่าการลงนามในการกำหนดค่าบิลด์ และลงนามในแอปโดยอัตโนมัติในระหว่างกระบวนการบิลด์ได้ ระบบบิลด์จะลงนามเวอร์ชันแก้ไขข้อบกพร่องด้วยคีย์และ ใบรับรองเริ่มต้นโดยใช้ข้อมูลเข้าสู่ระบบที่ทราบเพื่อหลีกเลี่ยงการแจ้งรหัสผ่านในเวลาบิลด์ ระบบบิลด์จะไม่ลงนามในเวอร์ชันรีลีส เว้นแต่คุณจะ กำหนดค่าการลงนามสำหรับบิลด์นี้อย่างชัดเจน หากไม่มีคีย์รุ่น คุณสามารถสร้างคีย์ได้ตามที่อธิบายไว้ในลงนามในแอป การสร้างรุ่นที่ลงนามแล้ว เป็นสิ่งจำเป็นสำหรับการเผยแพร่แอปผ่าน App Store ส่วนใหญ่
การลดขนาดโค้ดและทรัพยากร
ระบบบิลด์ช่วยให้คุณระบุไฟล์กฎ ProGuard ที่แตกต่างกันสำหรับ แต่ละบิลด์ตัวแปรได้ เมื่อสร้างแอป ระบบบิลด์จะใช้ชุดกฎที่เหมาะสมเพื่อลดขนาด โค้ดและทรัพยากรโดยใช้เครื่องมือลดขนาดในตัว เช่น R8 การย่อขนาดโค้ดและทรัพยากรจะช่วยลดขนาด APK หรือ AAB ได้
การรองรับ APK หลายรายการ
ระบบบิลด์ช่วยให้คุณสร้าง APK ต่างๆ โดยอัตโนมัติ ซึ่งแต่ละ APK จะมีเฉพาะโค้ดและทรัพยากรที่จำเป็น สำหรับความหนาแน่นของหน้าจอหรือ Application Binary Interface (ABI) ที่เฉพาะเจาะจง ดูข้อมูลเพิ่มเติมได้ที่ สร้าง APK หลายรายการ อย่างไรก็ตาม การเผยแพร่ AAB รายการเดียวเป็น แนวทางที่แนะนำ เนื่องจากมีตัวเลือกการแยกตามภาษาเพิ่มเติมจาก ความหนาแน่นของหน้าจอและ ABI ขณะเดียวกันก็ไม่จำเป็นต้องอัปโหลด อาร์ติแฟกต์หลายรายการไปยัง Google Play แอปใหม่ทั้งหมดที่ส่งหลังจากเดือนสิงหาคม 2021 จะต้องใช้ AAB

เวอร์ชัน Java ในบิลด์ Android

ไม่ว่าคุณจะเขียนซอร์สโค้ดใน Java, Kotlin หรือทั้ง 2 ภาษา คุณต้องเลือก JDK หรือเวอร์ชันภาษา Java สําหรับบิลด์ในหลายที่ ดูรายละเอียดได้ที่เวอร์ชัน Java ในบิลด์ Android

สร้างไฟล์การกำหนดค่าบิลด์

การสร้างการกำหนดค่าบิลด์ที่กำหนดเองกำหนดให้คุณต้องทำการเปลี่ยนแปลงไฟล์การกำหนดค่าบิลด์อย่างน้อย 1 ไฟล์ ไฟล์ข้อความธรรมดาเหล่านี้ใช้ภาษาเฉพาะโดเมน (DSL) เพื่ออธิบายและจัดการตรรกะการสร้างโดยใช้สคริปต์ Kotlin ซึ่งเป็นรูปแบบหนึ่งของภาษา Kotlin นอกจากนี้ คุณยังใช้ Groovy ซึ่งเป็น ภาษาแบบไดนามิกสำหรับเครื่องเสมือน Java (JVM) เพื่อกำหนดค่าบิลด์ได้ด้วย

คุณไม่จำเป็นต้องทราบสคริปต์ Kotlin หรือ Groovy เพื่อเริ่มกำหนดค่าบิลด์ เนื่องจากปลั๊กอิน Android Gradle จะแนะนำองค์ประกอบ DSL ส่วนใหญ่ที่คุณต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับ DSL ของปลั๊กอิน Android Gradle ได้ที่ เอกสารอ้างอิง DSL สคริปต์ Kotlin ยังขึ้นอยู่กับ Gradle Kotlin DSL พื้นฐานด้วย

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

ไฟล์ Gradle Wrapper

Gradle Wrapper (gradlew) เป็นแอปพลิเคชันขนาดเล็กที่รวมอยู่ในซอร์สโค้ด ของคุณ ซึ่งจะดาวน์โหลดและเปิดใช้ Gradle เอง ซึ่งจะช่วยให้การดำเนินการบิลด์มีความสอดคล้องกันมากขึ้น นักพัฒนาแอปจะดาวน์โหลดซอร์สโค้ดของแอปพลิเคชันและเรียกใช้ gradlew ซึ่งจะดาวน์โหลดการกระจาย Gradle ที่จำเป็น และเปิดใช้ Gradle เพื่อสร้างแอปพลิเคชัน

ไฟล์ gradle/wrapper/gradle-wrapper.properties มีพร็อพเพอร์ตี้ distributionUrl ที่อธิบายว่าใช้ Gradle เวอร์ชันใดในการเรียกใช้บิลด์

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

ไฟล์การตั้งค่า Gradle

ไฟล์ settings.gradle.kts (สำหรับ Kotlin DSL) หรือไฟล์ settings.gradle (สำหรับ Groovy DSL) จะอยู่ในรูท ของไดเรกทอรีโปรเจ็กต์ ไฟล์การตั้งค่านี้กำหนดการตั้งค่าที่เก็บระดับโปรเจ็กต์ และแจ้งให้ Gradle ทราบว่าควรมีโมดูลใดบ้างเมื่อสร้างแอป โปรเจ็กต์แบบหลายโมดูลต้องระบุแต่ละโมดูลที่ควรอยู่ในบิลด์สุดท้าย

สำหรับโปรเจ็กต์ส่วนใหญ่ ไฟล์จะมีลักษณะดังต่อไปนี้โดยค่าเริ่มต้น

Kotlin

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
      google()
      mavenCentral()
  }
}
rootProject.name = "My Application"
include(":app")

Groovy

pluginManagement {

    /**
      * The pluginManagement.repositories block configures the
      * repositories Gradle uses to search or download the Gradle plugins and
      * their transitive dependencies. Gradle pre-configures support for remote
      * repositories such as JCenter, Maven Central, and Ivy. You can also use
      * local repositories or define your own remote repositories. Here we
      * define the Gradle Plugin Portal, Google's Maven repository,
      * and the Maven Central Repository as the repositories Gradle should use to look for its
      * dependencies.
      */

    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {

    /**
      * The dependencyResolutionManagement.repositories
      * block is where you configure the repositories and dependencies used by
      * all modules in your project, such as libraries that you are using to
      * create your application. However, you should configure module-specific
      * dependencies in each module-level build.gradle file. For new projects,
      * Android Studio includes Google's Maven repository and the Maven Central
      * Repository by default, but it does not configure any dependencies (unless
      * you select a template that requires some).
      */

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My Application"
include ':app'

ไฟล์บิลด์ระดับบนสุด

ไฟล์ build.gradle.kts ระดับบนสุด (สำหรับ Kotlin DSL) หรือ ไฟล์ build.gradle (สำหรับ Groovy DSL) จะอยู่ในไดเรกทอรีโปรเจ็กต์รูท โดยปกติแล้วจะกำหนดเวอร์ชันทั่วไปของปลั๊กอินที่โมดูลในโปรเจ็กต์ใช้

ตัวอย่างโค้ดต่อไปนี้อธิบายการตั้งค่าเริ่มต้นและองค์ประกอบ DSL ใน สคริปต์บิลด์ระดับบนสุดหลังจากสร้างโปรเจ็กต์ใหม่

Kotlin

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id("com.android.application") version "8.11.0" apply false
    id("com.android.library") version "8.11.0" apply false
    id("org.jetbrains.kotlin.android") version "2.1.20" apply false
}

Groovy

plugins {

    /**
     * Use `apply false` in the top-level build.gradle file to add a Gradle
     * plugin as a build dependency but not apply it to the current (root)
     * project. Don't use `apply false` in sub-projects. For more information,
     * see Applying external plugins with same version to subprojects.
     */

    id 'com.android.application' version '8.11.0' apply false
    id 'com.android.library' version '8.11.0' apply false
    id 'org.jetbrains.kotlin.android' version '2.1.20' apply false
}