Gradle: bản chất của hệ thống build cho Android và build.gradle

Tác giả: IT Sectr Đã đăng: 2026-02-12 Thời gian đọc: 9 phút

Gradle là một hệ thống build tự động hóa việc biên dịch, kiểm thử và đóng gói các ứng dụng Android. Không giống như Apache Ant hay Maven, nó hỗ trợ build gia tăng và lưu trữ kết quả. Tìm hiểu thêm về các tính năng tại tài liệu chính thức của Gradle. Từ năm 2013, công cụ này được sử dụng làm hệ thống build tiêu chuẩn cho các dự án Android trong Android Studio.

Những điểm chính

  • Gradle — hệ thống build tiêu chuẩn cho Android từ 2013, thay thế Ant và Maven
  • Build.gradle.kts với Kotlin DSL — tiêu chuẩn cấu hình hiện đại với kiểm tra kiểu
  • Build variants kết hợp loại build và hương vị sản phẩm cho các phiên bản ứng dụng khác nhau
  • Plugin mở rộng chức năng: từ áp dụng công cụ Android đến xuất bản bản build
  • Build gia tăng và lưu trữ đệm giảm thời gian biên dịch lại nhiều lần

Gradle là gì?

Gradle là một công cụ tự động hóa build mã nguồn mở được viết bằng Java, chạy trên JVM. Nó nhận đầu vào là mã nguồn, phụ thuộc và tài nguyên, và tạo ra đầu ra là một ứng dụng hoàn chỉnh — APK hoặc AAB cho Android. Về cốt lõi, Gradle sử dụng khái niệm Đồ thị có hướng không chu trình (DAG) của các tác vụ, trong đó mỗi tác vụ là một đơn vị công việc nguyên tử và các kết nối giữa chúng xác định thứ tự thực thi. Không giống như Make hay Ant, Gradle không yêu cầu mô tả thủ công một chuỗi các bước: chỉ cần khai báo phụ thuộc giữa các tác vụ và hệ thống sẽ tự động xác định thứ tự tối ưu. Cách tiếp cận này làm cho Gradle linh hoạt và có khả năng mở rộng cho các dự án ở mọi quy mô.

Hệ thống sử dụng ba giai đoạn thực thi: khởi tạo (xác định các dự án tham gia), cấu hình (xây dựng đồ thị tác vụ) và thực thi (chạy các tác vụ theo thứ tự yêu cầu). Giai đoạn cấu hình là điểm khác biệt chính của Gradle: toàn bộ script build được thực thi trước khi các tác vụ bắt đầu, cho phép thay đổi động đồ thị dựa trên điều kiện. Điều này cho phép, ví dụ, thêm tác vụ chỉ cho các biến thể build cụ thể mà không sao chép mã. Trình build được viết bằng Groovy, nhưng tệp cấu hình hỗ trợ hai ngôn ngữ: Groovy DSL và Kotlin DSL.

Gradle quản lý build dự án Android như thế nào?

Plugin Android cho Gradle bao gồm com.android.application và com.android.library, thêm các tác vụ vào dự án để làm việc với các công cụ Android. Khi nhà phát triển bắt đầu build, Gradle thực thi tuần tự hàng chục tác vụ: biên dịch Kotlin và Java qua javac hoặc kotlinc, xử lý tài nguyên qua AAPT2, tạo R.java, biên dịch bytecode thành DEX qua D8 hoặc R8, ký và nén APK. Mỗi tác vụ kiểm tra xem dữ liệu đầu vào của nó có thay đổi không, và nếu không, sử dụng kết quả đã lưu trong bộ nhớ đệm. Cơ chế này được gọi là build gia tăng và tăng tốc biên dịch lại 60–80% so với xây dựng lại hoàn toàn.

Cấu hình mô-đun Android được đặt trong khối android của tệp build.gradle.kts. Bên trong khối, compileSdk, minSdk, targetSdk, phiên bản ứng dụng, chữ ký và các tham số khác được xác định. Gradle tự động tạo nhiều biến thể build cho mỗi mô-đun — sự kết hợp của loại (release, debug) và hương vị. Ví dụ, cho một mô-đun có hai hương vị và hai loại, Gradle tạo ra bốn tác vụ: assembleDemoDebug, assembleDemoRelease, assembleFullDebug, assembleFullRelease. Tất cả các tác vụ này có thể được thực thi riêng lẻ hoặc chạy bằng một lệnh duy nhất cho tất cả các biến thể cùng một lúc.

Build.gradle và build.gradle.kts: cấu trúc cấu hình

Mỗi dự án Android chứa hai cấp độ cấu hình: build.gradle.kts gốc (cài đặt cho tất cả các mô-đun) và build.gradle.kts cấp mô-đun (cài đặt cho một mô-đun cụ thể). Trong tệp gốc, các plugin được khai báo mà không áp dụng, kho lưu trữ và biến chung. Trong tệp mô-đun, các plugin được áp dụng cho mô-đun cụ thể và các tham số build được cấu hình. Cách tiếp cận này cho phép quản lý tập trung các phiên bản phụ thuộc thông qua danh mục phiên bản hoặc khối ext.

Kotlin
@Suppress("UnstableApiUsage")
plugins {
    id("com.android.application") version "8.2.2"
    id("org.jetbrains.kotlin.android") version "1.9.22"
}

android {
    namespace = "com.example.myapp"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
    }
}

Khối dependencies là một yếu tố quan trọng khác của build.gradle.kts. Nó liệt kê các thư viện, mô-đun và phụ thuộc tệp mà ứng dụng cần. Gradle hỗ trợ một số cấu hình phụ thuộc: implementation (chỉ khả dụng cho mô-đun hiện tại), api (cũng khả dụng cho các mô-đun phụ thuộc), testImplementation (chỉ cho kiểm thử), androidTestImplementation (cho kiểm thử thiết bị) và compileOnly (chỉ ở thời điểm biên dịch). Mỗi cấu hình quản lý khả năng hiển thị của lớp trong đồ thị phụ thuộc, ảnh hưởng đến thời gian build và kích thước tạo phẩm cuối cùng.

Kotlin
dependencies {
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
    implementation("androidx.activity:activity-compose:1.8.2")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
}

Build variants: tùy chọn build ứng dụng

Build variant là sự kết hợp của loại build và hương vị sản phẩm xác định một phiên bản ứng dụng với cài đặt, mã và tài nguyên duy nhất. Loại build xác định các tham số đóng gói: debug (có gỡ lỗi và hậu tố .debug) hoặc release (có làm rối và ký). Hương vị sản phẩm xác định các biến thể chức năng: ví dụ, demo (phiên bản giới hạn) và full (phiên bản đầy đủ với các tính năng bổ sung). Gradle tự động tạo các tác vụ cho mỗi tổ hợp, cho phép xây dựng tất cả các phiên bản bằng một lệnh duy nhất.

Kotlin
android {
    buildTypes {
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
        debug {
            applicationIdSuffix = ".debug"
        }
    }
    flavorDimensions += "version"
    productFlavors {
        create("demo") {
            dimension = "version"
            applicationIdSuffix = ".demo"
        }
        create("full") {
            dimension = "version"
            applicationIdSuffix = ".full"
        }
    }
}

Mỗi build variant có một tập hợp nguồn riêng biệt. Gradle sử dụng các thư mục src/demo/release, src/full/debug và các thư mục khác, lưu trữ tài nguyên, tệp kê khai và tệp nguồn duy nhất cho một biến thể cụ thể. Mã chung vẫn nằm trong src/main. Cách tiếp cận này cho phép tái sử dụng logic chính và chỉ thay thế các phần khác nhau: chuỗi, biểu tượng, điểm cuối API hoặc tệp cấu hình. Một tập hợp nguồn có thể ghi đè bất kỳ tài nguyên nào từ main: tệp kê khai, drawable, values hoặc thậm chí các lớp Kotlin. Khi xây dựng một biến thể cụ thể, Gradle hợp nhất các tệp từ main và tập hợp nguồn tương ứng, với các tệp từ biến thể được ưu tiên.

Plugin Gradle cho Android: mở rộng khả năng

Hệ sinh thái plugin Gradle bao phủ tất cả các giai đoạn phát triển ứng dụng Android. Các plugin chính thức từ Google bao gồm com.android.application (cho mô-đun ứng dụng), com.android.library (cho mô-đun thư viện), com.android.test (cho mô-đun kiểm thử) và plugin Kotlin từ JetBrains. Plugin thêm các tác vụ mới vào dự án, mở rộng DSL với các khối cấu hình mới và kết nối các công cụ bổ sung. Nếu không có plugin com.android.application, một dự án không thể xây dựng APK: plugin này đăng ký tất cả các tác vụ cụ thể của Android và liên kết chúng trong đồ thị build.

Các plugin bên thứ ba giải quyết các tác vụ cụ thể hơn. Google Services (com.google.gms.google-services) tích hợp Firebase và Google Play Services, tự động chèn google-services.json vào bản build. Hilt (dagger.hilt.android.plugin) tạo mã tiêm phụ thuộc tại thời điểm biên dịch. Safe Args (androidx.navigation.safeargs.kotlin) tạo các lớp an toàn về kiểu cho điều hướng giữa các fragment. Mỗi plugin được thêm vào build.gradle.kts gốc thông qua khối plugins và thường yêu cầu cấu hình tối thiểu. Gradle tự động giải quyết các phụ thuộc bắc cầu giữa các plugin và đảm bảo tương thích phiên bản thông qua các tệp Bom và danh mục phiên bản.

Tác vụ Gradle: tự động hóa quy trình build

Tác vụ (task) là một đơn vị công việc nguyên tử trong Gradle. Mỗi tác vụ có dữ liệu đầu vào, dữ liệu đầu ra và một hành động. Các tác vụ tích hợp cho Android bao gồm assemble (xây dựng tất cả các biến thể), lint (kiểm tra mã), test (chạy kiểm thử đơn vị) và clean (dọn dẹp tệp tạm thời). Nhà phát triển có thể thêm các tác vụ của riêng họ bằng Groovy hoặc Kotlin DSL. Các tác vụ tùy chỉnh hữu ích để tự động hóa các thao tác thường xuyên: tạo báo cáo, sao chép tạo phẩm, triển khai lên thiết bị kiểm thử hoặc tích hợp với hệ thống CI.

Kotlin
tasks.register("printBuildInfo") {
    description = "Hiển thị thông tin build"
    group = "custom"
    doLast {
        println("Build variant: ${project.name}")
        println("Version: ${android.defaultConfig.versionName}")
    }
}

Mỗi tác vụ có thể phụ thuộc vào các tác vụ khác thông qua cơ chế dependsOn. Nếu tác vụ A phụ thuộc vào tác vụ B, Gradle đảm bảo rằng B sẽ thực thi trước A. Hệ thống không yêu cầu chỉ định thủ công thứ tự cho từng cặp — chỉ cần khai báo phụ thuộc và Gradle sẽ xây dựng một đồ thị có hướng được tối ưu hóa cho thực thi song song các tác vụ độc lập. Các tác vụ tích hợp của plugin Android đã được liên kết với nhau: lint phụ thuộc vào biên dịch, test phụ thuộc vào assemble, assembleDebug phụ thuộc vào compileDebugKotlin. Nhà phát triển có thể chèn các tác vụ của riêng họ vào bất kỳ nút nào của đồ thị bằng cách sử dụng dependsOn, mustRunAfter hoặc shouldRunAfter.

Lỗi thường gặp khi làm việc với Gradle

Một trong những vấn đề thường gặp là xung đột phiên bản phụ thuộc, khi hai thư viện yêu cầu các phiên bản khác nhau của cùng một phụ thuộc bắc cầu. Gradle báo cáo lỗi xung đột, nhưng không phải lúc nào cũng đưa ra giải pháp tự động. Để chẩn đoán, hãy sử dụng lệnh ./gradlew :app:dependencies, lệnh này xuất ra cây phụ thuộc hoàn chỉnh. Bạn nên buộc phiên bản của thư viện xung đột thông qua khối resolutionStrategy. Một kịch bản phổ biến khác là build chậm do thiếu xử lý gia tăng. Đảm bảo rằng tất cả các plugin đã được cập nhật, Gradle Daemon được bật (org.gradle.daemon=true) và đủ bộ nhớ được đặt trong gradle.properties: org.gradle.jvmargs=-Xmx4096m.

Các vấn đề về bộ nhớ đệm phát sinh sau khi cập nhật phụ thuộc: Gradle có thể sử dụng bộ nhớ đệm cũ và build thất bại. Giải pháp là chạy build với cờ --refresh-dependencies hoặc xóa bộ nhớ đệm thủ công qua ./gradlew cleanBuildCache. Lỗi phổ biến thứ ba là không tương thích phiên bản giữa Android Gradle Plugin (AGP) và Gradle. Mỗi phiên bản AGP yêu cầu một phiên bản Gradle tối thiểu cụ thể. Bảng tương thích được công bố trên developer.android.com. Nếu các phiên bản không tương thích, Gradle thất bại ở giai đoạn cấu hình với thông báo về phiên bản tối thiểu được yêu cầu. Luôn kiểm tra rằng phiên bản Gradle wrapper phù hợp với yêu cầu của AGP.

Các câu hỏi thường gặp

Gradle là gì một cách đơn giản?

Gradle là một chương trình tự động hóa để xây dựng dự án. Nó lấy mã nguồn của bạn bằng Kotlin hoặc Java, kết nối các thư viện từ internet, biên dịch mọi thứ thành bytecode và đóng gói thành APK. Nó chạy trên JVM và sử dụng các script khai báo thay vì hướng dẫn thủ công. Nhà phát triển chỉ cần mô tả các quy tắc và Gradle làm phần còn lại.

build.gradle.kts khác build.gradle như thế nào?

Build.gradle được viết bằng Groovy — một ngôn ngữ động với cú pháp linh hoạt và ít nghiêm ngặt hơn. Build.gradle.kts sử dụng Kotlin DSL: kiểu mạnh, tự động hoàn thành trong Android Studio và kiểm tra lỗi tại thời điểm biên dịch. Google khuyến nghị Kotlin DSL cho tất cả các dự án mới. Tệp Groovy dễ di chuyển hơn, nhưng tệp Kotlin đáng tin cậy hơn trong bảo trì.

Làm thế nào để tăng tốc build Gradle?

Bật Gradle Daemon (org.gradle.daemon=true) và build song song (org.gradle.parallel=true). Tăng bộ nhớ JVM lên 4–8 GB qua org.gradle.jvmargs. Sử dụng cấu hình dự án theo yêu cầu (org.gradle.configureondemand=true). Đối với dự án Android, cấu hình bộ nhớ đệm tác vụ và chỉ build cho ABI cần thiết. Trong Android Studio, chạy Build Analyzer để tìm điểm nghẽn.

Build variant trong Android là gì?

Build variant là sự kết hợp của loại build (ví dụ: debug hoặc release) và hương vị sản phẩm (ví dụ: demo hoặc full). Mỗi biến thể có thể có tên gói, phiên bản, tài nguyên và tệp nguồn riêng. Gradle tự động tạo một tác vụ build riêng cho mỗi biến thể. Điều này cho phép xây dựng nhiều phiên bản của ứng dụng từ một dự án duy nhất.

Làm thế nào để thêm phụ thuộc trong Gradle?

Phụ thuộc được thêm trong khối dependencies của tệp build.gradle.kts. Định dạng là: configuration("group:artifact:version"). Ví dụ: implementation("androidx.core:core-ktx:1.12.0"). Cho kiểm thử sử dụng testImplementation, cho kiểm thử thiết bị — androidTestImplementation. Các phiên bản được tổ chức thuận tiện trong một danh mục phiên bản riêng thông qua tệp libs.versions.toml.

Tổng kết

  • Gradle — hệ thống build tiêu chuẩn cho Android, chạy trên JVM và sử dụng DAG tác vụ
  • Build gia tăng và bộ nhớ đệm giảm thời gian biên dịch lại 60–80%
  • Kotlin DSL (build.gradle.kts) — định dạng cấu hình hiện đại với tự động hoàn thành và kiểm tra kiểu
  • Build variants kết hợp loại build và hương vị sản phẩm, tạo tập hợp nguồn riêng cho mỗi biến thể
  • Plugin mở rộng Gradle: từ plugin Android cơ bản đến Firebase, Hilt và Safe Args
  • Tác vụ tùy chỉnh cho phép tự động hóa mọi giai đoạn build và tích hợp
  • Các vấn đề thường gặp — xung đột phiên bản, build chậm và không tương thích AGP với phiên bản Gradle

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm