Phần phụ thuộc của bản dựng là các thành phần bên ngoài cần thiết để tạo bản dựng thành công cho dự án của bạn. Một bản dựng có thể phụ thuộc vào thư viện, trình bổ trợ, dự án phụ, SDK Android, các công cụ như trình biên dịch Kotlin và Java, môi trường phát triển như Android Studio và chính Gradle.
Mỗi phần phụ thuộc có thể yêu cầu các phần phụ thuộc khác. Chúng tôi gọi đây là phần phụ thuộc bắc cầu và có thể nhanh chóng tăng tổng số phần phụ thuộc mà ứng dụng của bạn sử dụng. Khi bạn muốn nâng cấp một phần phụ thuộc (cho dù đó là thư viện, công cụ hay SDK Android), thì việc nâng cấp đó có thể kéo theo việc nâng cấp nhiều phần phụ thuộc khác.
Thông thường, việc này sẽ không gây ra vấn đề gì vì nhiều thư viện tuân theo một lược đồ được gọi là Phiên bản ngữ nghĩa. Các thư viện này hạn chế loại thay đổi mà chúng thực hiện để đảm bảo khả năng tương thích với các phiên bản thấp hơn.
Phiên bản ngữ nghĩa tuân theo định dạng major.minor.patch. Ví dụ: trong số phiên bản 4.8.3, 4 là phiên bản major, 8 là phiên bản minor và 3 là số patch. Khi phần major thay đổi, thư viện có thể có những thay đổi có thể gây lỗi trong API hoặc hành vi. Điều này có thể ảnh hưởng đến bản dựng hoặc hành vi của ứng dụng.
Khi các phần minor (tính năng mới) hoặc patch (bản sửa lỗi) thay đổi, nhà phát triển thư viện sẽ cho bạn biết rằng thư viện vẫn tương thích và không ảnh hưởng đến ứng dụng của bạn.
Mối quan hệ trong bản dựng của bạn
Bản dựng Android chứa mối quan hệ giữa:
- Mã nguồn – mã và tài nguyên mà bạn có quyền kiểm soát
- Phần phụ thuộc thư viện – các thư viện hoặc mô-đun bên ngoài mà dự án và dự án con của bạn bao gồm khi xây dựng
- Công cụ – trình biên dịch, trình bổ trợ và SDK giúp dịch nguồn của bạn thành một ứng dụng hoặc thư viện
Mã nguồn
Mã nguồn là mã Kotlin hoặc Java mà bạn viết trong ứng dụng hoặc thư viện của mình. (Để biết thông tin chi tiết về cách sử dụng C++, hãy xem Android NDK.)
Mã nguồn phụ thuộc vào các thư viện (bao gồm cả thư viện thời gian chạy Kotlin và Java) và SDK Android, đồng thời yêu cầu trình biên dịch Kotlin hoặc Java tương ứng.
Một số mã nguồn có chứa chú thích cần xử lý thêm. Ví dụ: nếu đang viết mã Jetpack Compose, bạn sẽ thêm các chú thích như @Composable cần được Trình bổ trợ trình biên dịch Compose Kotlin xử lý. Các chú thích khác có thể được xử lý bằng Kotlin Symbol Processor (KSP) hoặc các công cụ xử lý chú thích riêng biệt.
Phần phụ thuộc thư viện
Thư viện chứa mã byte được đưa vào dưới dạng một phần của ứng dụng. Đây có thể là một tệp JAR Java, thư viện Android (AAR) hoặc một dự án phụ trong bản dựng của bạn. Nhiều thư viện tuân theo Phiên bản ngữ nghĩa, có thể giúp bạn hiểu được thời điểm chúng vẫn tương thích (hoặc không) khi được nâng cấp.
Các thư viện thường có phần phụ thuộc bắc cầu trên các thư viện khác. Điều này giúp giảm bớt những gì bạn phải quản lý một cách rõ ràng; bạn chỉ định các phần phụ thuộc trực tiếp và Gradle sẽ kéo chúng vào cùng với các phần phụ thuộc bắc cầu. Việc nâng cấp các phần phụ thuộc trực tiếp cũng có thể nâng cấp các phần phụ thuộc bắc cầu của chúng.
Đôi khi, một thư viện có thể yêu cầu phiên bản tối thiểu của SDK Android trong thời gian chạy (minSdk) hoặc thời gian biên dịch (compileSdk). Điều này là cần thiết khi một thư viện sử dụng các hàm có trong SDK Android hoặc API JDK được cung cấp. minSdk có hiệu lực của ứng dụng là minSdk cao nhất mà ứng dụng và tất cả các phần phụ thuộc thư viện trực tiếp và bắc cầu của ứng dụng yêu cầu.
Việc sử dụng một số thư viện có thể yêu cầu sử dụng một trình bổ trợ Gradle cụ thể. Các trình bổ trợ trợ giúp này thường cài đặt Trình xử lý ký hiệu Kotlin hoặc các trình xử lý chú thích khác để tạo mã hoặc sửa đổi quá trình biên dịch nguồn nhằm hỗ trợ bạn sử dụng các tính năng của thư viện. Ví dụ: Jetpack Room bao gồm các chú thích và một KSP chuyển đổi các chú thích đó thành mã được tạo để truy xuất và sửa đổi dữ liệu trong một cơ sở dữ liệu. Jetpack Compose yêu cầu trình bổ trợ trình biên dịch Compose sửa đổi các hàm được chú thích để quản lý cách thức và thời điểm chạy lại hàm đó.
Công cụ
Gradle |
Gradle là công cụ xây dựng đọc các tệp bản dựng và tạo ứng dụng hoặc thư viện của bạn, đồng thời hiển thị một API cho các trình bổ trợ để mở rộng chức năng của công cụ này. Gradle chạy nhiều quy trình trên một hoặc nhiều máy ảo Java và các trình bổ trợ Java của Gradle gọi công cụ Java bên trong JDK. |
Trình bổ trợ Gradle |
Trình bổ trợ Gradle mở rộng Gradle bằng cách xác định các tác vụ và cấu hình mới. Việc áp dụng trình bổ trợ cho bản dựng sẽ cho phép các chức năng bản dựng cụ thể, được định cấu hình dưới dạng dữ liệu trong tập lệnh bản dựng. Đối với các bản dựng Android, trình bổ trợ Gradle quan trọng nhất là Trình bổ trợ Android cho Gradle (AGP). |
Trình biên dịch |
Trình biên dịch Kotlin hoặc Java chuyển đổi mã nguồn của bạn thành mã byte có thể thực thi. Trình biên dịch Kotlin hiển thị một API trình bổ trợ cho phép chạy trực tiếp quá trình phân tích bên ngoài và tạo mã bên trong trình biên dịch, truy cập vào cấu trúc mã được phân tích cú pháp. |
Trình bổ trợ trình biên dịch |
Trình bổ trợ trình biên dịch thực hiện phân tích và tạo mã bên trong trình biên dịch Kotlin trong khi trình biên dịch Kotlin đang phân tích mã của bạn và được cài đặt khi bạn áp dụng trình bổ trợ Gradle cho bản dựng. |
SDK Android |
SDK Android chứa Nền tảng Android và API Java cho một phiên bản Android cụ thể, cùng các công cụ tương ứng. Các công cụ này giúp bạn quản lý SDK, xây dựng ứng dụng, cũng như giao tiếp và mô phỏng thiết bị Android. Mỗi phiên bản SDK Android đều cung cấp các API Java cụ thể mà mã nguồn của bạn có thể truy cập, đồng thời hỗ trợ đơn giản hoá để sử dụng các API đó trên các phiên bản Android cũ hơn. |
JDK |
Bộ phát triển Java, chứa các thư viện Java và tệp thực thi để biên dịch nguồn Java và chạy các ứng dụng Java. Có một số JDK đang hoạt động trong một bản dựng Android. Hãy xem phần Phiên bản Java trong các bản dựng Android để biết thêm thông tin chi tiết. |
Phạm vi Gradle
Gradle nhóm các phần phụ thuộc thư viện thành nhiều phạm vi (gọi là cấu hình trong API Gradle), cho phép bạn chỉ định nhiều nhóm phần phụ thuộc thư viện để sử dụng trong các phần khác nhau của bản dựng. Ví dụ: có thể bạn không muốn đưa các thư viện kiểm thử như JUnit vào ứng dụng hoặc thư viện đã xuất bản, nhưng bạn lại muốn có các thư viện này khi tạo và thực thi các bài kiểm thử đơn vị. Bạn cũng có thể sử dụng phạm vi để thêm bộ xử lý ký hiệu hoặc chú thích nhằm phân tích mã của mình.
Ví dụ: AGP xác định phạm vi implementation và api, cách bạn chỉ định xem có nên hiển thị phần phụ thuộc cho người dùng của dự án phụ hay không.
Xem phần Định cấu hình phần phụ thuộc để biết nội dung mô tả về các phạm vi này và các phạm vi khác được dùng trong bản dựng Android.
Thêm phần phụ thuộc thư viện vào khối dependencies của tệp bản dựng, dưới dạng chuỗi group:artifact:version:
Kotlin
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation("com.example:library1:1.2.3") api("com.example:library2:1.1.1") }
Groovy
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation 'com.example:library1:1.2.3' api 'com.example:library2:1.1.1' }
hoặc trong Danh mục phiên bản:
# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"
[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }
[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }
và chỉ định các biến được tạo trong tệp bản dựng:
Kotlin
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation(libs.example.library) }
Groovy
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation libs.example.library }