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 phần Tổng quan về bản dựng Gradle và Cấ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 ứ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.
- Ký
- 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 cho Máy ảo Java (JVM)) để định cấu hình bản dựng.
Bạn không cần phải nắm rõ cách sử dụng 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ẽ đưa ra 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 vào DSL Kotlin cơ bản của Gradle
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 phần 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 DSL Kotlin) hoặc tệp settings.gradle
(đối với DSL Groovy) 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 bổ sung trong quá trình xây dựng ứng dụng. Các dự án chứa nhiều mô-đun cần chỉ định những mô-đun sẽ được đưa vào bản dựng hoàn thiện.
Đố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 trong dự án của bạn sử dụng.
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 }
Tệp bản dựng cấp mô-đun
Tệp build.gradle.kts
cấp mô-đun (đối với DSL Kotlin) hoặc build.gradle
(đối với DSL Groovy) nằm trong từng thư mục project/module/
. Tệp này cho phép định cấu hình các chế độ cài đặt bản dựng dành riêng cho mô-đun chứa tệp. Việc định cấu hình những chế độ cài đặt bản dựng này cho phép bạn cung cấp các chế độ đóng gói tuỳ chỉnh, chẳng hạn như các loại bản dựng và phiên bản sản phẩm bổ sung, cũng như ghi đè những chế độ cài đặt trong tệp kê khai main/
hoặc tập lệnh bản dựng cấp cao nhất.
Cài đặt SDK Android
Tệp bản dựng cấp mô-đun cho ứng dụng của bạn bao gồm các chế độ cài đặt cho biết phiên bản SDK Android được dùng khi biên dịch, chọn hành vi của nền tảng và chỉ định phiên bản tối thiểu mà ứng dụng của bạn chạy trên đó.
-
compileSdk
-
compileSdk
xác định những API Android và Java có sẵn khi biên dịch mã nguồn. Để sử dụng các tính năng mới nhất của Android, hãy sử dụng SDK Android mới nhất khi biên dịch.Một số API nền tảng Android có thể không có trong các cấp độ API cũ. Bạn có thể bảo vệ có điều kiện việc sử dụng các tính năng mới hơn hoặc sử dụng thư viện tương thích AndroidX để sử dụng các tính năng mới hơn với cấp độ API Android thấp hơn.
Mỗi SDK Android cung cấp một tập hợp con các API Java để sử dụng trong ứng dụng của bạn. Bảng tại phần Tôi có thể sử dụng API Java nào trong mã nguồn Java hoặc Kotlin của mình cho biết cấp độ API Java có sẵn dựa trên phiên bản SDK Android. Các API Java mới hơn được hỗ trợ trên các phiên bản Android cũ thông qua tính năng đơn giản hoá. Bạn phải bật tính năng này trong bản dựng.
Android Studio sẽ hiển thị cảnh báo nếu
compileSdk
của bạn xung đột với phiên bản Android Studio, AGP hiện tại hoặc các yêu cầu về phần phụ thuộc thư viện của dự án. -
minSdk
-
minSdk
chỉ định phiên bản Android thấp nhất mà bạn muốn ứng dụng của mình hỗ trợ. Việc đặtminSdk
sẽ hạn chế những thiết bị có thể cài đặt ứng dụng của bạn.Việc hỗ trợ các phiên bản Android thấp hơn có thể yêu cầu nhiều hoạt động kiểm tra có điều kiện hơn trong mã của bạn hoặc sử dụng nhiều thư viện tương thích AndroidX hơn. Bạn nên cân nhắc chi phí bảo trì để hỗ trợ các phiên bản thấp hơn so với tỷ lệ phần trăm người dùng vẫn đang sử dụng các phiên bản thấp hơn đó. Xem biểu đồ phiên bản trong Trình hướng dẫn dự án mới của Android Studio để biết tỷ lệ phần trăm sử dụng phiên bản hiện tại.
Khi bạn chỉnh sửa mã trong Android Studio hoặc chạy quy trình kiểm tra trong quá trình tạo bản dựng, công cụ tìm lỗi mã nguồn sẽ cảnh báo về các API mà bạn sử dụng không có trong
minSdk
. Bạn nên khắc phục các lỗi này bằng cách đặt các tính năng mới hơn theo điều kiện hoặc bằng cách sử dụngAppcompat
để tương thích ngược. -
targetSdk
-
targetSdk
phục vụ hai mục đích:- Tệp này đặt hành vi trong thời gian chạy của ứng dụng.
- Chứng thực phiên bản Android mà bạn đã kiểm thử.
Nếu bạn chạy trên một thiết bị đang sử dụng phiên bản Android cao hơn
targetSdk
, thì Android sẽ chạy ứng dụng của bạn ở chế độ tương thích hoạt động tương tự như phiên bản thấp hơn được chỉ định trongtargetSdk
. Ví dụ: khi API 23 ra mắt mô hình quyền khi bắt đầu chạy, không phải ứng dụng nào cũng sẵn sàng áp dụng ngay mô hình này. Bằng cách đặttargetSdk
thành 22, các ứng dụng đó có thể chạy trên thiết bị API 23 mà không cần sử dụng quyền trong thời gian chạy và có thể sử dụng các tính năng có trong phiên bảncompileSdk
mới nhất. Chính sách phân phối của Google Play thực thi các chính sách bổ sung về cấp độ API mục tiêu.Giá trị của
targetSdk
phải nhỏ hơn hoặc bằng giá trị củacompileSdk
.
Lưu ý: Giá trị của compileSdk
và targetSdk
không cần phải giống nhau. Hãy lưu ý các nguyên tắc cơ bản sau:
compileSdk
cấp cho bạn quyền truy cập vào các API mớitargetSdk
đặt hành vi thời gian chạy của ứng dụngtargetSdk
phải nhỏ hơn hoặc bằngcompileSdk
Tập lệnh bản dựng mô-đun ứng dụng mẫu
Tập lệnh bản dựng mô-đun ứng dụng Android mẫu này nêu ra một số phần tử và chế độ cài đặt DSL cơ bản:
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")))) }
Groovy
/** * 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']) }
Tệp thuộc tính Gradle
Gradle cũng bao gồm 2 tệp thuộc tính nằm trong thư mục của dự án gốc mà bạn có thể dùng để chỉ định các chế độ cài đặt cho chính bộ công cụ xây dựng Gradle:
-
gradle.properties
- Đây là nơi bạn có thể định cấu hình các chế độ cài đặt Gradle trên toàn dự án, chẳng hạn như kích thước tối đa của vùng nhớ khối xếp trong trình nền của Gradle. Để biết thêm thông tin, hãy xem nội dung Môi trường tạo bản dựng.
-
local.properties
-
Định cấu hình các thuộc tính môi trường cục bộ cho hệ thống xây dựng, trong đó có:
ndk.dir
– Đường dẫn đến NDK. Thuộc tính này không được dùng nữa. Mọi phiên bản NDK đã tải xuống đều được cài đặt trong thư mụcndk
của thư mục SDK Android.sdk.dir
– Đường dẫn đến SDK Android.cmake.dir
– Đường dẫn đến CMake.ndk.symlinkdir
– trong Android Studio 3.5 trở lên, tạo ra một đường liên kết tượng trưng đến NDK mà có thể ngắn hơn đường dẫn NDK được cài đặt.
Liên kết lại NDK thành một đường dẫn ngắn hơn (chỉ dành cho Windows)
Trên Windows, các công cụ trong thư mục NDK được cài đặt, chẳng hạn như ld.exe
, sẽ chuyển thành các đường dẫn dài. Tuy nhiên, những công cụ này không mạnh về mặt hỗ trợ đường dẫn dài.
Để tạo một đường dẫn ngắn hơn, tại local.properties
, hãy đặt thuộc tính
ndk.symlinkdir
để yêu cầu trình bổ trợ Android cho Gradle tạo một đường liên kết tượng trưng đến NDK. Đường dẫn của đường liên kết tượng trưng này có thể ngắn hơn thư mục NDK hiện có.
Ví dụ: ndk.symlinkdir = C:\
sẽ tạo ra đường liên kết tượng trưng sau đây: C:\ndk\19.0.5232133
Đồng bộ hoá dự án với các tệp Gradle
Khi bạn điều chỉnh tệp cấu hình bản dựng trong dự án, Android Studio sẽ yêu cầu đồng bộ hoá tệp dự án để có thể nhập các thay đổi về cấu hình bản dựng, đồng thời chạy một số tuỳ chọn kiểm tra nhằm đảm bảo cấu hình không phạm lỗi bản dựng.
Để đồng bộ hoá tệp dự án, hãy nhấp vào Sync Now (Đồng bộ hoá ngay) trong thanh thông báo xuất hiện khi bạn thực hiện thay đổi (như minh hoạ trong hình 2) hoặc nhấp vào biểu tượng Sync Project (Đồng bộ hoá dự án) trên thanh trình đơn. Nếu Android Studio phát hiện lỗi trong cấu hình, chẳng hạn như mã nguồn sử dụng các tính năng API chỉ có ở cấp API cao hơn compileSdkVersion
, thì cửa sổ Messages (Thông báo) sẽ xuất hiện để mô tả vấn đề.
Nhóm tài nguyên
Android Studio sẽ nhóm mã nguồn và tài nguyên cho từng mô-đun vào thành các nhóm tài nguyên theo cách hợp lý. Khi bạn tạo mô-đun mới, Android Studio sẽ tạo một nhóm tài nguyên main/
trong mô-đun đó. Nhóm tài nguyên main/
của một mô-đun chứa mã và tài nguyên mà toàn bộ biến thể bản dựng của mô-đun đó sử dụng.
Bạn không bắt buộc phải có các thư mục nhóm tài nguyên bổ sung và Android Studio cũng sẽ không tự động tạo các thư mục này khi bạn định cấu hình các biến thể bản dựng mới. Tuy nhiên, việc tạo nhóm tài nguyên tương tự như main/
sẽ giúp sắp xếp những tệp và tài nguyên mà Gradle chỉ nên sử dụng khi tạo một số phiên bản nhất định của ứng dụng:
-
src/main/
- Nhóm tài nguyên này bao gồm mã và tài nguyên dành cho mọi biến thể bản dựng.
-
src/buildType/
- Tạo nhóm tài nguyên này để chỉ chứa mã và tài nguyên cho một loại bản dựng cụ thể .
-
src/productFlavor/
-
Tạo nhóm tài nguyên này để chỉ chứa mã và tài nguyên cho một phiên bản sản phẩm cụ thể
.
Lưu ý: Nếu định cấu hình bản dựng để kết hợp nhiều phiên bản sản phẩm, bạn có thể tạo thư mục nhóm tài nguyên cho từng tổ hợp phiên bản sản phẩm giữa các nhóm phiên bản:
src/productFlavor1ProductFlavor2/
-
src/productFlavorBuildType/
- Tạo nhóm tài nguyên này để chỉ chứa mã và tài nguyên cho một biến thể bản dựng cụ thể.
Ví dụ: để tạo phiên bản "fullDebug" của ứng dụng, hệ thống xây dựng hợp nhất mã, chế độ cài đặt và tài nguyên lấy từ các nhóm tài nguyên:
-
src/fullDebug/
(nhóm tài nguyên biến thể bản dựng) -
src/debug/
(nhóm tài nguyên loại bản dựng) -
src/full/
(nhóm tài nguyên phiên bản sản phẩm) -
src/main/
(nhóm tài nguyên chính)
Lưu ý: Khi tạo một tệp hoặc thư mục mới trong Android Studio, hãy sử dụng các lựa chọn trong trình đơn File > New (Tệp > Mới) để tạo tệp hoặc thư mục cho một nhóm tài nguyên. Các nhóm tài nguyên mà bạn có thể chọn là tuỳ thuộc vào cấu hình bản dựng và Android Studio sẽ tự động tạo những thư mục cần thiết nếu chưa có.
Nếu các nhóm tài nguyên chứa nhiều phiên bản của cùng một tệp thì Gradle sẽ áp dụng thứ tự ưu tiên dưới đây để quyết định tệp sẽ được sử dụng (nhóm tài nguyên ở bên trái ghi đè các tệp và chế độ cài đặt của nhóm tài nguyên ở bên phải):
biến thể bản dựng > loại bản dựng > phiên bản sản phẩm > nhóm tài nguyên chính > phần phụ thuộc thư viện
Khi áp dụng thứ tự này, Gradle có thể vừa sử dụng các tệp dành riêng cho biến thể bản dựng bạn đang cố gắng tạo, vừa dùng lại những hoạt động, logic ứng dụng và tài nguyên mà các phiên bản khác của ứng dụng cũng sử dụng.
Khi hợp nhất nhiều tệp kê khai, Gradle cũng áp dụng thứ tự ưu tiên này. Vì vậy, mỗi biến thể bản dựng có thể xác định những thành phần hoặc quyền riêng trong tệp kê khai hoàn thiện. Để tìm hiểu thêm về cách tạo nhóm tài nguyên tuỳ chỉnh, hãy đọc phần Tạo nhóm tài nguyên.
Danh mục phiên bản
Nếu bản dựng của bạn chứa nhiều mô-đun có các phần phụ thuộc chung hoặc bạn có nhiều dự án độc lập có các phần phụ thuộc chung, thì bạn nên sử dụng danh mục phiên bản hoặc bảng kê khai thành phần (BOM) để chỉ định các phiên bản chung.
Các hệ thống xây dựng khác
Bạn có thể xây dựng ứng dụng Android bằng Bazel nhưng hiện việc này vẫn chưa được hỗ trợ chính thức. Android Studio chưa chính thức hỗ trợ các dự án Bazel.
Để hiểu rõ hơn về những hạn chế hiện tại đối với việc xây dựng ứng dụng bằng Bazel, hãy xem các vấn đề đã biết.