Định cấu hình bản dựng

Hệ thống xây dựng Android biên soạn tài nguyên và mã nguồn của ứng dụng rồi đóng gói chúng vào tệp APK hoặc Android App Bundle mà bạn có thể kiểm thử, triển khai, ký và phân phối.

Trong bài viết Tổng quan về bản dựng GradleCấu trúc bản dựng Android, chúng ta đã thảo luận về các khái niệm bản dựng và cấu trúc của một ứng dụng Android. Giờ là lúc định cấu hình bản dựng.

Bảng thuật ngữ về bản dựng Android

Gradle và trình bổ trợ Android giúp bạn định cấu hình những phần dưới đây của bản dựng:

Loại bản dựng

Các loại bản dựng xác định một số thuộc tính mà Gradle sử dụng khi xây dựng và đóng gói ứng dụng. Những loại bản dựng này thường được định cấu hình cho từng giai đoạn trong vòng đời phát triển của ứng dụng.

Ví dụ: bản dựng gỡ lỗi kích hoạt các chế độ gỡ lỗi và ký ứng dụng bằng khoá gỡ lỗi trong khi bản dựng phát hành có thể rút gọn, làm rối mã nguồn và ký ứng dụng bằng khoá phát hành để phân phối.

Bạn cần phải xác định ít nhất một loại bản dựng để xây dựng ứng dụng. Theo mặc định, Android Studio sẽ tạo các loại bản dựng gỡ lỗi và phát hành. Để bắt đầu tuỳ chỉnh các chế độ đóng gói cho ứng dụng, hãy tìm hiểu cách định cấu hình loại bản dựng.

Phiên bản sản phẩm
Phiên bản sản phẩm biểu thị những phiên bản của ứng dụng mà bạn có thể phát hành cho người dùng, chẳng hạn như phiên bản miễn phí và phiên bản có tính phí. Bạn có thể tuỳ chỉnh từng phiên bản sản phẩm để vừa sử dụng mã và tài nguyên riêng, vừa chia sẻ và sử dụng lại các phần được dùng trên mọi phiên bản của ứng dụng. Việc xây dựng phiên bản sản phẩm là không bắt buộc và bạn cần phải tự mình tạo những phiên bản như vậy. Để bắt đầu tạo các phiên bản ứng dụng, hãy tìm hiểu cách định cấu hình phiên bản sản phẩm.
Biến thể bản dựng
Biến thể bản dựng là một sản phẩm vừa là bản dựng vừa là phiên bản sản phẩm, đồng thời là cấu hình mà Gradle sử dụng để xây dựng ứng dụng. Bằng cách sử dụng biến thể bản dựng, bạn có thể xây dựng phiên bản gỡ lỗi cho phiên bản sản phẩm trong quá trình phát triển cũng như phiên bản phát hành đã ký của phiên bản sản phẩm cho việc phân phối. Tuy không trực tiếp định cấu hình biến thể bản dựng, bạn vẫn có thể định cấu hình các loại bản dựng và phiên bản sản phẩm cấu thành nên những biến thể bản dựng đó. Việc tạo thêm các loại bản dựng hoặc phiên bản sản phẩm cũng tạo ra những biến thể bản dựng bổ sung. Để tìm hiểu cách tạo và quản lý các biến thể bản dựng, hãy tham khảo phần tổng quan về Định cấu hình các biến thể bản dựng.
Các mục trong tệp kê khai
Bạn có thể chỉ định giá trị cho một số thuộc tính của tệp kê khai trong cấu hình biến thể bản dựng. Các giá trị xây dựng này sẽ ghi đè các giá trị hiện có trong tệp kê khai. Việc này rất hữu ích nếu bạn muốn tạo nhiều biến thể của ứng dụng bằng tên ứng dụng, phiên bản SDK tối thiểu hoặc phiên bản SDK mục tiêu riêng. Khi có nhiều tệp kê khai, công cụ sáp nhập tệp kê khai sẽ sáp nhập các chế độ cài đặt tệp kê khai.
Phần phụ thuộc
Hệ thống xây dựng quản lý các phần phụ thuộc của dự án qua hệ thống tệp cục bộ và kho lưu trữ từ xa. Nhờ đó, bạn không cần phải tìm kiếm, tải và sao chép thủ công những gói tệp nhị phân của các phần phụ thuộc vào thư mục dự án. Để tìm hiểu thêm, hãy tham khảo phần Thêm phần phụ thuộc của bản dựng.
Hệ thống xây dựng cho phép bạn chỉ định các chế độ ký trong cấu hình bản dựng. Đồng thời, hệ thống này cũng có thể tự động ký ứng dụng trong quy trình xây dựng. Hệ thống xây dựng ký phiên bản gỡ lỗi bằng một khoá và chứng chỉ mặc định, sử dụng thông tin đăng nhập đã biết để tránh hiện lời nhắc nhập mật khẩu tại thời điểm xây dựng. Hệ thống xây dựng không ký phiên bản phát hành trừ phi bạn xác định rõ cấu hình ký cho bản dựng đó. Nếu không có khoá phát hành, bạn có thể tạo một khoá như mô tả trong phần Ký ứng dụng. Ứng dụng bắt buộc phải có bản dựng bản phát hành đã ký để được phân phối qua hầu hết các cửa hàng ứng dụng.
Rút gọn mã và tài nguyên
Hệ thống xây dựng cho phép bạn chỉ định cho mỗi biến thể xây dựng một tệp quy tắc ProGuard riêng. Khi bạn xây dựng ứng dụng, hệ thống xây dựng sẽ áp dụng một bộ quy tắc phù hợp để rút gọn mã và tài nguyên bằng các công cụ rút gọn tích hợp sẵn, chẳng hạn như R8. Việc thu hẹp mã và tài nguyên có thể giúp giảm kích thước tệp APK hoặc AAB.
Hỗ trợ nhiều tệp APK
Hệ thống xây dựng cho phép bạn tự động xây dựng nhiều tệp APK, trong đó mỗi tệp APK chỉ chứa mã và tài nguyên cần thiết cho một mật độ màn hình hoặc Giao diện nhị phân của ứng dụng (ABI) cụ thể. Để biết thêm thông tin, hãy xem nội dung Tạo nhiều tệp APK. Tuy nhiên, việc phát hành một tệp AAB duy nhất là phương pháp được đề xuất sử dụng vì phương pháp này cung cấp chức năng phân tách theo ngôn ngữ cũng như mật độ màn hình và ABI, đồng thời tránh việc phải tải nhiều cấu phần phần mềm lên Google Play. Toàn bộ ứng dụng mới được gửi sau tháng 8 năm 2021 đều bắt buộc phải sử dụng tệp AAB.

Phiên bản Java trong các bản dựng Android

Cho dù mã nguồn của bạn được viết bằng Java, Kotlin hay cả hai, bạn vẫn phải chọn một phiên bản ngôn ngữ JDK hoặc Java cho bản dựng. Hãy xem phần Phiên bản Java trong các bản dựng Android để biết thông tin chi tiết.

Tệp cấu hình bản dựng

Việc tạo cấu hình bản dựng tuỳ chỉnh đòi hỏi bạn phải thay đổi ít nhất một tệp cấu hình bản dựng. Các tệp văn bản thuần tuý này sử dụng ngôn ngữ dành riêng cho miền (DSL) để mô tả và điều khiển logic bản dựng bằng tập lệnh Kotlin (một phiên bản của ngôn ngữ Kotlin). Bạn cũng có thể sử dụng Groovy (một ngôn ngữ động của Máy ảo Java (JVM)) để định cấu hình bản dựng.

Bạn không cần phải biết tập lệnh Kotlin hoặc Groovy để bắt đầu định cấu hình bản dựng vì trình bổ trợ Android cho Gradle sẽ giới thiệu hầu hết các phần tử DSL mà bạn cần. Để tìm hiểu thêm về DSL của trình bổ trợ Android cho Gradle, hãy đọc tài liệu tham khảo về DSL. Tập lệnh Kotlin cũng dựa trên Gradle Kotlin DSL cơ bản

Khi bắt đầu một dự án mới, Android Studio sẽ tự động tạo một số tệp trong số này cho bạn và điền sẵn dữ liệu vào những tệp đó dựa trên những giá trị mặc định thích hợp. Để biết thông tin tổng quan về các tệp đã tạo, hãy xem bài viết Cấu trúc bản dựng Android.

Tệp Trình bao bọc Gradle

Trình bao bọc Gradle (gradlew) là một ứng dụng nhỏ đi kèm với mã nguồn của bạn, giúp tải xuống và tự khởi chạy Gradle. Điều này giúp quá trình thực thi bản dựng nhất quán hơn. Nhà phát triển tải nguồn ứng dụng xuống và chạy gradlew. Thao tác này sẽ tải xuống bản phân phối Gradle cần thiết và khởi chạy Gradle để tạo ứng dụng.

Tệp gradle/wrapper/gradle-wrapper.properties chứa một thuộc tính, distributionUrl, mô tả phiên bản Gradle được dùng để chạy bản dựng của bạn.

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

Tệp cài đặt Gradle

Tệp settings.gradle.kts (đối với Kotlin DSL) hoặc tệp settings.gradle (đối với Groovy DSL) nằm trong thư mục gốc của dự án. Tệp cài đặt này xác định chế độ cài đặt kho lưu trữ cấp dự án và thông báo cho Gradle những mô-đun cần đưa vào khi xây dựng ứng dụng. Các dự án nhiều mô-đun cần chỉ định từng mô-đun sẽ được đưa vào bản dựng cuối cùng.

Đối với hầu hết dự án, theo mặc định, tệp này sẽ có dạng như sau:

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'

Tệp bản dựng cấp cao nhất

Tệp build.gradle.kts cấp cao nhất (đối với DSL Kotlin) hoặc tệp build.gradle (đối với DSL Groovy) nằm trong thư mục gốc của dự án. Tệp này thường xác định các phiên bản trình bổ trợ phổ biến mà các mô-đun sử dụng trong dự án của bạn.

Mã mẫu sau đây mô tả các chế độ cài đặt mặc định và phần tử DSL trong tập lệnh bản dựng cấp cao nhất sau khi tạo dự án mới:

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
}