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

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

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

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

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

ประเภทบิลด์

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

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

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

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

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

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

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

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

ดึงดูด

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 "9.4.0" apply false
    id("com.android.library") version "9.4.0" apply false
    id("org.jetbrains.kotlin.android") version "2.4.10" apply false
}

ดึงดูด

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 '9.4.0' apply false
    id 'com.android.library' version '9.4.0' apply false
    id 'org.jetbrains.kotlin.android' version '2.4.10' apply false
}