ระบบบิลด์ของ Android จะรวบรวมทรัพยากรของแอป รวมถึงซอร์สโค้ดและแพ็กเกจ เป็น APK หรือ Android App Bundle ที่คุณจะทดสอบ ติดตั้งใช้งาน รับรอง แจกจ่าย
Android Studio ใช้ Gradle ซึ่งเป็นชุดเครื่องมือบิลด์ขั้นสูงเพื่อเปลี่ยนโหมดการทำงานอัตโนมัติ และจัดการกระบวนการสร้าง พร้อมกับให้คุณกำหนด การกำหนดค่าบิลด์ การกำหนดค่าบิลด์แต่ละรายการจะกำหนดชุดโค้ดของตัวเองได้ และทรัพยากรต่างๆ ไปพร้อมกับนำส่วนที่พบได้ทั่วไปในแอปทุกเวอร์ชันมาใช้ซ้ำ ปลั๊กอิน Android Gradle ทำงานร่วมกับชุดเครื่องมือบิลด์ เพื่อให้ กระบวนการและการตั้งค่าที่กำหนดค่าได้ซึ่งมีไว้สำหรับการสร้างและการทดสอบโดยเฉพาะ แอป Android
Gradle และปลั๊กอิน Android Gradle ทำงานแยกจาก Android Studio ช่วงเวลานี้ หมายความว่าคุณสามารถสร้างแอป Android จากใน Android Studio บรรทัดคำสั่งบนเครื่องของคุณหรือในเครื่องที่ไม่ได้ใช้ Android Studio ติดตั้งไว้ เช่น เซิร์ฟเวอร์การรวมอย่างต่อเนื่อง
หากคุณไม่ได้ใช้ Android Studio คุณสามารถเรียนรู้วิธีสร้างและเรียกใช้แอปจาก บรรทัดคำสั่ง เอาต์พุตของบิลด์จะเหมือนกันไม่ว่าคุณ สร้างโปรเจ็กต์จากบรรทัดคำสั่ง บนเครื่องระยะไกล หรือใช้ Android Studio
หมายเหตุ: เนื่องจาก Gradle และปลั๊กอิน Android Gradle ทำงาน แยกต่างหากจาก Android Studio คุณจะต้องอัปเดตเครื่องมือสร้างบิลด์ แยกกัน อ่านบันทึกประจำรุ่นเพื่อดูวิธีอัปเดต Gradle และปลั๊กอิน Android Gradle
ความยืดหยุ่นของระบบบิลด์ของ Android ช่วยให้คุณสร้าง สร้างการกำหนดค่าโดยไม่แก้ไขไฟล์แหล่งที่มาหลักของแอป ช่วงเวลานี้ ช่วยให้คุณเข้าใจวิธีการทำงานของระบบบิลด์ Android และวิธีการทำงานของ ซึ่งจะช่วยให้คุณปรับแต่งและทำให้การกำหนดค่าบิลด์หลายรายการทำงานโดยอัตโนมัติได้ หากคุณ หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการทำให้แอปใช้งานได้ โปรดดูสร้างและเรียกใช้แอป วิธีสร้างแบบกำหนดเอง การกำหนดค่าบิลด์ทันที โดยใช้ Android Studio โปรดดูกำหนดค่าบิลด์ ผลิตภัณฑ์ย่อย
กระบวนการบิลด์
กระบวนการบิลด์ประกอบด้วยเครื่องมือและกระบวนการมากมายที่แปลงโปรเจ็กต์ของคุณ ลงใน Android Application Package (APK) หรือ Android App Bundle (AAB) ให้หน่อย
ปลั๊กอิน Android Gradle สร้างกระบวนการบิลด์ส่วนใหญ่ให้คุณ แต่ก็ทำได้ ในการทำความเข้าใจกระบวนการสร้างบางด้าน เพื่อช่วยให้คุณสามารถปรับ เพื่อตอบสนองความต้องการของคุณ
โปรเจ็กต์ที่แตกต่างกันอาจมีเป้าหมายบิลด์ที่แตกต่างกัน ตัวอย่างเช่น บิลด์สำหรับ ไลบรารีของบุคคลที่สามสร้าง Android Archive (AAR) หรือ Java Archive (JAR) ห้องสมุด อย่างไรก็ตาม แอปคือประเภทโปรเจ็กต์ที่พบบ่อยที่สุดและสร้างขึ้นสำหรับแอป โปรเจ็กต์จะสร้างการแก้ไขข้อบกพร่องหรือเผยแพร่ APK หรือ AAB ของแอปที่คุณทำให้ใช้งานได้ ทดสอบ หรือเผยแพร่ไปยังผู้ใช้ภายนอก
หน้านี้จะมุ่งเน้นที่การพัฒนาแอป แต่หลายขั้นตอนและแนวคิดของบิลด์มีอยู่ในประเภทบิลด์ส่วนใหญ่
อภิธานศัพท์บิลด์ของ Android
Gradle และปลั๊กอิน Android Gradle ช่วยคุณกำหนดค่าด้านต่างๆ ต่อไปนี้ ของบิลด์ของคุณ
- ประเภทบิลด์
-
ประเภทบิลด์จะกำหนดคุณสมบัติบางอย่างที่ Gradle ใช้เมื่อสร้าง และ ทำแพ็กเกจแอปของคุณ โดยทั่วไปประเภทบิลด์จะได้รับการกำหนดค่าสำหรับ ในวงจรการพัฒนา
เช่น ประเภทบิลด์การแก้ไขข้อบกพร่อง จะเปิดใช้ตัวเลือกการแก้ไขข้อบกพร่อง และรับรองแอปด้วยคีย์การแก้ไขข้อบกพร่อง ประเภทบิลด์ที่เผยแพร่อาจย่อ ทำให้ยากต่อการอ่าน (Obfuscate) และรับรองแอปของคุณด้วยรุ่น เพื่อการเผยแพร่
คุณต้องกำหนดประเภทบิลด์อย่างน้อย 1 ประเภทเพื่อ สร้างแอปของคุณขึ้นมา Android Studio สร้างประเภทบิลด์การแก้ไขข้อบกพร่องและรุ่น โดยค่าเริ่มต้น หากต้องการเริ่มปรับแต่งการตั้งค่าแพ็กเกจสำหรับแอป โปรดดูวิธี เพื่อกำหนดค่าบิลด์ ประเภทต่างๆ
- รสชาติของผลิตภัณฑ์
- รสชาติของผลิตภัณฑ์แสดงถึงแอปเวอร์ชันต่างๆ ที่คุณทำสิ่งต่อไปนี้ได้ ให้แก่ผู้ใช้ เช่น เวอร์ชันฟรีและเวอร์ชันที่ต้องชำระเงิน คุณสามารถ กำหนดรสชาติของผลิตภัณฑ์ให้ใช้โค้ดและทรัพยากรต่างๆ ขณะแชร์ และนำชิ้นส่วนที่พบได้ทั่วไปในแอปทุกเวอร์ชันมาใช้ซ้ำ ผลิตภัณฑ์ รสชาติเป็นตัวเลือกที่ไม่บังคับ และคุณต้องสร้างรสชาติด้วยตนเอง วิธีเริ่มสร้าง เวอร์ชันต่างๆ ของแอปของคุณ โปรดดูวิธีกำหนดค่า รสชาติของผลิตภัณฑ์
- ตัวแปรของบิลด์
- ตัวแปรของบิลด์คือข้ามผลิตภัณฑ์ของประเภทบิลด์และรสชาติของผลิตภัณฑ์ และ คือการกำหนดค่าที่ Gradle ใช้ในการสร้างแอปของคุณ การใช้ตัวแปรของบิลด์ คุณสามารถสร้างเวอร์ชันแก้ไขข้อบกพร่องของเวอร์ชันผลิตภัณฑ์ในระหว่างการพัฒนาได้ และเวอร์ชันผลิตภัณฑ์ที่ลงนามแล้วของเวอร์ชัน ผลิตภัณฑ์ของคุณสำหรับการจัดจำหน่าย แม้ว่าคุณจะไม่ได้กำหนดค่าตัวแปรของบิลด์โดยตรง แต่คุณจะกำหนดค่า ประเภทและรสชาติของผลิตภัณฑ์ที่ก่อตัวขึ้น กำลังสร้างบิลด์เพิ่มเติม ประเภทหรือเวอร์ชันผลิตภัณฑ์ยังเป็นการสร้างตัวแปรบิลด์เพิ่มเติมอีกด้วย เพื่อเรียนรู้ วิธีสร้างและจัดการตัวแปรของบิลด์ โปรดอ่านกำหนดค่าตัวแปรของบิลด์ ภาพรวม
- รายการไฟล์ Manifest
- คุณระบุค่าสำหรับพร็อพเพอร์ตี้บางรายการของไฟล์ Manifest ในบิลด์ได้ การกำหนดค่าตัวแปร ค่าบิลด์เหล่านี้จะลบล้างค่าที่มีอยู่ใน ไฟล์ Manifest วิธีนี้มีประโยชน์หากต้องการสร้างตัวแปรหลายรายการ ด้วยชื่อแอปพลิเคชันอื่น เวอร์ชัน SDK ขั้นต่ำ หรือ เวอร์ชัน SDK เป้าหมาย เมื่อมีไฟล์ Manifest หลายรายการ เครื่องมือผสาน รวมการตั้งค่าไฟล์ Manifest
- การขึ้นต่อกัน
- ระบบบิลด์จะจัดการทรัพยากร Dependency ของโปรเจ็กต์จากระบบไฟล์ในเครื่องของคุณ และจากที่เก็บระยะไกล ซึ่งหมายความว่าคุณไม่ต้องกำหนด ค้นหา ดาวน์โหลด และคัดลอกแพ็กเกจไบนารีของทรัพยากร Dependency ไปยัง ไดเรกทอรีโปรเจ็กต์ ดูข้อมูลเพิ่มเติมได้จากเพิ่มบิลด์ ทรัพยากร Dependency
- การลงนาม
- ระบบบิลด์ให้คุณระบุการตั้งค่าการรับรองในบิลด์ได้ และสามารถรับรองแอปของคุณโดยอัตโนมัติระหว่างบิลด์ได้ ขั้นตอนได้ ระบบบิลด์จะรับรองเวอร์ชันแก้ไขข้อบกพร่องด้วยคีย์เริ่มต้น ใบรับรองที่ใช้ข้อมูลเข้าสู่ระบบที่รู้จักเพื่อหลีกเลี่ยงการถามรหัสผ่านที่บิลด์ ระบบบิลด์จะไม่รับรองเวอร์ชันที่เผยแพร่ เว้นแต่คุณจะ กำหนดการกำหนดค่าการลงชื่อสำหรับบิลด์นี้อย่างชัดเจน หากไม่ มีคีย์การเผยแพร่ ซึ่งสามารถสร้างได้ตามที่อธิบายไว้ในลงนามแอป บิลด์ที่ลงนามแล้ว จำเป็นสำหรับการจัดจำหน่ายแอปผ่าน App Store ส่วนใหญ่
- การลดขนาดโค้ดและทรัพยากร
- ระบบบิลด์ช่วยให้คุณระบุไฟล์กฎ ProGuard ที่แตกต่างกันสำหรับ ตัวแปรของบิลด์แต่ละรายการ เมื่อคุณสร้างแอป ระบบบิลด์จะใช้ กฎที่เหมาะสมในการย่อ โค้ดและทรัพยากรโดยใช้เครื่องมือการลดขนาดในตัว เช่น R8 การลดขนาดโค้ดและทรัพยากรจะช่วยลดขนาด APK หรือ AAB ได้
- การรองรับ APK หลายรายการ
- ระบบบิลด์จะช่วยให้คุณสร้าง APK ต่างๆ ได้โดยอัตโนมัติ แต่ละรายการจะมีเฉพาะโค้ดและทรัพยากรที่จำเป็น สำหรับความหนาแน่นของหน้าจอหรืออินเทอร์เฟซแบบไบนารีของแอปพลิเคชัน (ABI) สำหรับข้อมูลเพิ่มเติม โปรดดูที่ สร้าง APK หลายรายการ แต่การเผยแพร่ AAB รายการเดียวจะเป็น วิธีการที่แนะนำ เนื่องจากมีการแยกตามภาษานอกเหนือจาก ความหนาแน่นของหน้าจอและ ABI โดยไม่ต้องอัปโหลด และอาร์ติแฟกต์หลายรายการ ลงใน Google Play แอปใหม่ทั้งหมดที่ส่งหลังเดือนสิงหาคม 2021 จะต้องใช้ AAB
เวอร์ชัน Java ใน Android บิลด์
ซอร์สโค้ดของคุณเขียนด้วย Java, Kotlin หรือทั้งคู่ คุณต้องเลือกภาษา JDK หรือ Java จากหลายที่ สำหรับบิลด์ของคุณ ดูเวอร์ชัน Java ในบิลด์ Android เพื่อดูรายละเอียด
ไฟล์การกำหนดค่าบิลด์
คุณต้องทำการเปลี่ยนแปลงอย่างใดอย่างหนึ่งหรือ ไฟล์การกำหนดค่าบิลด์เพิ่มเติม เหล่านี้ ไฟล์ข้อความธรรมดาจะใช้ภาษาเฉพาะโดเมน (DSL) เพื่ออธิบายและ จัดการตรรกะของบิลด์โดยใช้ สคริปต์ Kotlin ซึ่งเป็นกลิ่นอายของภาษา Kotlin คุณยังสามารถใช้ Groovy ซึ่งเป็น ภาษาแบบไดนามิกสำหรับ Java Virtual Machine (JVM) เพื่อกำหนดค่าบิลด์
คุณไม่จำเป็นต้องรู้สคริปต์ Kotlin หรือ Groovy เพื่อเริ่มกำหนดค่า เนื่องจากปลั๊กอิน Android Gradle แนะนำองค์ประกอบ DSL ส่วนใหญ่ ที่คุณต้องการ ดูข้อมูลเพิ่มเติมเกี่ยวกับปลั๊กอิน DSL สำหรับ Android Gradle ได้ที่ เอกสารอ้างอิง DSL สคริปต์ Kotlin ยังต้องอาศัย ข้อมูลเบื้องหลัง Gradle Kotlin DSL
เมื่อเริ่มโปรเจ็กต์ใหม่ Android Studio จะสร้าง ไฟล์เหล่านี้ให้คุณ และป้อนข้อมูลโดยอิงตามค่าเริ่มต้นที่เหมาะสม โปรเจ็กต์ โครงสร้างไฟล์จะมีรูปแบบดังต่อไปนี้
└── MyApp/ # Project ├── gradle/ │ └── wrapper/ │ └── gradle-wrapper.properties ├── build.gradle(.kts) ├── settings.gradle(.kts) └── app/ # Module │ ├── build.gradle(.kts) │ ├── build/ │ ├── libs/ │ └── src/ │ └── main/ # Source set │ ├── java/ │ │ └── com.example.myapp │ ├── res/ │ │ ├── drawable/ │ │ ├── values/ │ │ └── ... │ └── AndroidManifest.xml
มีไฟล์การกำหนดค่าบิลด์ของ Gradle จำนวนหนึ่งที่เป็นส่วนหนึ่งของ โครงสร้างโปรเจ็กต์มาตรฐานสำหรับแอป Android ก่อนจะเริ่ม ในการกำหนดค่าบิลด์ คุณต้องเข้าใจขอบเขตและวัตถุประสงค์ ของแต่ละไฟล์เหล่านี้และองค์ประกอบ DSL พื้นฐานที่ไฟล์เหล่านั้นกำหนด
ไฟล์ 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. The code below * defines 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. The code below * defines 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.6.0" apply false id("com.android.library") version "8.6.0" apply false id("org.jetbrains.kotlin.android") version "1.9.23" 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 '8.6.0' apply false id 'com.android.library' version '8.6.0' apply false id 'org.jetbrains.kotlin.android' version '1.9.23' apply false }
ไฟล์บิลด์ระดับโมดูล
build.gradle.kts
ระดับโมดูล (สำหรับ Kotlin DSL) หรือ
build.gradle
(สำหรับ Groovy DSL) จะอยู่ในแต่ละ
ไดเรกทอรี project/module/
ซึ่งช่วยให้คุณ
กำหนดการตั้งค่าบิลด์สำหรับโมดูลที่โมดูลดังกล่าววางอยู่ กำลังกำหนดค่า
การตั้งค่าการสร้างเหล่านี้ช่วยให้คุณระบุตัวเลือกแพ็กเกจที่กำหนดเองได้ เช่น
ประเภทบิลด์และเวอร์ชันผลิตภัณฑ์เพิ่มเติม และลบล้างการตั้งค่าใน
ไฟล์ Manifest ของแอป main/
รายการหรือสคริปต์บิลด์ระดับบนสุด
การตั้งค่า Android SDK
ไฟล์บิลด์ระดับโมดูลสำหรับแอปพลิเคชันของคุณมีการตั้งค่าที่ระบุ เวอร์ชัน Android SDK ที่ใช้เมื่อคอมไพล์ เลือกลักษณะการทำงานของแพลตฟอร์ม และ โดยระบุเวอร์ชันขั้นต่ำที่แอปพลิเคชันใช้
-
compileSdk
-
compileSdk
จะกำหนดว่า Android และ Java API ใด ที่ใช้ได้เมื่อคอมไพล์ซอร์สโค้ด วิธีใช้ Android เวอร์ชันล่าสุด ให้ใช้ Android SDK รุ่นล่าสุดเมื่อทำการคอมไพล์API แพลตฟอร์ม Android บางรายการอาจไม่พร้อมใช้งาน ในระดับ API รุ่นเก่า คุณสามารถ ป้องกันการใช้ฟีเจอร์ใหม่อย่างมีเงื่อนไข หรือ ไลบรารีความเข้ากันได้ของ AndroidX เพื่อใช้ฟีเจอร์ใหม่ๆ กับเวอร์ชันที่ต่ำกว่า ระดับ API ของ Android
Android SDK แต่ละรายการมี Java API ชุดย่อยสำหรับใช้ในแอปพลิเคชันของคุณ โต๊ะที่ ฉันใช้ Java API ใดได้บ้างในซอร์สโค้ด Java หรือ Kotlin จะแสดงระดับ API ของ Java ที่พร้อมใช้งานตามเวอร์ชันของ Android SDK Java API รุ่นใหม่กว่าได้รับการสนับสนุนใน Android เวอร์ชันก่อนหน้าผ่าน กระบวนการ Desugaring ซึ่งต้อง เปิดใช้ในบิลด์ของคุณ
Android Studio จะแสดงคำเตือนหากมีความขัดแย้งของ
compileSdk
ด้วย Android Studio, AGP เวอร์ชันล่าสุด หรือไลบรารีของโปรเจ็กต์ ข้อกำหนดการขึ้นต่อกัน -
minSdk
-
minSdk
จะระบุ Android เวอร์ชันต่ำสุดที่คุณใช้ ที่ต้องการให้แอปของคุณรองรับ การตั้งค่าminSdk
จะจำกัด ที่อุปกรณ์ต่างๆ สามารถติดตั้งแอปของคุณได้การรองรับ Android เวอร์ชันต่ำกว่าอาจต้องมีการตรวจสอบแบบมีเงื่อนไขมากขึ้น ในโค้ดของคุณ หรือใช้ไลบรารีความเข้ากันได้ของ AndroidX มากขึ้น คุณควร คุณสามารถชั่งน้ำหนักค่าใช้จ่ายในการบำรุงรักษาเพื่อสนับสนุนเวอร์ชันที่ต่ำกว่า เปอร์เซ็นต์ของผู้ใช้ที่ยังใช้เวอร์ชันที่ต่ำกว่า โปรดดู แผนภูมิเวอร์ชันในวิซาร์ดโปรเจ็กต์ใหม่ของ Android Studio สำหรับเปอร์เซ็นต์การใช้เวอร์ชันปัจจุบัน
เมื่อแก้ไขโค้ดใน Android Studio หรือทำการตรวจสอบระหว่าง บิลด์ของคุณ lint จะเตือนเกี่ยวกับ API ที่คุณใช้ซึ่งไม่พร้อมใช้งาน ใน
minSdk
คุณควรแก้ไขปัญหาเหล่านี้โดย ทำให้ฟีเจอร์ใหม่มีเงื่อนไขหรือโดยการใช้Appcompat
สำหรับความเข้ากันได้แบบย้อนหลัง -
targetSdk
-
targetSdk
มีวัตถุประสงค์ 2 ประการ ได้แก่- โดยจะตั้งค่าลักษณะรันไทม์ของแอปพลิเคชัน
- ซึ่งจะยืนยันเวอร์ชัน Android ที่คุณใช้ทดสอบ
หากเรียกใช้บนอุปกรณ์ที่ใช้ Android เวอร์ชันที่สูงกว่า
targetSdk
, Android จะเรียกใช้แอปของคุณในโหมดความเข้ากันได้ ที่ทำงานคล้ายกับเวอร์ชันต่ำกว่าที่ระบุไว้ในtargetSdk
เช่น เมื่อ API 23 เปิดตัวรันไทม์ ไม่ใช่ว่าแอปทั้งหมดพร้อมที่จะใช้งานโมเดลนี้โดยทันที เมื่อตั้งค่าtargetSdk
เป็น 22 แอปเหล่านั้นจะทำงานได้ใน อุปกรณ์ API 23 ที่ไม่มีสิทธิ์ใช้สิทธิ์รันไทม์และอาจใช้ฟีเจอร์ได้ ซึ่งรวมอยู่ในcompileSdk
เวอร์ชันล่าสุด Google Play นโยบายการจัดจำหน่ายบังคับใช้ นโยบายเพิ่มเติมเกี่ยวกับระดับ API เป้าหมายค่าของ
targetSdk
ต้องน้อยกว่าหรือเท่ากับ ของcompileSdk
หมายเหตุ: ค่าของ compileSdk
และ targetSdk
ไม่จำเป็นต้องเหมือนกัน โปรดคำนึงถึงหลักการพื้นฐานต่อไปนี้
compileSdk
ให้สิทธิ์คุณเข้าถึง API ใหม่targetSdk
กำหนดลักษณะรันไทม์ของแอปtargetSdk
ต้องน้อยกว่าหรือเท่ากับcompileSdk
ตัวอย่างสคริปต์บิลด์ของโมดูลแอป
ตัวอย่างสคริปต์บิลด์ของโมดูลแอป Android นี้สรุปบางส่วน ขององค์ประกอบ DSL พื้นฐานและการตั้งค่า ดังนี้
Kotlin
/** * The first section in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id("com.android.application") } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain(11) } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace = "com.example.myapp" /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk = 33 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId = "com.example.myapp" // Defines the minimum API level required to run the app. minSdk = 21 // Specifies the API level used to test the app. targetSdk = 33 // Defines the version number of your app. versionCode = 1 // Defines a user-friendly version name for your app. versionName = "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ getByName("release") { isMinifyEnabled = true // Enables code shrinking for the release build type. proguardFiles( getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" ) } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store, or an Android device, simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions += "tier" productFlavors { create("free") { dimension = "tier" applicationId = "com.example.myapp.free" } create("paid") { dimension = "tier" applicationId = "com.example.myapp.paid" } } /** * To override source and target compatibility (if different from the * toolchain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = "11" //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation(project(":lib")) implementation("androidx.appcompat:appcompat:1.7.0") implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) }
ดึงดูด
/** * The first line in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id 'com.android.application' } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain 11 } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace 'com.example.myapp' /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk 33 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdk 21 // Specifies the API level used to test the app. targetSdk 33 // Defines the version number of your app. versionCode 1 // Defines a user-friendly version name for your app. versionName "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ release { minifyEnabled true // Enables code shrinking for the release build type. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store, or an Android device, simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions "tier" productFlavors { free { dimension "tier" applicationId 'com.example.myapp.free' } paid { dimension "tier" applicationId 'com.example.myapp.paid' } } /** * To override source and target compatibility (if different from the * tool chain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility JavaVersion.VERSION_11 // targetCompatibility JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = '11' //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation project(":lib") implementation 'androidx.appcompat:appcompat:1.7.0' implementation fileTree(dir: 'libs', include: ['*.jar']) }
ไฟล์คุณสมบัติ Gradle
Gradle มีไฟล์พร็อพเพอร์ตี้ 2 ไฟล์ที่อยู่ในโปรเจ็กต์รูทของคุณ ซึ่งคุณสามารถใช้เพื่อระบุการตั้งค่าสำหรับชุดเครื่องมือบิลด์ของ Gradle ดังนี้
-
gradle.properties
- ซึ่งเป็นที่ที่คุณกำหนดการตั้งค่า Gradle แบบทั่วทั้งโปรเจ็กต์ เช่น ขนาดสูงสุดของฮีปของ Gradle เดมอน ดูข้อมูลเพิ่มเติมได้ที่สภาพแวดล้อมของบิลด์
-
local.properties
-
กำหนดค่าพร็อพเพอร์ตี้ของสภาพแวดล้อมในเครื่องสำหรับระบบบิลด์ ซึ่งรวมถึง
ดังต่อไปนี้:
ndk.dir
- เส้นทางไปยัง NDK พร็อพเพอร์ตี้นี้ถูก เลิกใช้งานแล้ว NDK เวอร์ชันใดก็ตามที่ดาวน์โหลดจะได้รับการติดตั้งในndk
ภายในไดเรกทอรี Android SDKsdk.dir
- เส้นทางไปยัง Android SDKcmake.dir
- Path to CMakendk.symlinkdir
- ใน Android Studio 3.5 ขึ้นไป สร้างลิงก์สัญลักษณ์ไปยัง NDK ที่สั้นกว่าการติดตั้ง เส้นทาง NDK
แมป NDK กับเส้นทางที่สั้นลง (Windows เท่านั้น)
ใน Windows เครื่องมือในโฟลเดอร์ NDK ที่ติดตั้งไว้ เช่น ld.exe
จะมี
เส้นทางที่ยาวเหยียด เครื่องมือไม่รองรับเส้นทางยาวๆ
หากต้องการสร้างเส้นทางที่สั้นลง ให้ตั้งค่าพร็อพเพอร์ตี้ใน local.properties
ndk.symlinkdir
เพื่อขอให้ปลั๊กอิน Android Gradle สร้างลิงก์สัญลักษณ์ไปยัง
NDK เส้นทางของลิงก์สัญลักษณ์อาจสั้นกว่าโฟลเดอร์ NDK ที่มีอยู่
ตัวอย่างเช่น ndk.symlinkdir = C:\
จะให้ผลลัพธ์ในลิงก์สัญลักษณ์ต่อไปนี้
วันที่ C:\ndk\19.0.5232133
ซิงค์โปรเจ็กต์กับไฟล์ Gradle
เมื่อคุณเปลี่ยนแปลงไฟล์การกำหนดค่าบิลด์ในโปรเจ็กต์ Android Studio ต้องการให้คุณซิงค์ไฟล์โครงการของคุณเพื่อให้สามารถ นำเข้าการเปลี่ยนแปลงการกำหนดค่าบิลด์ และเรียกใช้การตรวจสอบบางอย่างเพื่อให้แน่ใจว่า ไม่สร้างข้อผิดพลาดของรุ่น
หากต้องการซิงค์ไฟล์โครงการ ให้คลิกซิงค์เลยใน
แถบการแจ้งเตือนที่ปรากฏขึ้นเมื่อคุณทำการเปลี่ยนแปลง ตามที่แสดงใน
รูปที่ 1 หรือคลิกซิงค์โปรเจ็กต์
จากแถบเมนู หาก Android Studio พบข้อผิดพลาดในไฟล์
เช่น ซอร์สโค้ดของคุณใช้ฟีเจอร์ API ที่
พร้อมใช้งานในระดับ API ที่สูงกว่า compileSdkVersion
ของคุณ
— หน้าต่างข้อความจะอธิบายปัญหา
ชุดแหล่งที่มา
Android Studio จัดกลุ่มซอร์สโค้ดและทรัพยากรสำหรับแต่ละโมดูลอย่างมีตรรกะ
ลงในชุดแหล่งที่มา เมื่อคุณสร้างโมดูลใหม่ Android Studio
สร้างชุดแหล่งที่มา main/
ภายในโมดูล สำหรับโมดูล
ชุดแหล่งที่มา main/
ชุดมีโค้ดและทรัพยากรทั้งหมด
ตัวแปรของบิลด์
ไดเรกทอรีชุดแหล่งที่มาเพิ่มเติมเป็นตัวเลือกที่ไม่บังคับ และ Android
Studio จะไม่สร้างไฟล์เหล่านี้ให้คุณโดยอัตโนมัติเมื่อคุณกำหนดค่าบิลด์ใหม่
รายละเอียดปลีกย่อย อย่างไรก็ตาม การสร้างชุดแหล่งที่มาที่คล้ายกับ main/
จะช่วยให้
จัดระเบียบไฟล์และทรัพยากรที่ Gradle ต้องใช้เมื่อสร้าง
เวอร์ชันแอปของคุณ:
-
src/main/
- ชุดแหล่งที่มานี้มีโค้ดและทรัพยากรที่ใช้บ่อยในตัวแปรของบิลด์ทั้งหมด
-
src/buildType/
- สร้างชุดแหล่งที่มานี้เพื่อรวมโค้ดและทรัพยากร ประเภทบิลด์
-
src/productFlavor/
-
สร้างชุดแหล่งที่มานี้เพื่อรวมโค้ดและทรัพยากร
รสชาติของผลิตภัณฑ์
หมายเหตุ: หากคุณกำหนดค่าบิลด์เพื่อรวมหลายบิลด์ เวอร์ชันผลิตภัณฑ์ คุณจะสร้างไดเรกทอรีชุดแหล่งที่มาสำหรับแต่ละผลิตภัณฑ์ได้ ชุดค่าผสมของรสชาติผลิตภัณฑ์ระหว่างขนาดรสชาติ:
src/productFlavor1ProductFlavor2/
-
src/productFlavorBuildType/
- สร้างชุดแหล่งที่มานี้เพื่อรวมโค้ดและทรัพยากร ตัวแปรของบิลด์
ตัวอย่างเช่น หากต้องการสร้าง "fullDebug" เวอร์ชันแอปของคุณ ระบบบิลด์จะรวมโค้ด การตั้งค่า และทรัพยากรจากชุดแหล่งที่มาต่อไปนี้
-
src/fullDebug/
(ชุดแหล่งที่มาของตัวแปรบิลด์) -
src/debug/
(ชุดแหล่งที่มาของประเภทบิลด์) -
src/full/
(ชุดแหล่งที่มาของรสชาติของผลิตภัณฑ์) -
src/main/
(ชุดแหล่งที่มาหลัก)
หมายเหตุ: เมื่อคุณสร้างไฟล์หรือไดเรกทอรีใหม่ใน Android Studio ให้ใช้ไฟล์ > ตัวเลือกเมนูใหม่ในการสร้าง สำหรับชุดแหล่งที่มาที่เจาะจง ชุดแหล่งที่มาที่คุณสามารถเลือกได้จะอิงตาม ในการกำหนดค่าบิลด์ และ Android Studio จะสร้าง ไดเรกทอรีที่จำเป็น หากยังไม่มี
หากชุดแหล่งที่มาที่แตกต่างกันมีเวอร์ชันที่แตกต่างกันของไฟล์เดียวกัน Gradle ใช้ลำดับความสำคัญต่อไปนี้เมื่อตัดสินใจเลือกไฟล์ที่จะใช้ แหล่งที่มา ชุดทางด้านซ้ายจะลบล้างไฟล์และการตั้งค่าของชุดแหล่งที่มา ขวา:
ตัวแปรบิลด์ > ประเภทบิลด์ > รสชาติของผลิตภัณฑ์ > ชุดแหล่งที่มาหลัก > ทรัพยากร Dependency ของไลบรารี
การดำเนินการนี้ช่วยให้ Gradle ใช้ไฟล์ที่เฉพาะเจาะจงสำหรับตัวแปรของบิลด์ที่คุณ กำลังพยายามสร้างโดยใช้กิจกรรม ตรรกะของแอปพลิเคชัน และ ทรัพยากรที่พบได้ทั่วไปในแอปเวอร์ชันอื่นๆ ของคุณ
เมื่อรวมหลายรายการ ไฟล์ Manifest, Gradle ใช้ลําดับความสําคัญเดียวกัน เพื่อให้ตัวแปรของบิลด์แต่ละรายการสามารถ กำหนดคอมโพเนนต์หรือสิทธิ์ต่างๆ ในไฟล์ Manifest สุดท้าย เพื่อเรียนรู้ ข้อมูลเพิ่มเติมเกี่ยวกับการสร้างชุดแหล่งที่มาที่กำหนดเอง โปรดอ่านสร้างชุดแหล่งที่มา
แคตตาล็อกเวอร์ชัน
หากบิลด์ของคุณมีหลายโมดูลที่มีทรัพยากร Dependency ทั่วไป หรือคุณ มีโปรเจ็กต์อิสระหลายโปรเจ็กต์ที่มีทรัพยากร Dependency เหมือนกัน เราขอแนะนำ คุณใช้ แคตตาล็อกเวอร์ชันหรือใบเรียกเก็บเงินค่าวัสดุ (BOM) เพื่อ ระบุเวอร์ชันทั่วไป
ระบบบิลด์อื่นๆ
การสร้างแอป Android ด้วย Bazel คือ แต่ไม่มีการสนับสนุนอย่างเป็นทางการ Android Studio ไม่ สนับสนุนโปรเจ็กต์ Bazel
เพื่อทำความเข้าใจข้อจำกัดในปัจจุบันในการสร้างด้วย Bazel ให้ดียิ่งขึ้นที่ ปัญหาที่ทราบแล้ว