Kết quả build c++ ra lỗi có chữ e năm 2024
Trang này cho bạn biết cách định cấu hình các biến thể bản dựng để tạo nhiều phiên bản ứng dụng từ một dự án duy nhất và cách quản lý hợp lý các phần phụ thuộc cũng như cấu hình ký tên. Show
Mỗi biến thể bản dựng đại diện cho một phiên bản riêng của ứng dụng được tạo. Ví dụ: bạn muốn tạo một phiên bản miễn phí của ứng dụng, trong đó chỉ giới hạn một số nội dung nhất định, và một phiên bản khác có tính phí và chứa nhiều nội dung hơn. Bạn cũng có thể tạo các phiên bản ứng dụng riêng theo loại thiết bị mà ứng dụng hướng đến, dựa trên cấp độ API hoặc các biến thể thiết bị khác. Các biến thể bản dựng (build variant) là kết quả của quá trình trong đó Gradle sử dụng một bộ quy tắc cụ thể để kết hợp các chế độ cài đặt, đoạn mã và tài nguyên được định cấu hình trong các loại bản dựng (build type) và phiên bản sản phẩm (product flavor). 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 đó. Ví dụ: một phiên bản sản phẩm "demo" (minh hoạ) có thể nêu rõ các yêu cầu nhất định về tính năng và thiết bị, chẳng hạn như mã nguồn tuỳ chỉnh, tài nguyên và cấp độ API tối thiểu. Trong khi đó, loại bản dựng "debug" (gỡ lỗi) áp dụng các chế độ cài đặt bản dựng và đóng gói riêng biệt, chẳng hạn như các tuỳ chọn gỡ lỗi và khoá ký ứng dụng (signing key). Biến thể bản dựng kết hợp cả hai là phiên bản "demoDebug" của ứng dụng và biến thể này sẽ kết hợp cả cấu hình và tài nguyên có trong phiên bản sản phẩm "demo", loại bản dựng "debug" và nhóm tài nguyên Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9. Định cấu hình loại bản dựngBạn có thể tạo và định cấu hình loại bản dựng bên trong khối android { # dimension) "version" }0 của tệp android { # dimension) "version" }1 cấp mô-đun đối với Groovy, hoặc tệp android { # dimension) "version" }2 đối với tập lệnh Kotlin. Khi bạn tạo một mô-đun mới, Android Studio sẽ tự động tạo các loại bản dựng tương ứng với bản gỡ lỗi và bản phát hành. Tuy loại bản dựng gỡ lỗi không xuất hiện trong tệp cấu hình bản dựng, nhưng Android Studio sẽ định cấu hình cho loại bản dựng này với . Điều này cho phép bạn gỡ lỗi ứng dụng trên các thiết bị Android bảo mật và định cấu hình ký ứng dụng (app signing) bằng kho khoá (keystore) gỡ lỗi chung. Nếu muốn thêm hoặc thay đổi một số chế độ cài đặt nào đó, bạn có thể thêm loại bản dựng gỡ lỗi này vào phần cấu hình. Mẫu sau đây sẽ chỉ định một cho loại bản dựng gỡ lỗi và định cấu hình loại bản dựng "ra mắt để thử nghiệm" (staging) được khởi chạy bằng chế độ cài đặt cho loại bản dựng gỡ lỗi. Groovyandroid {
Kotlinandroid {
Lưu ý: Khi thay đổi tệp cấu hình bản dựng, Android Studio sẽ yêu cầu bạn đồng bộ dự án với cấu hình mới này. Khi bạn thực hiện thay đổi, hãy nhấp vào Sync Now (Đồng bộ hoá ngay) trên thanh thông báo xuất hiện để đồng bộ hoá dự án, hoặc nhấp vào biểu tượng Sync Project (Đồng bộ hoá dự án) trên thanh công cụ. Nếu Android Studio phát hiện bất cứ lỗi nào trong cấu hình, cửa sổ Messages (Thông báo) sẽ xuất hiện cùng mô tả chi tiết về vấn đề đó.Để tìm hiểu thêm về tất cả thuộc tính mà bạn có thể định cấu hình cho các loại bản dựng, hãy tham khảo android { # dimension) "version" }5. Định cấu hình phiên bản sản phẩmQuá trình tạo phiên bản sản phẩm cũng tương tự như quá trình tạo các loại bản dựng. Hãy thêm các phiên bản sản phẩm đó vào khối android { # dimension) "version" }6 trong cấu hình bản dựng và thêm chế độ cài đặt bạn muốn. Các phiên bản sản phẩm hỗ trợ các thuộc tính tương tự như android { # dimension) "version" }7, vì android { # dimension) "version" }7 thực sự thuộc về lớp android { # dimension) "version" }9. Tức là bạn có thể cung cấp cấu hình cơ sở cho tất cả phiên bản trong khối android { # dimension) "version" }7, và mỗi phiên bản có thể thay đổi bất kỳ giá trị mặc định nào trong đó, chẳng hạn như android { # dimension) += "version" }1. Để tìm hiểu thêm về mã nhận dạng ứng dụng, hãy đọc nội dung . Lưu ý: Bạn vẫn cần chỉ định tên gói bằng thuộc tính trong tệp kê khai Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9. Bạn cũng phải sử dụng tên gói đó trong mã nguồn để tham chiếu đến lớp android { # dimension) += "version" }4, hoặc để giải quyết mọi hoạt động hoặc đăng ký dịch vụ có liên quan. Điều này cho phép bạn sử dụng android { # dimension) += "version" }1 để cung cấp mã nhận dạng duy nhất cho mỗi phiên bản sản phẩm để đóng gói và phân phối mà không phải thay đổi mã nguồn. Tất cả phiên bản phải thuộc một nhóm phiên bản (flavor dimension) được đặt tên, đó là một nhóm các phiên bản sản phẩm. Bạn phải chỉ định tất cả phiên bản cho một nhóm phiên bản nào đó. Nếu không làm như vậy, bạn sẽ gặp lỗi bản dựng sau đây. Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. Nếu một mô-đun chỉ được gán cho một nhóm phiên bản thì trình bổ trợ Android cho Gradle sẽ tự động gán tất cả phiên bản của mô-đun cho nhóm phiên bản đó. Mã mẫu sau đây tạo một nhóm phiên bản có tên là "version" (phiên bản) và thêm các phiên bản sản phẩm "demo" (minh hoạ) và "full" (đầy đủ). Các phiên bản này tự cung cấp và android { # dimension) += "version" }7 riêng tương ứng: Groovyandroid { # dimension) "version" }Kotlinandroid { # dimension) += "version" }Lưu ý: Nếu bạn có một ứng dụng cũ (tạo trước tháng 8 năm 2021) đang phân phối bằng tệp APK trên Google Play, để phân phối ứng dụng bằng tính năng hỗ trợ nhiều tệp APK trên Google Play, hãy chỉ định cùng một giá trị android { # dimension) += "version" }1 cho tất cả biến thể và cung cấp cho mỗi biến thể một riêng biệt. Để phân phối nhiều biến thể của ứng dụng dưới dạng các ứng dụng riêng biệt trong Google Play, bạn cần chỉ định android { # dimension) += "version" }1 riêng cho từng biến thể. Sau khi tạo và định cấu hình các phiên bản sản phẩm, hãy nhấp vào Sync Now (Đồng bộ hoá ngay) trong thanh thông báo. Sau khi quá trình đồng bộ hoàn tất, Gradle sẽ tự động tạo các biến thể bản dựng dựa trên loại bản dựng và phiên bản sản phẩm, đồng thời đặt tên cho các biến thể đó theo định dạng android { }1. Ví dụ: nếu bạn đã tạo các phiên bản sản phẩm "demo" và "full" và giữ lại các loại bản dựng "debug" và "release" mặc định, Gradle sẽ tạo các biến thể bản dựng sau đây:
Để chọn biến thể bản dựng cần tạo và chạy, hãy chuyển đến phần Build (Bản dựng) > Select Build Variant (Chọn biến thể bản dựng) rồi chọn một biến thể bản dựng trên trình đơn. Để bắt đầu tuỳ chỉnh từng biến thể bản dựng bằng các tính năng và tài nguyên riêng, bạn cần , như mô tả trên trang này. Thay đổi mã nhận dạng ứng dụng cho các biến thể bản dựngKhi tạo một tệp APK hoặc AAB cho ứng dụng, các công cụ bản dựng sẽ gắn thẻ bằng mã nhận dạng ứng dụng được xác định trong khối android { # dimension) "version" }7 của tệp android { # dimension) "version" }1 (như trình bày bên dưới). Tuy nhiên, nếu bạn muốn tạo nhiều phiên bản ứng dụng để xuất hiện dưới dạng các trang thông tin riêng biệt trên Cửa hàng Google Play, chẳng hạn như phiên bản "free" (miễn phí) và "pro" (chuyên nghiệp), bạn cần tạo các biến thể bản dựng riêng biệt, trong đó mỗi biến thể có một mã nhận dạng ứng dụng riêng. Trong trường hợp này, hãy định nghĩa mỗi biến thể bản dựng là một riêng biệt. Với mỗi phiên bản trong khối android { # dimension) "version" }6, bạn có thể xác định lại thuộc tính android { # dimension) += "version" }1, hoặc thay vào đó bạn có thể bổ sung một mảnh (segment) vào mã nhận dạng ứng dụng mặc định thông qua android { # dimension) "version" }4 như minh họa dưới đây: Groovyandroid { }Kotlinandroid { }Bằng cách này, mã nhận dạng ứng dụng của phiên bản sản phẩm "free" là "com.example.myapp.free". Bạn cũng có thể sử dụng android { # dimension) "version" }4 để bổ sung một phân đoạn dựa trên của mình, như minh hoạ dưới đây: Groovyandroid { }Kotlinandroid { }Gradle áp dụng cấu hình loại bản dựng sau phiên bản sản phẩm nên mã nhận dạng ứng dụng cho biến thể bản dựng "free debug" ("gỡ lỗi miễn phí") hiện là "com.example.myapp.free.debug". Vì hai ứng dụng không thể nào có cùng một mã nhận dạng ứng dụng nên cách làm này sẽ rất hữu ích khi bạn muốn có cả bản gỡ lỗi và phát hành trên cùng một thiết bị. Nếu bạn có một ứng dụng cũ (được tạo trước tháng 8 năm 2021) để phân phối bằng tệp APK trên Google Play, và bạn muốn sử dụng cùng một trang thông tin ứng dụng để phân phối nhiều tệp APK trong khi mỗi tệp APK nhắm đến một cấu hình thiết bị riêng (ví dụ: cấp độ API), thì bạn phải sử dụng cùng một mã nhận dạng ứng dụng cho mỗi biến thể bản dựng nhưng cung cấp cho mỗi tệp APK một android { # dimension) += "version" }9 riêng. Để biết thêm thông tin, hãy đọc nội dung về việc Hỗ trợ nhiều tệp APK. Việc phát hành thông qua tệp AAB sẽ không bị ảnh hưởng vì tệp AAB sử dụng một cấu phần mềm duy nhất sử dụng một mã phiên bản và mã nhận dạng ứng dụng duy nhất theo mặc định. Mẹo: Nếu cần tham chiếu đến mã nhận dạng ứng dụng trong tệp kê khai, bạn có thể sử dụng phần giữ chỗ android { }3 trong mọi thuộc tính tệp kê khai. Trong quá trình tạo bản dựng, Gradle sẽ thay thế thẻ này bằng mã nhận dạng ứng dụng thực tế. Để biết thêm thông tin, hãy xem nội dung . Kết hợp nhiều phiên bản sản phẩm với các nhóm phiên bảnTrong một số trường hợp, bạn có thể muốn kết hợp các cấu hình trong nhiều phiên bản sản phẩm. Ví dụ: bạn muốn tạo các cấu hình riêng cho từng phiên bản sản phẩm "full" ("đầy đủ") và "demo" ("minh hoạ") dựa trên cấp độ API. Để thực hiện việc này, trình bổ trợ Android cho Gradle cho phép bạn tạo nhiều nhóm phiên bản sản phẩm, gọi là các nhóm phiên bản (flavor dimension). Khi tạo ứng dụng, Gradle sẽ kết hợp một cấu hình phiên bản sản phẩm trong mỗi nhóm phiên bản mà bạn định nghĩa cùng với một cấu hình loại bản dựng để tạo biến thể bản dựng hoàn thiện. Gradle không kết hợp các phiên bản sản phẩm thuộc cùng một nhóm phiên bản. Mã mẫu sau đây sử dụng thuộc tính để tạo nhóm phiên bản "mode" để nhóm các phiên bản sản phẩm "full" và "demo" với nhau, đồng thời, tạo nhóm phiên bản "api" để nhóm các cấu hình phiên bản sản phẩm theo cấp độ API: Groovyandroid { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...Kotlinandroid {
0 Số lượng biến thể bản dựng Gradle tạo ra bằng với số lượng phiên bản trong mỗi nhóm phiên bản nhân với số lượng loại bản dựng mà bạn định cấu hình. Khi Gradle đặt tên cho từng biến thể bản dựng hoặc các cấu phần mềm tương ứng, các phiên bản sản phẩm thuộc nhóm phiên bản có mức độ ưu tiên cao hơn sẽ xuất hiện trước tiên, tiếp đến là các phiên bản trong các nhóm phiên bản có mức độ ưu tiên thấp hơn, sau đó là loại bản dựng. Lấy cấu hình bản dựng trước đó làm ví dụ, Gradle sẽ tạo tổng cộng 12 biến thể bản dựng với lược đồ đặt tên như sau:
android { }7Tệp APK tương ứng: android { }8 Ngoài các thư mục nhóm tài nguyên bạn có thể tạo cho mỗi phiên bản sản phẩm và biến thể bản dựng riêng lẻ, bạn cũng có thể tạo thư mục nhóm tài nguyên cho mỗi tổ hợp phiên bản sản phẩm. Ví dụ: bạn có thể tạo và thêm các tài nguyên Java vào thư mục android { }9 và Gradle chỉ sử dụng những tài nguyên đó khi tạo một biến thể kết hợp từ hai phiên bản sản phẩm đó. Các nhóm tài nguyên bạn tạo cho các tổ hợp phiên bản sản phẩm có mức độ ưu tiên cao hơn các nhóm tài nguyên thuộc từng phiên bản sản phẩm riêng lẻ. Để tìm hiểu thêm về nhóm tài nguyên và cách Gradle hợp nhất các tài nguyên, hãy đọc phần về cách . Lọc biến thểGradle sẽ tạo một biến thể bản dựng cho mọi tổ hợp phiên bản sản phẩm và loại bản dựng mà bạn định cấu hình. Tuy nhiên, có thể xuất hiện một số biến thể bản dựng bạn không cần hoặc không phù hợp trong bối cảnh của dự án. Để xoá một số cấu hình biến thể bản dựng nhất định, hãy tạo một bộ lọc biến thể trong tệp android { # dimension) "version" }1 cấp mô-đun. Lấy cấu hình bản dựng ở phần trước để làm ví dụ, giả sử bạn dự định chỉ hỗ trợ API cấp 23 trở lên cho bản minh hoạ (demo) của ứng dụng. Bạn có thể sử dụng khối android { }1 để lọc ra tất cả cấu hình biến thể bản dựng tổ hợp từ các phiên bản sản phẩm "minApi21" và "demo": Groovyandroid {
1 Kotlinandroid {
2 Sau khi thêm một bộ lọc biến thể vào cấu hình bản dựng và nhấp vào Sync Now (Đồng bộ hoá ngay) trong thanh thông báo, Gradle sẽ bỏ qua mọi biến thể bản dựng đáp ứng các điều kiện mà bạn chỉ định. Các biến thể bản dựng không còn xuất hiện trong trình đơn khi bạn nhấp vào Build > Select Build Variant (Tạo > Chọn biến thể bản dựng) trên thanh trình đơn hoặc biểu tượng Build Variants (Biến thể bản dựng) trên thanh cửa sổ công cụ.Tạo nhóm tài nguyênTheo mặc định, Android Studio sẽ tạo Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9 và các thư mục chứa toàn bộ những gì bạn muốn chia sẻ giữa tất cả biến thể bản dựng của mình. Tuy nhiên, bạn có thể tạo các nhóm tài nguyên mới để kiểm soát chính xác những tệp mà Gradle biên dịch và đóng gói cho các loại bản dựng, phiên bản sản phẩm (và tổ hợp các phiên bản sản phẩm khi sử dụng ) và các biến thể bản dựng cụ thể. Ví dụ: bạn có thể định nghĩa chức năng cơ bản trong nhóm tài nguyên Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9 và sử dụng các nhóm tài nguyên phiên bản sản phẩm để thay đổi nhãn ứng dụng theo khách hàng hoặc chỉ cung cấp các quyền đặc biệt và chức năng ghi nhật ký dành cho các biến thể bản dựng sử dụng loại bản dựng gỡ lỗi. Gradle cho rằng các tệp và thư mục nhóm tài nguyên sẽ được bố trí theo một cách nhất định, tương tự như nhóm tài nguyên Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9. Ví dụ: Gradle cho rằng các tệp lớp Kotlin hoặc Java dành riêng cho loại bản dựng "debug" sẽ được đặt trong các thư mục android { }5 hoặc android { }6. Trình bổ trợ Android cho Gradle cung cấp một tác vụ Gradle rất hữu ích, giúp bạn biết cách sắp xếp các tệp cho từng loại bản dựng, phiên bản sản phẩm cũng như biến thể bản dựng. Ví dụ: mẫu sau đây trong phần kết quả của tác vụ sẽ giúp mô tả vị trí nơi Gradle dự kiến sẽ tìm một số tệp nhất định nào đó cho loại bản dựng "debug": android {
3 Để xem kết quả này, hãy tiến hành như sau:
Lưu ý: Kết quả đầu ra của tác vụ này cũng giúp bạn biết cách sắp xếp các nhóm tài nguyên cho các tệp bạn muốn sử dụng để chạy các lượt kiểm thử cho ứng dụng của bạn, chẳng hạn như android { }7 và android { }8. Khi tạo một biến thể bản dựng mới, Android Studio sẽ không tạo các thư mục nhóm tài nguyên mà sẽ cung cấp một số tuỳ chọn để giúp bạn thực hiện việc này. Ví dụ: để tạo chỉ thư mục android { }9 cho loại bản dựng "debug":
Android Studio tạo một thư mục nhóm tài nguyên cho loại bản dựng gỡ lỗi rồi tạo thư mục android { }9 bên trong thư mục này. Ngoài ra, Android Studio có thể tạo các thư mục này khi bạn thêm một tệp mới vào dự án cho một biến thể bản dựng cụ thể. Ví dụ: để tạo tệp giá trị XML cho loại bản dựng "debug":
Vì loại bản dựng "debug" được chỉ định làm nhóm tài nguyên đích nên Android Studio sẽ tự động tạo các thư mục cần thiết khi tạo tệp XML. Cấu trúc của thư mục kết quả sẽ có dạng như Hình 1. Hình 1. Các thư mục nhóm tài nguyên mới cho loại bản dựng gỡ lỗi. Các nhóm tài nguyên đang hoạt động được biểu thị bằng một chỉ báo màu xanh lục trong biểu tượng. Nhóm tài nguyên android { }4 có hậu tố là android { }5 để cho biết nhóm tài nguyên đó sẽ được hợp nhất vào nhóm tài nguyên android { }6. Áp dụng quy trình tương tự, bạn có thể tạo thư mục nhóm tài nguyên cho các phiên bản sản phẩm (chẳng hạn như android { }
android { }8). Ngoài ra, bạn có thể tạo nhóm tài nguyên kiểm thử dành cho các biến thể bản dựng cụ thể, chẳng hạn như android { }9. Để tìm hiểu thêm, hãy tham khảo nội dung về . Thay đổi cấu hình nhóm tài nguyên mặc địnhNếu bạn có các nguồn tài nguyên chưa được sắp xếp theo cấu trúc tệp nhóm tài nguyên mặc định như Gradle mong muốn (như mô tả trong phần ở trên), bạn có thể sử dụng khối android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...0 để thay đổi vị trí Gradle có thể thu thập các tệp cho từng thành phần của một nhóm tài nguyên. Khối android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...0 phải nằm trong khối android { # dimension) "version" }0. Bạn không cần phải định vị lại các tệp tài nguyên mà chỉ cần cung cấp cho Gradle (các) đường dẫn liên quan đến tệp android { # dimension) "version" }1 ở cấp mô-đun, nơi Gradle có thể tìm thấy các tệp đó cho từng thành phần của nhóm tài nguyên. Để tìm hiểu xem bạn có thể định cấu hình những thành phần nào và có thể ánh xạ những thành phần đó với nhiều tệp hoặc thư mục hay không, vui lòng xem tài liệu tham khảo về API của trình bổ trợ Android cho Gradle. Mã mẫu sau đây sẽ ánh xạ các nguồn tài nguyên trong thư mục android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...4 đến các thành phần nhất định của nhóm tài nguyên android { }6 và thay đổi thư mục gốc của nhóm tài nguyên android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...6. Groovyandroid {
4 Kotlinandroid {
5 Vui lòng lưu ý là một thư mục nguồn chỉ có thể thuộc về một nhóm tài nguyên. Ví dụ: bạn không thể chia sẻ cùng một nguồn thử nghiệm với cả nhóm tài nguyên android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...7 và android { ... buildTypes { }
// Specifies the flavor dimensions you want to use. The order in which you
// list the dimensions determines their priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode"
productFlavors { }
}
...6. Điều này là do Android Studio tạo các mô-đun IntelliJ riêng biệt cho mỗi nhóm tài nguyên và không thể hỗ trợ nội dung gốc trùng lặp trên các nhóm tài nguyên. Bản dựng chứa nhóm tài nguyênBạn có thể sử dụng các thư mục nhóm tài nguyên để chứa mã và tài nguyên bạn chỉ muốn đóng gói theo cấu hình nhất định. Ví dụ: nếu bạn đang tạo biến thể bản dựng "demoDebug", là sản phẩm chéo (crossproduct) của phiên bản sản phẩm "demo" và loại bản dựng "debug", Gradle sẽ xem xét các thư mục này và thiết lập mức độ ưu tiên như sau:
Các nhóm tài nguyên được tạo cho tổ hợp các phiên bản sản phẩm phải bao gồm tất cả nhóm phiên bản. Ví dụ: nhóm tài nguyên biến thể bản dựng phải là tổ hợp của (loại bản dựng + tất cả các nhóm phiên bản). Việc hợp nhất mã và tài nguyên liên quan đến các thư mục bao gồm nhiều, nhưng không phải tất cả, nhóm phiên bản sẽ không được hỗ trợ. Nếu bạn kết hợp nhiều phiên bản sản phẩm thì mức độ ưu tiên giữa các phiên bản sản phẩm sẽ được xác định theo nhóm phiên bản của những phiên bản sản phẩm này. Khi liệt kê các nhóm phiên bản chứa thuộc tính , các phiên bản sản phẩm thuộc nhóm phiên bản liệt kê đầu tiên sẽ có mức độ ưu tiên cao hơn so với các phiên bản thuộc nhóm phiên bản thứ hai, v.v. Ngoài ra, các nhóm tài nguyên bạn tạo cho các tổ hợp phiên bản sản phẩm sẽ có mức độ ưu tiên cao hơn so với các nhóm tài nguyên thuộc từng phiên bản sản phẩm riêng lẻ. Thứ tự ưu tiên sẽ xác định nhóm tài nguyên nào có mức độ ưu tiên cao hơn khi Gradle kết hợp mã và tài nguyên. Thư mục nhóm tài nguyên android {
04 có thể chứa các tệp dành riêng cho biến thể bản dựng đó, do đó nếu android {
04 bao gồm một tệp cũng được xác định trong android {
06 thì Gradle sẽ sử dụng tệp này trong nhóm tài nguyên android {
04. Tương tự như vậy, Gradle sẽ thiết lập mức độ ưu tiên cao hơn cho các tệp trong các nhóm tài nguyên loại bản dựng và phiên bản sản phẩm so với các tệp trong Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 9. Gradle sẽ xem xét thứ tự ưu tiên này khi áp dụng các quy tắc tạo bản dựng sau đây:
Khai báo phần phụ thuộcĐể định cấu hình phần phụ thuộc cho biến thể bản dựng cụ thể hoặc , hãy thêm tiền tố cho tên của biến thể bản dựng hoặc nhóm tài nguyên kiểm thử trước từ khoá android {
19, như minh hoạ trong ví dụ sau: Groovyandroid {
6 Kotlinandroid {
7 Để biết thêm thông tin về việc định cấu hình các phần phụ thuộc, hãy xem nội dung Thêm phần phụ thuộc vào bản dựng. Sử dụng tính năng quản lý phần phụ thuộc có thể nhận biết biến thểTrình bổ trợ Android cho Gradle 3.0.0 trở lên cung cấp một cơ chế phần phụ thuộc mới sẽ tự động so khớp các biến thể trong quá trình sử dụng thư viện. Tức là biến thể android { }4 của một ứng dụng sẽ tự động sử dụng biến thể android { }4 của một thư viện, v.v. Điều này cũng áp dụng tương tự khi sử dụng các phiên bản — một biến thể android {
22 của ứng dụng sẽ sử dụng một biến thể android {
22 của thư viện. Để trình bổ trợ so khớp chính xác các biến thể, bạn cần theo mô tả trong phần sau đây, ví dụ như trường hợp không thể so khớp trực tiếp. Ví dụ: giả sử ứng dụng của bạn định cấu hình loại bản dựng có tên là "staging" ("ra mắt để thử nghiệm"), nhưng một trong các phần phụ thuộc của thư viện thì không. Khi cố gắng tạo phiên bản "staging" cho ứng dụng, trình bổ trợ không biết nên sử dụng phiên bản nào của thư viện và bạn sẽ thấy thông báo lỗi có dạng như sau: android {
8 Khắc phục lỗi bản dựng liên quan đến việc so khớp biến thểTrình bổ trợ này cung cấp các phần tử DSL, cho phép bạn kiểm soát cách Gradle giải quyết các tình huống trong đó không thể so khớp biến thể trực tiếp giữa ứng dụng và phần phụ thuộc. Sau đây là danh sách vấn đề liên quan đến việc so khớp phần phụ thuộc có thể nhận biết biến thể và cách giải quyết các vấn đề đó bằng cách sử dụng các thuộc tính DSL:
Để biết thêm thông tin, hãy xem thông tin về và trong tài liệu tham khảo về DSL của trình bổ trợ Android cho Gradle. Định cấu hình chế độ cài đặt chữ kýGradle không ký tệp APK hoặc AAB của bản phát hành phát hành trừ phi bạn định nghĩa rõ ràng cấu hình ký tên cho bản dựng này. Nếu bạn chưa có khoá ký (signing key), hãy dùng Android Studio để . Cách định cấu hình thủ công cho phần cấu hình ký tên cho loại bản dựng phát hành thông qua công cụ cấu hình bản dựng Gradle:
Lưu ý: Bạn không nên cung cấp mật khẩu trong khoá phát hành và kho khoá bên trong tệp bản dựng. Thay vào đó, hãy định cấu hình tệp bản dựng để lấy những mật khẩu này qua các biến môi trường hoặc yêu cầu quy trình tạo bản dựng nhắc bạn về những mật khẩu này. Cách lấy những mật khẩu này qua các biến môi trường: GroovyError: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 7 KotlinError: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension. 8 Ngoài ra, bạn có thể tải kho khoá qua một tệp thuộc tính cục bộ. Vì lý do bảo mật, đừng thêm tệp này vào chế độ kiểm soát nguồn. Thay vào đó, hãy thiết lập chế độ kiểm soát nguồn cục bộ cho từng nhà phát triển. Để tìm hiểu thêm, hãy đọc nội dung . Sau khi hoàn tất quy trình này, bạn có thể phân phối và phát hành ứng dụng lên Google Play. Cảnh báo: Hãy giữ kho khoá và khoá riêng tư ở một nơi an toàn và bảo mật, đồng thời giữ bản sao lưu của kho khoá và khoá riêng tư này thật an toàn. Nếu bạn sử dụng tính năng Ký ứng dụng của Play và bị mất khoá tải lên, bạn có thể khoá này thông qua Play Console. Nếu phát hành ứng dụng không có Tính năng ký ứng dụng của Play (dành cho các ứng dụng được tạo trước tháng 8 năm 2021) và mất khoá ký ứng dụng, bạn sẽ không thể phát hành bất kỳ bản cập nhật ứng dụng nào. Do vậy, bạn luôn phải ký tất cả phiên bản ứng dụng với cùng một khoá. Ký ứng dụng trên Wear OSKhi phát hành ứng dụng cho Wear OS, cả tệp APK cho đồng hồ và tệp APK cho điện thoại (không bắt buộc) đều cần được ký bằng cùng một khoá. Để biết thêm thông tin về việc đóng gói và ký ứng dụng trên Wear OS, hãy xem nội dung về Đóng gói và phân phối ứng dụng Wear. |