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

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

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

อภิธานศัพท์เกี่ยวกับบิลด์ของ Android

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

ประเภทบิลด์

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

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

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

รสชาติของผลิตภัณฑ์
ตัวแปรผลิตภัณฑ์แสดงถึงแอปเวอร์ชันต่างๆ ที่คุณเผยแพร่ให้ผู้ใช้ใช้ได้ เช่น เวอร์ชันฟรีและเวอร์ชันที่ต้องชำระเงิน คุณสามารถปรับแต่ง Flavour ของผลิตภัณฑ์เพื่อใช้โค้ดและทรัพยากรที่แตกต่างกันขณะแชร์และใช้ซ้ำในส่วนที่เหมือนกันกับแอปทุกเวอร์ชันได้ Flavour ของผลิตภัณฑ์เป็นตัวเลือกที่คุณสร้างได้เอง หากต้องการเริ่มสร้างแอปเวอร์ชันต่างๆ ให้ดูวิธีกําหนดค่ารุ่นผลิตภัณฑ์
สร้างตัวแปร
ตัวแปรการสร้างคือผลิตภัณฑ์ร่วมของประเภทการสร้างและตัวแปรผลิตภัณฑ์ และเป็นการกำหนดค่าที่ Gradle ใช้สร้างแอป การใช้ตัวแปรการสร้างจะช่วยให้คุณสร้างตัวแปรผลิตภัณฑ์เวอร์ชันแก้ไขข้อบกพร่องในระหว่างการพัฒนา และตัวแปรผลิตภัณฑ์เวอร์ชันที่เผยแพร่และรับรองแล้วสำหรับการเผยแพร่ได้ แม้ว่าคุณจะไม่ได้กำหนดค่าตัวแปรของบิวด์โดยตรง แต่คุณก็กำหนดค่าประเภทบิวด์และตัวแปรผลิตภัณฑ์ที่ประกอบกันเป็นตัวแปรของบิวด์ได้ การสร้างประเภทบิลด์หรือตัวแปรผลิตภัณฑ์เพิ่มเติมจะสร้างตัวแปรบิลด์เพิ่มเติมด้วย หากต้องการดูวิธีสร้างและจัดการตัวแปรของบิวด์ โปรดอ่านภาพรวมกำหนดค่าตัวแปรของบิวด์
รายการ Manifest
คุณสามารถระบุค่าสำหรับพร็อพเพอร์ตี้บางอย่างของไฟล์ Manifest ในการกำหนดค่าตัวแปรของบิลด์ได้ ค่าการสร้างเหล่านี้จะลบล้างค่าที่มีอยู่ในไฟล์ Manifest ซึ่งจะมีประโยชน์หากคุณต้องการสร้างตัวแปรหลายรายการของแอปที่มีชื่อแอปพลิเคชัน เวอร์ชัน SDK ขั้นต่ำ หรือเวอร์ชัน SDK เป้าหมายแตกต่างกัน เมื่อมีไฟล์ Manifest หลายรายการ เครื่องมือผสานไฟล์ Manifest จะ ผสานการตั้งค่าไฟล์ Manifest
Dependency
ระบบบิลด์จะจัดการทรัพยากร Dependency ของโปรเจ็กต์จากระบบไฟล์ในเครื่องและจากที่เก็บระยะไกล ซึ่งหมายความว่าคุณไม่จําเป็นต้องค้นหา ดาวน์โหลด และคัดลอกแพ็กเกจไบนารีของไลบรารีที่ใช้ร่วมกันลงในไดเรกทอรีโปรเจ็กต์ด้วยตนเอง ดูข้อมูลเพิ่มเติมได้ที่หัวข้อเพิ่มการพึ่งพิงบิวด์
การลงชื่อ
ระบบบิลด์ช่วยให้คุณระบุการตั้งค่าการรับรองในการกำหนดค่าบิลด์ได้ และสามารถรับรองแอปโดยอัตโนมัติในระหว่างกระบวนการบิลด์ ระบบบิลด์จะเซ็นชื่อเวอร์ชันแก้ไขข้อบกพร่องด้วยคีย์และใบรับรองเริ่มต้นโดยใช้ข้อมูลเข้าสู่ระบบที่ทราบเพื่อหลีกเลี่ยงข้อความแจ้งให้ป้อนรหัสผ่านขณะสร้าง ระบบบิลด์จะไม่เซ็นชื่อเวอร์ชันที่เผยแพร่ เว้นแต่คุณจะกำหนดค่าการเซ็นชื่อสำหรับบิลด์นี้อย่างชัดเจน หากไม่มีคีย์รุ่น คุณสามารถสร้างคีย์ได้ตามที่อธิบายไว้ในลงนามแอป คุณต้องเผยแพร่บิลด์รุ่นที่ลงนามแล้วผ่าน App Store ส่วนใหญ่
การลดขนาดโค้ดและทรัพยากร
ระบบการสร้างช่วยให้คุณระบุไฟล์กฎ ProGuard ที่แตกต่างกันสำหรับตัวแปรการสร้างแต่ละรายการได้ เมื่อสร้างแอป ระบบบิลด์จะใช้ชุดกฎที่เหมาะสมเพื่อบีบอัดโค้ดและทรัพยากรโดยใช้เครื่องมือบีบอัดในตัว เช่น R8 การย่อโค้ดและทรัพยากรจะช่วยลดความจุของ APK หรือ AAB
การรองรับ 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 เพื่อเริ่มกำหนดค่าบิลด์ เนื่องจากปลั๊กอิน Gradle ของ Android จะแนะนำองค์ประกอบ DSL ส่วนใหญ่ที่คุณต้องการ หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ DSL ของปลั๊กอิน Android Gradle โปรดอ่านเอกสารอ้างอิง DSL สคริปต์ Kotlin ยังใช้ Gradle Kotlin DSL ที่อยู่เบื้องหลังด้วย

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

ไฟล์ Gradle Wrapper

Wrapper ของ Gradle (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 (สำหรับ DSL ของ Kotlin) หรือไฟล์ settings.gradle (สำหรับ DSL ของ Groovy) จะอยู่ในไดเรกทอรีรูทของโปรเจ็กต์ ไฟล์การตั้งค่านี้จะกำหนดการตั้งค่าที่เก็บระดับโปรเจ็กต์และแจ้งให้ 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 ระดับบนสุด (สำหรับ DSL ของ Kotlin) หรือไฟล์ build.gradle (สำหรับ DSL ของ Groovy) จะอยู่ในไดเรกทอรีรูทของโปรเจ็กต์ โดยปกติแล้วจะใช้กำหนดเวอร์ชันทั่วไปของปลั๊กอินที่ใช้โดยโมดูลในโปรเจ็กต์

ตัวอย่างโค้ดต่อไปนี้อธิบายการตั้งค่าเริ่มต้นและองค์ประกอบ 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.7.0" apply false
    id("com.android.library") version "8.7.0" apply false
    id("org.jetbrains.kotlin.android") version "2.0.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.7.0' apply false
    id 'com.android.library' version '8.7.0' apply false
    id 'org.jetbrains.kotlin.android' version '2.0.20' apply false
}