Trình bổ trợ Android cho Gradle 9.0 là một bản phát hành lớn, mang đến những thay đổi về API và hành vi.
Để cập nhật lên trình bổ trợ Android cho Gradle phiên bản 9.0.1, hãy sử dụng Trợ lý nâng cấp trình bổ trợ Android cho Gradle. Trợ lý nâng cấp AGP giúp duy trì các hành vi hiện có khi nâng cấp dự án bất cứ khi nào phù hợp, nhờ đó, bạn có thể nâng cấp dự án để sử dụng AGP 9.0 ngay cả khi chưa sẵn sàng áp dụng tất cả các giá trị mặc định mới trong AGP 9.0.
Ngoài ra, còn có hai kỹ năng của nhân viên hỗ trợ giúp quá trình nâng cấp trở nên dễ dàng hơn. Đối với ứng dụng không phải KMP, hãy thử kỹ năng nâng cấp AGP 9 trong kho lưu trữ kỹ năng Android. Đối với ứng dụng KMP, hãy thử kỹ năng nâng cấp AGP 9 của JetBrains. Để biết thêm thông tin về cách sử dụng kỹ năng trong Android Studio, hãy xem bài viết Mở rộng Chế độ tác nhân bằng kỹ năng.
Khả năng tương thích
Cấp độ API tối đa mà Trình bổ trợ Android cho Gradle 9.0 hỗ trợ là cấp độ API 36.1. Sau đây là thông tin khác về khả năng tương thích:
| Phiên bản tối thiểu | Phiên bản mặc định | Lưu ý | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Để tìm hiểu thêm, hãy xem phần cập nhật Gradle. |
| Công cụ tạo SDK | 36.0.0 | 36.0.0 | Cài đặt hoặc định cấu hình Công cụ tạo SDK. |
| NDK | Không áp dụng | 28.2.13676358 | Cài đặt hoặc định cấu hình phiên bản khác của NDK. |
| JDK | 17 | 17 | Để tìm hiểu thêm, hãy xem phần cài đặt phiên bản JDK. |
| Trình bổ trợ Kotlin cho Gradle (KGP) | 2.2.10 | 2.2.10 | Để tìm hiểu thêm, hãy xem phần Phần phụ thuộc thời gian chạy trên trình bổ trợ Kotlin cho Gradle. |
Các lớp DSL android hiện chỉ triển khai các giao diện công khai mới
Trong vài năm qua, chúng tôi đã ra mắt các giao diện mới cho DSL và API để kiểm soát tốt hơn những API nào là công khai. Các phiên bản AGP 7.x và 8.x vẫn sử dụng các loại DSL cũ (ví dụ: BaseExtension) cũng triển khai các giao diện công khai mới, nhằm duy trì khả năng tương thích khi công việc tiến triển trên các giao diện.
AGP 9.0 chỉ sử dụng các giao diện DSL mới của chúng tôi, và các cách triển khai đã thay đổi thành các loại mới hoàn toàn bị ẩn. Việc này cũng xoá quyền truy cập vào API biến thể cũ, không dùng nữa.
Để cập nhật lên AGP 9.0, bạn có thể cần làm như sau:
- Đảm bảo dự án của bạn tương thích với Kotlin tích hợp sẵn: Trình bổ trợ
org.jetbrains.kotlin.androidkhông tương thích với DSL mới. Chuyển dự án KMP sang Trình bổ trợ thư viện Android cho Gradle dành cho KMP: Việc sử dụng trình bổ trợ
org.jetbrains.kotlin.multiplatformtrong cùng một dự án con Gradle với trình bổ trợcom.android.libraryvàcom.android.applicationkhông tương thích với DSL mới.Cập nhật tệp bản dựng: Mặc dù việc thay đổi giao diện nhằm giữ cho DSL giống nhau nhất có thể, nhưng có thể có một số thay đổi nhỏ.
Cập nhật logic bản dựng tuỳ chỉnh để tham chiếu đến DSL và API mới: Thay thế mọi tệp đối chiếu đến DSL nội bộ bằng giao diện DSL công khai. Trong hầu hết các trường hợp, đây sẽ là sự thay thế một-một. Thay thế mọi trường hợp sử dụng
applicationVariantsvà các API tương tự bằngandroidComponentsAPI mới. Việc này có thể phức tạp hơn vì APIandroidComponentsđược thiết kế để ổn định hơn nhằm giúp các trình bổ trợ tương thích lâu hơn. Hãy xem Công thức Gradle để biết ví dụ.Cập nhật trình bổ trợ của bên thứ ba: Một số trình bổ trợ của bên thứ ba có thể vẫn phụ thuộc vào các giao diện hoặc API không còn được hiển thị. Di chuyển sang các phiên bản trình bổ trợ tương thích với AGP 9.0.
Việc chuyển sang giao diện DSL mới giúp ngăn các trình bổ trợ và tập lệnh bản dựng Gradle sử dụng nhiều API không dùng nữa, bao gồm:
API không dùng nữa trong khối android |
Chức năng | Thay thế |
|---|---|---|
applicationVariants,libraryVariants,testVariants vàunitTestVariants
|
Điểm mở rộng cho các trình bổ trợ để thêm chức năng mới vào AGP. |
Thay thế bằng API androidComponents.onVariants, ví dụ:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Cho phép tắt các biến thể đã chọn. |
Thay thế bằng API androidComponents.beforeVariants, ví dụ:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider vàtestServer
|
Đăng ký môi trường thử nghiệm tuỳ chỉnh để chạy kiểm thử trên các thiết bị và trình mô phỏng Android. | Chuyển sang thiết bị do Gradle quản lý. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable vàadbExe
|
Sử dụng nhiều thành phần của SDK Android cho các tác vụ tuỳ chỉnh. |
Chuyển sang
androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider vàwrapJavaSourceSet |
Chức năng lỗi thời chủ yếu liên quan đến việc xử lý các nguồn được tạo trong Android Studio, đã ngừng hoạt động trong AGP 7.2.0. | Không có API thay thế trực tiếp cho các API này. |
dexOptions
|
Các chế độ cài đặt lỗi thời liên quan đến công cụ dx đã được thay thế bằng d8. Không có chế độ cài đặt nào có hiệu lực kể từ Trình bổ trợ Android cho Gradle 7.0.
|
Không có phương án thay thế trực tiếp. |
generatePureSplits
|
Tạo tệp phân tách cấu hình cho ứng dụng tức thì. | Khả năng cung cấp tệp phân tách cấu hình hiện đã được tích hợp vào Android App Bundle. |
aidlPackagedList
|
Các tệp AIDL cần đóng gói trong AAR để hiển thị dưới dạng API cho các thư viện và ứng dụng phụ thuộc vào thư viện này. |
Hàm này vẫn được hiển thị trên LibraryExtension nhưng không hiển thị trên các loại tiện ích khác.
|
Nếu bạn cập nhật lên AGP 9.0 và thấy thông báo lỗi sau, thì tức là dự án của bạn vẫn đang tham chiếu đến một số loại cũ:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Nếu bị chặn bởi các trình bổ trợ không tương thích của bên thứ ba, bạn có thể chọn không sử dụng và quay lại các cách triển khai cũ cho DSL, cũng như API biến thể cũ.
Trong khi thực hiện việc này, các giao diện mới cũng có sẵn và bạn vẫn có thể cập nhật logic bản dựng của riêng mình lên API mới. Để chọn không sử dụng, hãy thêm dòng này vào tệp gradle.properties:
android.newDsl=false
Ngoài ra, để di chuyển dần dần, AGP 9.4 cho phép bạn chọn không sử dụng từng mô-đun. Để tìm hiểu cách thực hiện, hãy xem phần Chọn không tham gia mô-đun Variant API.
Các lớp trước đó được đánh dấu là không dùng nữa trong AGP 9.0. Điều này có nghĩa là những dự án chọn không sử dụng cờ newDsl sẽ thấy cảnh báo ngừng hoạt động, bao gồm cả cảnh báo trên chính khối android.
Bạn cũng có thể bắt đầu nâng cấp lên các API mới trước khi nâng cấp lên AGP 9.0. Các giao diện mới đã có trong nhiều phiên bản AGP, vì vậy, bạn có thể kết hợp cả giao diện mới và cũ. Tài liệu tham khảo API AGP cho thấy giao diện API cho từng phiên bản AGP, cũng như thời điểm thêm từng lớp, phương thức và trường.
Chúng tôi đang liên hệ với tác giả của các trình bổ trợ thường dùng để giúp họ điều chỉnh và phát hành các trình bổ trợ hoàn toàn tương thích với các chế độ mới, đồng thời sẽ tiếp tục cải tiến Trợ lý nâng cấp AGP trong Android Studio để hướng dẫn bạn thực hiện quá trình di chuyển.
Nếu bạn nhận thấy DSL hoặc API biến thể mới thiếu các chức năng hoặc tính năng, vui lòng gửi vấn đề càng sớm càng tốt.
Kotlin tích hợp sẵn
Trình bổ trợ Android cho Gradle 9.0 ra mắt tính năng hỗ trợ Kotlin tích hợp sẵn và bật tính năng này theo mặc định. Điều này có nghĩa là bạn không cần phải áp dụng trình bổ trợ org.jetbrains.kotlin.android (hoặc kotlin-android) trong tệp bản dựng để biên dịch tệp nguồn Kotlin nữa.
Việc này giúp đơn giản hoá quá trình tích hợp Kotlin với AGP, tránh sử dụng các API không dùng nữa và cải thiện hiệu suất trong một số trường hợp.
Do đó, khi nâng cấp dự án lên AGP 9.0, bạn cũng cần di chuyển sang Kotlin tích hợp sẵn hoặc chọn không sử dụng.
Bạn cũng có thể chọn tắt tính năng hỗ trợ Kotlin tích hợp sẵn cho các dự án con Gradle không có nguồn Kotlin.
Phần phụ thuộc thời gian chạy trên trình bổ trợ Kotlin cho Gradle
Để cung cấp tính năng hỗ trợ Kotlin tích hợp sẵn, Trình bổ trợ Android cho Gradle 9.0 hiện có một phần phụ thuộc thời gian chạy trên Trình bổ trợ Kotlin cho Gradle (KGP) 2.2.10. Điều này có nghĩa là bạn không còn phải khai báo phiên bản KGP nữa và nếu bạn sử dụng phiên bản KGP thấp hơn 2.2.10, Gradle sẽ tự động nâng cấp phiên bản KGP của bạn lên 2.2.10. Tương tự, nếu bạn sử dụng phiên bản KSP thấp hơn 2.2.10-2.0.2, thì AGP sẽ nâng cấp phiên bản đó lên 2.2.10-2.0.2 để khớp với phiên bản KGP.
Nâng cấp lên phiên bản KGP cao hơn
Để sử dụng phiên bản KGP hoặc KSP cao hơn, hãy thêm nội dung sau vào tệp bản dựng cấp cao nhất:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Hạ cấp xuống phiên bản KGP thấp hơn
Bạn chỉ có thể hạ cấp phiên bản KGP nếu đã chọn không sử dụng Kotlin tích hợp sẵn. Điều này là do AGP 9.0 bật Kotlin tích hợp theo mặc định và Kotlin tích hợp yêu cầu KGP 2.2.10 trở lên.
Để sử dụng phiên bản KGP hoặc KSP thấp hơn, hãy khai báo phiên bản đó trong tệp bản dựng cấp cao nhất bằng cách sử dụng nội dung khai báo phiên bản nghiêm ngặt:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Xin lưu ý rằng phiên bản KGP tối thiểu mà bạn có thể hạ cấp là 2.0.0.
Hỗ trợ IDE cho môi trường thử nghiệm cố định
AGP 9.0 hỗ trợ đầy đủ IDE Android Studio cho môi trường thử nghiệm cố định.
Trình bổ trợ thư viện hợp nhất
Trình bổ trợ thư viện hợp nhất (Bản xem trước) cho phép bạn phát hành nhiều thư viện dưới dạng một tệp AAR thư viện Android duy nhất. Điều này có thể giúp người dùng dễ dàng dựa vào cấu phần phần mềm đã xuất bản của bạn.
Để biết thông tin về cách bắt đầu, hãy xem bài viết Phát hành nhiều thư viện Android dưới dạng một thư viện bằng Thư viện hợp nhất.
Thay đổi về hành vi
Trình bổ trợ Android cho Gradle 9.0 có các hành vi mới sau:
| Hành vi | Nội dung đề xuất |
|---|---|
Trình bổ trợ Android cho Gradle 9.0 sử dụng phiên bản NDK r28c theo mặc định.
|
Hãy cân nhắc việc chỉ định rõ phiên bản NDK mà bạn muốn sử dụng. |
| Theo mặc định, trình bổ trợ Android cho Gradle 9.0 yêu cầu người dùng của một thư viện phải sử dụng phiên bản SDK biên dịch tương tự hoặc cao hơn. |
Sử dụng SDK biên dịch tương tự hoặc cao hơn khi sử dụng một thư viện.
Nếu không thể thực hiện việc này hoặc bạn muốn cho người dùng thư viện mà bạn xuất bản thêm thời gian để chuyển đổi, hãy đặt AarMetadata.minCompileSdk một cách rõ ràng.
|
AGP 9.0 có các bản cập nhật cho chế độ mặc định của các thuộc tính Gradle sau đây. Điều này giúp bạn có thể chọn giữ nguyên hành vi AGP 8.13 khi nâng cấp:
| Thuộc tính | Chức năng | Thay đổi từ AGP 8.13 sang AGP 9.0 | Nội dung đề xuất |
|---|---|---|---|
android. |
Sử dụng giao diện DSL mới mà không hiển thị các cách triển khai cũ của khối android.Điều này cũng có nghĩa là bạn không thể truy cập vào API biến thể cũ, chẳng hạn như android.applicationVariants
nữa.
|
false → true |
Bạn có thể chọn không sử dụng bằng cách đặt android.newDsl=false.Sau khi tất cả trình bổ trợ và logic bản dựng mà dự án của bạn sử dụng đều tương thích, hãy xoá lựa chọn không sử dụng. |
android. |
Bật Kotlin tích hợp sẵn | false → true |
Di chuyển sang Kotlin tích hợp sẵn nếu có thể hoặc chọn không sử dụng. |
android. |
Thực thi việc mỗi thư viện có một tên gói riêng biệt. | false → true |
Chỉ định tên gói riêng biệt cho tất cả thư viện trong dự án của bạn. Nếu không thể, bạn có thể tắt cờ này trong khi di chuyển. |
android. |
Sử dụng các phần phụ thuộc androidx theo mặc định.
|
false → true |
Sử dụng các phần phụ thuộc androidx.
|
android. |
Chạy kiểm thử trên thiết bị bằng lớp androidx.test.runner.AndroidJUnitRunner theo mặc định, thay thế lớp mặc định của InstrumentationTestRunner không dùng nữa cho
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Sử dụng AndroidJUnitRunner hoặc chỉ định rõ ràng testInstrumentationRunner tuỳ chỉnh.
|
android. |
Kiểm soát việc sử dụng các quy tắc ràng buộc về phần phụ thuộc giữa các cấu hình. Theo mặc định, AGP 9.0 là false, chỉ sử dụng các quy tắc ràng buộc trong kiểm thử thiết bị ứng dụng (AndroidTest).
Nếu bạn đặt giá trị này thành true, thì hệ thống sẽ quay lại hành vi của phiên bản 8.13.
|
true → false |
Không sử dụng các quy tắc ràng buộc về phần phụ thuộc ở mọi nơi trừ phi bạn cần. Việc chấp nhận giá trị mặc định mới của cờ này cũng cho phép tối ưu hoá trong quy trình nhập dự án. Điều này sẽ giúp giảm thời gian nhập cho các bản dựng có nhiều dự án con trong thư viện Android. |
android. |
Biên dịch mã trong các ứng dụng dựa trên một lớp R không phải là lớp cuối cùng, giúp việc biên dịch ứng dụng phù hợp với việc biên dịch thư viện. Điều này giúp cải thiện tính gia tăng và mở đường cho việc tối ưu hoá hiệu suất trong tương lai cho quy trình xử lý tài nguyên. |
false → true |
Nhiều dự án có thể áp dụng hành vi mới mà không cần thay đổi nguồn. Nếu các trường lớp R được sử dụng ở bất cứ nơi nào yêu cầu hằng số, chẳng hạn như trường hợp chuyển đổi, hãy cải tiến để sử dụng các câu lệnh if theo chuỗi. |
android. |
Sử dụng phiên bản SDK biên dịch làm giá trị mặc định cho phiên bản SDK mục tiêu trong các ứng dụng và bài kiểm thử. Trước thay đổi này, phiên bản SDK mục tiêu sẽ mặc định là phiên bản SDK tối thiểu. |
false → true |
Chỉ định rõ phiên bản SDK mục tiêu cho các ứng dụng và bài kiểm thử. |
android. |
Chỉ tạo các thành phần kiểm thử đơn vị cho loại bản dựng được kiểm thử. Trong dự án mặc định, việc này dẫn đến một kiểm thử đơn vị duy nhất để gỡ lỗi, trong đó hành vi trước đó là chạy kiểm thử đơn vị để gỡ lỗi hoặc phát hành. |
false → true |
Nếu dự án của bạn không yêu cầu chạy kiểm thử cho cả bản gỡ lỗi và bản phát hành, thì bạn không cần thay đổi gì. |
android. |
Không tạo được bản dựng và báo lỗi nếu bất kỳ tệp giữ lại nào được chỉ định trong AGP DSL không tồn tại trên ổ đĩa. Trước khi có thay đổi này, lỗi chính tả trong tên tệp sẽ khiến tệp bị bỏ qua mà không có thông báo. | false → true |
Xoá mọi nội dung khai báo tệp proguard không hợp lệ |
android. |
Cho phép R8 giữ lại ít tài nguyên Android hơn bằng cách xem xét các lớp và tài nguyên Android cùng nhau. | false → true |
Nếu các quy tắc giữ lại của dự án đã hoàn tất, bạn không cần thay đổi gì. |
android. |
Cho phép R8 giữ lại ít hơn bằng cách không ngầm giữ lại hàm khởi tạo mặc định khi một lớp được giữ lại.
Tức là -keep class A không còn ngụ ý
-keep class A { <init>(); }nữa |
false → true |
Nếu các quy tắc giữ lại của dự án đã hoàn tất, bạn không cần thay đổi gì.
Thay thế -keep class A
bằng
-keep class A { <init>(); }
trong quy tắc giữ lại của dự án cho mọi trường hợp bạn cần giữ lại hàm khởi tạo mặc định.
|
android. |
Bật resValues trong tất cả các dự án con
|
true → false |
Chỉ bật resValues trong những dự án con cần đến bằng cách đặt giá trị sau trong tệp bản dựng Gradle của các dự án đó:
android {
buildFeatures {
resValues = true
}
} |
android. |
Cho phép biên dịch chương trình đổ bóng trong tất cả các dự án con | true → false |
Chỉ bật tính năng biên dịch chương trình đổ bóng trong các dự án con chứa chương trình đổ bóng cần biên dịch bằng cách đặt các giá trị sau trong tệp bản dựng Gradle của các dự án đó:
android {
buildFeatures {
shaders = true
}
} |
android. |
Trong AGP 9.0, getDefaultProguardFile() sẽ chỉ hỗ trợ proguard-android-optimize.txt thay vì proguard-android.txt. Việc này nhằm ngăn chặn việc vô tình sử dụng cờ dontoptimize có trong proguard-android.txt.
|
false → true |
Bạn có thể chỉ định rõ ràng dontoptimize trong proguardFile tuỳ chỉnh nếu muốn tránh tối ưu hoá, cùng với việc sử dụng proguard-android-optimize.txt. Hãy nhớ xoá cờ dontoptimize khỏi tệp này nếu có thể, vì cờ này làm giảm lợi ích tối ưu hoá của R8. Nếu không, hãy chọn không sử dụng bằng cách đặt android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
Kể từ AGP 9.0, việc phát hành mô-đun tính năng và thư viện Android sẽ không thành công nếu tệp lưu giữ của người dùng chứa cấu hình Proguard có vấn đề. Bạn chỉ nên sử dụng các tệp lưu giữ của người dùng có chứa các tuỳ chọn chung như dontoptimize hoặc dontobfuscate trong các mô-đun ứng dụng. Các tệp này có thể làm giảm lợi ích tối ưu hoá cho người dùng thư viện. Quá trình biên dịch mô-đun ứng dụng Android sẽ tự động bỏ qua mọi tuỳ chọn chung như vậy nếu được nhúng trong một phần phụ thuộc được biên dịch trước (JAR hoặc AAR). Bạn có thể biết thời điểm xảy ra lỗi này bằng cách kiểm tra tệp configuration.txt (thường nằm trong đường dẫn như <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) để xem các nhận xét như: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
Thư viện đã xuất bản nên xoá mọi quy tắc không tương thích. Thay vào đó, các thư viện nội bộ nên di chuyển mọi quy tắc không tương thích nhưng bắt buộc sang một proguardFile trong mô-đun ứng dụng. Chọn không sử dụng bằng cách đặt android.r8.globalOptionsInConsumerRules.disallowed=false. Sau khi tất cả tệp Keep của người dùng đều tương thích, hãy xoá lựa chọn không sử dụng.
|
android. |
Không cho phép truyền nhà cung cấp cho các nguồn được tạo bằng DSL AndroidSourceSet.
|
false → true |
Sử dụng API Sources trên androidComponents để đăng ký các nguồn đã tạo.
|
android. |
Yêu cầu đặt rõ ràng đường dẫn trình biên dịch chương trình đổ bóng trong local.properties nếu bạn bật tính năng biên dịch chương trình đổ bóng.
|
false → true |
Thêm glslc.dir=/path/to/shader-tools vào local.properties của dự án.
|
Các tính năng đã bị xoá
Trình bổ trợ Android cho Gradle 9.0 sẽ xoá các chức năng sau:
- Hỗ trợ ứng dụng Wear OS được nhúng
AGP 9.0 loại bỏ tính năng hỗ trợ nhúng ứng dụng Wear OS, vốn không còn được hỗ trợ trong Play. Việc này bao gồm cả việc xoá cấu hìnhwearAppvàAndroidSourceSet.wearAppConfigurationNameDSL. Hãy xem phần Phân phối cho Wear OS để biết cách phát hành ứng dụng cho Wear OS. androidDependenciesvàsourceSetsbáo cáo việc cần làm- Hỗ trợ APK phân tách theo mật độ
AGP 9.0 không còn hỗ trợ việc tạo APK phân tách dựa trên mật độ màn hình. Chức năng và các API liên quan đã bị xoá. Để phân tách APK phân tách dựa trên mật độ màn hình bằng AGP 9.0 trở lên, hãy sử dụng gói ứng dụng.
DSL đã thay đổi
Trình bổ trợ Android cho Gradle 9.0 có những thay đổi có thể gây lỗi sau đây về DSL:
Tham số hoá của
CommonExtensionđã bị xoá.Bản thân thay đổi này chỉ là một thay đổi có thể gây lỗi ở cấp nguồn để giúp tránh các thay đổi có thể gây lỗi ở cấp nguồn trong tương lai, nhưng điều này cũng có nghĩa là các phương thức chặn cần chuyển từ
CommonExtensionsangApplicationExtension,LibraryExtension,DynamicFeatureExtensionvàTestExtension.Khi nâng cấp dự án lên AGP 9.0, hãy tái cấu trúc mã trình bổ trợ Gradle sử dụng các tham số đó hoặc các phương thức khối. Ví dụ: trình bổ trợ sau đây được cập nhật để xoá tham số loại và không dựa vào các phương thức khối đã bị xoá:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Đối với các trình bổ trợ nhắm đến một loạt phiên bản AGP, việc sử dụng trực tiếp phương thức getter sẽ tương thích nhị phân với các phiên bản AGP thấp hơn 9.0.
Đã xóa DSL
Trình bổ trợ Android cho Gradle 9.0 sẽ xoá:
AndroidSourceSet.jni, vì không hoạt động.AndroidSourceSet.wearAppConfigurationName, vì liên quan đến việc ngừng hỗ trợ ứng dụng Wear OS được nhúng.BuildType.isRenderscriptDebuggable, vì không hoạt động.DependencyVariantSelection. Tính năng này được thay thế bằngDependencySelection, được hiển thị dưới dạngkotlin.android.localDependencySelectionInstallation.installOptions(String). Tính năng này được thay thế bằng thuộc tính có thể thay đổi củaInstallation.installOptions.Khối
PostProcessingthử nghiệm nhưng chưa bao giờ ổn định.ProductFlavor.setDimension, được thay thế bằng thuộc tínhdimensionLanguageSplitOptions, chỉ hữu ích cho Google Play Instant, hiện không còn được dùng nữa.DensitySplit, vì tính năng này không còn được hỗ trợ. Thay vào đó, hãy sử dụng Gói ứng dụng.
API đã bị xoá
Trình bổ trợ Android cho Gradle 9.0 sẽ xoá:
AndroidComponentsExtension.finalizeDSl. Tính năng này được thay thế bằngfinalizeDslComponent.transformClassesWith. Tính năng này được thay thế bằngInstrumentation.transformClassesWithComponent.setAsmFramesComputationMode. Tính năng này được thay thế bằngInstrumentation.setAsmFramesComputationModeComponentBuilder.enabled. Tính năng này được thay thế bằngComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Tính năng này được thay thế bằngincludeInApkDependenciesInfoBuilder.includedInBundle. Tính năng này được thay thế bằngincludeInBundleGeneratesApk.targetSdkVersion. Tính năng này được thay thế bằngtargetSdkVariant.minSdkVersion. Tính năng này được thay thế bằngminSdkVariant.maxSdkVersion. Tính năng này được thay thế bằngmaxSdkVariant.targetSdkVersion. Tính năng này được thay thế bằngtargetSdkVariant.unitTest, vì không áp dụng cho trình bổ trợcom.android.test.unitTestcó sẵn trên các loại phụVariantBuildermở rộngHasUnitTest.VariantBuilder.targetSdkvàtargetSdkPreview, vì chúng không có ý nghĩa trong thư viện. Thay vào đó, hãy sử dụngGeneratesApkBuilder.targetSdkhoặcGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, vì không áp dụng cho trình bổ trợcom.android.test.enableUnitTestcó sẵn trên các loại phụVariantBuildermở rộngHasUnitTestBuilder.VariantBuilder.unitTestEnabledbị xoá để thay thế bằngenableUnitTestcó tên nhất quán hơn trên các loại phụVariantBuildermở rộngHasUnitTestBuilder.VariantOutput.enable. Tính năng này được thay thế bằngenabledFeaturePluginvàFeatureExtensionkhông còn được dùng nữa và đã bị vô hiệu hoá.Các API
BaseExtension.registerTransformkhông dùng nữa và bị vô hiệu hoá, chỉ còn lại để cho phép biên dịch dựa trên phiên bản AGP mới nhất trong khi nhắm đến việc chạy trên AGP 4.2 trở xuống.
Các thuộc tính Gradle đã bị xoá
Ban đầu, các thuộc tính Gradle sau đây được thêm vào dưới dạng các cách để tắt trên toàn hệ thống các tính năng được bật theo mặc định.
Theo mặc định, các tính năng này đã bị tắt kể từ AGP 8.0 trở xuống. Chỉ bật các tính năng này trong những dự án con sử dụng chúng để tạo bản dựng hiệu quả hơn.
| Thuộc tính | Chức năng | Thay thế |
|---|---|---|
android. |
Cho phép biên dịch AIDL trong tất cả các dự án con |
Chỉ cho phép biên dịch AIDL trong các dự án con có nguồn AIDL bằng cách đặt thuộc tính sau trong tệp bản dựng Gradle của các dự án đó:
android {
buildFeatures {
aidl = true
}
} |
android. |
Cho phép biên dịch RenderScript trong tất cả các dự án con |
Chỉ cho phép biên dịch renderscript trong các dự án con có nguồn renderscript bằng cách đặt thuộc tính sau trong tệp bản dựng Gradle của các dự án đó:
android {
buildFeatures {
renderScript = true
}
} |
Thuộc tính Gradle bắt buộc
AGP 9.0 sẽ báo lỗi nếu bạn đặt các thuộc tính Gradle sau đây.
Trợ lý nâng cấp trình bổ trợ Android cho Gradle sẽ không nâng cấp các dự án sử dụng những thuộc tính này lên AGP 9.0.
| Thuộc tính | Chức năng |
|---|---|
android. |
Giờ đây, quá trình rút gọn tài nguyên luôn được chạy trong R8, chúng tôi đã xoá chế độ triển khai trước đó. |
android. |
Giờ đây, quá trình rút gọn tài nguyên luôn sử dụng tính năng rút gọn tài nguyên chính xác, cho phép xoá nhiều tài nguyên hơn. |
Thay đổi về R8
AGP 9.0.0 có các thay đổi sau đây đối với R8.
Lựa chọn cấu hình mới -processkotlinnullchecks
Chúng tôi đã thêm tuỳ chọn R8 mới -processkotlinnullchecks để định cấu hình R8 cho
việc xử lý các quy trình kiểm tra giá trị rỗng của Kotlin. Tuỳ chọn này nhận một đối số bắt buộc phải là một trong ba giá trị sau: keep, remove_message và remove.
Tuỳ chọn này xử lý các quy trình kiểm tra rỗng sau đây do trình biên dịch Kotlin thêm vào:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Các giá trị của tuỳ chọn, được sắp xếp từ yếu nhất đến mạnh nhất, có hiệu lực như sau:
keepkhông thay đổi các bước kiểm tra.remove_messageviết lại mỗi lệnh gọi phương thức kiểm tra thành một lệnh gọi đếngetClass()trên đối số đầu tiên của lệnh gọi (giữ lại quy trình kiểm tra rỗng một cách hiệu quả nhưng không có thông báo nào).removesẽ xoá hoàn toàn các bước kiểm tra.
Theo mặc định, R8 sử dụng remove_message. Mọi thông số kỹ thuật của -processkotlinnullchecks sẽ ghi đè thông số đó. Nếu bạn chỉ định nhiều lần, giá trị mạnh nhất sẽ được sử dụng.
Ngừng truyền thông tin giữ lại cho các phương thức đồng hành
Khi các quy tắc giữ lại khớp với các phương thức giao diện phải trải qua quá trình đơn giản hoá, R8 trước đây đã chuyển nội bộ các bit không cho phép tối ưu hoá và không cho phép thu hẹp sang các phương thức đồng hành được tổng hợp.
Kể từ AGP 9.0, các quy tắc giữ lại không còn áp dụng cho các phương thức đồng hành. Điều này phù hợp với thực tế là các quy tắc giữ lại không áp dụng cho các trường/phương thức/lớp khác do trình biên dịch tổng hợp.
Bằng cách chuyển các bit disallow optimization (không cho phép tối ưu hoá) và disallow shrinking (không cho phép rút gọn) sang các phương thức đồng hành, trường hợp sử dụng sau đây đã được hỗ trợ trước đó:
- Biên dịch thư viện có các phương thức giao diện
default/static/privatethành DEX cóminSdk< 24 và các quy tắc giữ lại các phương thức giao diện. - Biên dịch ứng dụng bằng thư viện trên classpath và
-applymapping. - Hợp nhất ứng dụng và thư viện.
Xin lưu ý rằng việc này chỉ hoạt động với -applymapping vì bit disallow
obfuscation không được chuyển sang các phương thức đồng hành, tức là các lớp đồng hành được tạo từ bước 1 sẽ có tên phương thức bị làm rối mã nguồn.
Trong tương lai, trường hợp sử dụng này sẽ không còn được hỗ trợ cho minSdk <
24. Cách giải quyết là làm như sau:
- Khử糖 thư viện bằng các phương thức giao diện
default/static/privatecho các tệp lớp cóminSdk< 24. - Biên dịch cấu phần phần mềm đã đơn giản hoá bằng R8 và các quy tắc giữ lại phương thức giao diện trên các lớp đồng hành.
- Biên dịch ứng dụng bằng thư viện trên classpath.
- Hợp nhất ứng dụng và cấu phần mềm đã đơn giản hoá cú pháp.
Một tác dụng phụ khác của việc này là không thể giữ lại các thuộc tính của lớp bên trong và phương thức bao quanh cho các lớp ẩn danh và cục bộ bên trong các phương thức đồng hành của giao diện.
Thay đổi tệp nguồn được phát ra mặc định thành r8-map-id-<MAP_ID>
Thay đổi này có trong AGP kể từ phiên bản 8.12.0.
Thuộc tính tệp nguồn được phát ra mặc định cho một lớp sẽ thay đổi từ
SourceFile thành r8-map-id-<MAP_ID> khi cần truy xuất lại (tức là
khi bật tính năng làm rối mã nguồn hoặc tối ưu hoá).
Khi có dấu vết ngăn xếp bị làm rối mã nguồn, thuộc tính tệp nguồn mới cho phép trích xuất mã nhận dạng của tệp ánh xạ cần thiết cho việc truy vết. Mã nhận dạng này có thể được dùng để hỗ trợ tự động truy vết dấu vết ngăn xếp trong Logcat.
Nếu bạn sử dụng thuộc tính tệp nguồn tuỳ chỉnh (-renamesourcefileattribute),
thì thuộc tính tệp nguồn tuỳ chỉnh này sẽ tiếp tục được ưu tiên.
Ở chế độ tương thích với ProGuard (khi gradle.properties chứa android.enableR8.fullMode=false), việc phát ra thuộc tính tệp nguồn của r8-map-id-<MAP_ID> chỉ có hiệu lực nếu thuộc tính SourceFile không được giữ lại. Những ứng dụng sử dụng chế độ tương thích ProGuard và muốn đưa mã nhận dạng tệp ánh xạ vào dấu vết ngăn xếp nên xoá -keepattributes SourceFile (hoặc di chuyển sang chế độ đầy đủ R8).
Mã bản đồ được dùng trong r8-map-id-<MAP_ID> là hàm băm bản đồ đầy đủ, chứ không phải tiền tố gồm 7 ký tự của hàm băm bản đồ đã được dùng trước đó.
Cho phép sử dụng tên tổng hợp được thu nhỏ trong quá trình đơn giản hoá cú pháp L8
Tên của các lớp tổng hợp do D8 tạo thường chứa chuỗi con $$ExternalSynthetic cho biết đây là lớp tổng hợp do D8 tạo.
Hơn nữa, tên của lớp tổng hợp cũng mã hoá loại lớp tổng hợp (ví dụ: Backport, Lambda). Điều này có tác động tiêu cực đến kích thước tệp DEX thu được, vì tên lớp chiếm nhiều không gian hơn trong vùng chứa chuỗi.
AGP 9.0 định cấu hình L8 (đơn giản hoá thư viện cốt lõi) để tệp DEX chứa tất cả các lớp j$ sử dụng định dạng tên lớp rút gọn mới cho các lớp tổng hợp. Tên lớp mới sử dụng mã nhận dạng dạng số (ví dụ: $1).
Xoá tính năng hỗ trợ dành cho -addconfigurationdebugging
AGP 9.0 ngừng hỗ trợ -addconfigurationdebugging. Trình biên dịch hiện báo cáo cảnh báo nếu cờ được sử dụng.
Xoá tính năng hỗ trợ tạo quy tắc L8 từ D8/R8
Thay đổi này chỉ liên quan đến những nhà phát triển trực tiếp sử dụng dòng lệnh hoặc API D8/R8.
R8 9.0 ngừng hỗ trợ việc tạo quy tắc giữ lại cho L8 từ D8 và R8.
Thay vào đó, bạn nên sử dụng TraceReferences cho mục đích này.
Cụ thể hơn, các phương thức
D8Command.builder.setDesugaredLibraryKeepRuleConsumer và
R8Command.Builder.setDesugaredLibraryKeepRuleConsumer sẽ bị xoá, đồng thời
khả năng hỗ trợ --desugared-lib-pg-conf-output cũng bị xoá khỏi các tuỳ chọn
dòng lệnh của D8 và R8.
Vấn đề đã khắc phục
Trình bổ trợ Android cho Gradle 9.0.0
| Vấn đề đã khắc phục | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Trình bổ trợ Android cho Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tìm lỗi mã nguồn |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tích hợp công cụ tìm lỗi mã nguồn |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Trình rút gọn (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||