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

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

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

อภิธานศัพท์บิลด์ของ Android

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

ประเภทบิลด์

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

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

คุณต้องกำหนดประเภทบิลด์อย่างน้อย 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

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 (สำหรับ 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
}