Trình bổ trợ Android cho Gradle 9.0.1 (tháng 1 năm 2026)

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.android khô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.multiplatform trong cùng một dự án con Gradle với trình bổ trợ com.android.library và com.android.application khô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 applicationVariants và các API tương tự bằng androidComponents API mới. Việc này có thể phức tạp hơn vì API androidComponents đượ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)
    }
}
Có thể không có API thay thế trực tiếp cho tất cả API trước đó. Gửi vấn đề nếu có trường hợp sử dụng không thuộc phạm vi của API biến thể mới.
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.newDsl 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.builtInKotlin 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.uniquePackageNames 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.useAndroidx 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.default.androidx.test.runner 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.dependency.useConstraints 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.enableAppCompileTimeRClass 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.sdk.defaultTargetSdkToCompileSdkIfUnset 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.onlyEnableUnitTestForTheTestedBuildType 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.proguard.failOnMissingFiles 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.r8.optimizedResourceShrinking 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.r8.strictFullModeForKeepRules 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.defaults.buildfeatures.resvalues 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.defaults.buildfeatures.shaders 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.r8.proguardAndroidTxt.disallowed 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.r8.globalOptionsInConsumerRules.disallowed 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.sourceset.disallowProvider 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.custom.shader.path.required 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ình wearApp và AndroidSourceSet.wearAppConfigurationName DSL. 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.
  • androidDependencies và sourceSets bá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ừ CommonExtension sang ApplicationExtension, LibraryExtension, DynamicFeatureExtension và 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á:

API đã bị xoá

Trình bổ trợ Android cho Gradle 9.0 sẽ xoá:

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.defaults.buildfeatures.aidl 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
  }
}
trong tệp bản dựng Gradle của mỗi dự án phụ chứa nguồn AIDL
android.defaults.buildfeatures.renderscript 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.r8.integratedResourceShrinking 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.enableNewResourceShrinker.preciseShrinking 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:

  • keep không thay đổi các bước kiểm tra.
  • remove_message viết lại mỗi lệnh gọi phương thức kiểm tra thành một lệnh gọi đến getClass() 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).
  • remove sẽ 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 đó:

  1. Biên dịch thư viện có các phương thức giao diện default/static/private thành DEX có minSdk < 24 và các quy tắc giữ lại các phương thức giao diện.
  2. Biên dịch ứng dụng bằng thư viện trên classpath và -applymapping.
  3. 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:

  1. Khử糖 thư viện bằng các phương thức giao diện default/static/private cho các tệp lớp có minSdk < 24.
  2. 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.
  3. Biên dịch ứng dụng bằng thư viện trên classpath.
  4. 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
Yêu cầu về tính năng: Chèn phiên bản AGP lý tưởng dưới dạng một thuộc tính
Ổn định SingleArtifact.VERSION_CONTROL_INFO_FILE
Kết quả logcat của androidTest connectedCheck bị hỏng
Tính năng hỗ trợ Kotlin tích hợp sẵn trong AGP không được đồng bộ hoá với các nhóm tài nguyên Kotlin
missingDimensionStrategy ưu tiên một phiên bản khớp với tên của chính phiên bản đó, ngay cả khi phiên bản đó thuộc một phương diện không liên quan
Tính năng hỗ trợ Kotlin tích hợp sẵn trong AGP không được đồng bộ hoá với các nhóm tài nguyên Kotlin
AGP 9.0.0-rc01 không phân giải thư viện Kotlin thông qua hàm kotlin()
Built-in-kotlin không phát hành quy tắc ràng buộc phần phụ thuộc kotlin-stdlib trong maven pom
Thêm trường hợp kiểm thử cho sự khác biệt giữa compileSdk và targetSdk
giá trị resConfigs trống dẫn đến lỗi aapt khó hiểu
Dự án Java thuần tuý có phần phụ thuộc vào kotlin stdlib.
Xoá các thuộc tính KotlinMultiplatformAndroidCompilationBuilder không dùng nữa trong AGP 9.0
`com.android.tools.build:gradle:9.0.0-alpha05` phải có phần phụ thuộc API trên KGP và gradle-api
Đổi tên trình bổ trợ Gradle com.android.experimental.built-in-kotlin
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` không hoạt động
Quá trình kiểm tra siêu dữ liệu Aar trên SDK biên dịch sử dụng DSL cũ
Xoá thuộc tính `com.android.build.api.dsl.ManagedDevices.devices` không dùng nữa
Tính năng hỗ trợ Kotlin tích hợp sẵn trong AGP không được đồng bộ hoá với các nhóm tài nguyên Kotlin
Không phát hành được thư viện Android nếu tệp lưu giữ của người dùng chứa -dontobfuscate
Không có lựa chọn nào để in thông tin liên kết cho tài nguyên được tối ưu hoá
Báo lỗi khi gọi finalizeDsl sau khi giai đoạn này đã qua
AGP khởi chạy cấu hình jetifier ngay cả khi jetifier bị tắt
Kotlin tích hợp sẵn không thêm kotlinStdlib làm phần phụ thuộc thời gian biên dịch khi `kotlin.stdlib.default.dependency` là true cho các tệp mô-đun và pom
DSL tối ưu hoá mới không tạo tệp configuration.txt theo mặc định
AGP 8.13.0 không xác minh được biểu đồ điều hướng trong một mô-đun
AGP sử dụng API Gradle không dùng nữa: ký hiệu nhiều chuỗi
Cảnh báo người dùng đang cố gắng sử dụng thư viện multidex cũ có minSdkVersion >=21
Bản dựng không thành công nếu có các tác vụ tạo mã
Với `android.builtInKotlin=false` và `android.newDsl=false` và `android.enableLegacyVariantApi=false`, việc sử dụng trình bổ trợ `kotlin-android` sẽ gặp lỗi "API 'applicationVariants' đã lỗi thời"
Kotlin tích hợp sẵn không phân giải được kotlin-stdlib chưa được tạo phiên bản khi kotlin.stdlib.default.dependency=false
DexData mở một tệp mà không đóng, ngăn việc dọn dẹp
AndroidSourceDirectorySet sẽ ngừng mở rộng PatternFilterable trong AGP 9.0
Lỗi cấu hình kiểm thử trong các mô-đun chỉ kiểm thử
Lỗi không chính xác khi sử dụng trình nhận ngữ cảnh trong cấu hình kiểm thử
Lỗi IDE không chính xác cho mã Kotlin trong testFixtures
Trình bổ trợ `legacy-kapt` bỏ qua quá trình xử lý chú thích, không giống như `kotlin-kapt`
compileSdkSpec.minorApiLevel không hoạt động với SettingsExtension
[fused lib - public] Generated fused library does not include sources
extractNativeLibs và useEmbeddedDex không được lấy từ tệp kê khai
Cảnh báo từ R8 trong AGP 9.0.0-alpha09
Xoá AndroidSourceSet.jni không dùng nữa trong AGP 9.0
Xoá Installation.installOptions() trong AGP 9.0
Xoá BuildType.isRenderscriptDebuggable trong AGP 9.0.
Xoá android.defaults.buildfeatures.renderscript
`com.android.kotlin.multiplatform.library` gặp sự cố với Thiết bị do Gradle quản lý
Xoá cờ gradle.properties mặc định `android.defaults.buildfeatures.aidl`
Không tạo được bản dựng khi không có tệp ProGuard
xoá cờ gradle.properties mặc định của buildconfig
Thay đổi giá trị mặc định targetSdk của ứng dụng dựa trên compileSdk thay vì minSdk
Khi bật `isIncludeAndroidResources`, `process{Variant}UnitTestManifest` không hợp nhất được các cách sử dụng tools:overrideLibrary trong AGP 8.12.0
AGP gây ra cảnh báo ngừng sử dụng trong Gradle cho các tác vụ kiểm thử JVM
DependencyReportTask không tương thích với bộ nhớ đệm cấu hình
Chuyển phiên bản Java nguồn/đích mặc định từ Java 8 sang Java 11 trong AGP 9.0
Chuyển giá trị mặc định của android.useAndroidX thành true
Ngoại lệ tốt hơn khi áp dụng trình bổ trợ kapt với Kotlin tích hợp sẵn.
android.proguard.failOnMissingFiles không hoạt động cho consumerProguardFiles
Cập nhật phần phụ thuộc của trình bổ trợ Kotlin cho Gradle lên 2.2.10
Tạo KotlinJvmAndroidCompilation bằng API KGP
Chế độ API rõ ràng của Kotlin được áp dụng cho các nguồn kiểm thử
Tìm lỗi mã nguồn
AGP 8.11.0: tác vụ lintAnalyzeRelease gặp sự cố khi áp dụng các tệp .gradle.kts bằng apply(from = "...")
Kiểm tra tìm lỗi mã nguồn SdkIntAtLeast không kiểm tra xem giá trị được chú thích có chính xác hay không
Kotlin tích hợp sẵn không thêm .kotlin_module vào META-INF
Classpath của Lint chứa các lớp trùng lặp ở các phiên bản khác nhau
Giải pháp tạm thời ghi đè tài nguyên riêng tư không hoạt động (tools:override = "true")
Lỗi: việc xoá tài nguyên không dùng đến cũng không xoá bản dịch của các tài nguyên đó và cũng không hỏi về việc này
Tìm lỗi mã nguồn đưa ra cảnh báo "Không thể dọn dẹp bộ nhớ đệm K2"
Tìm lỗi mã nguồn đưa ra cảnh báo "Không thể dọn dẹp bộ nhớ đệm K2"
Tích hợp công cụ tìm lỗi mã nguồn
AndroidLintAnalysisTask bị thiếu bộ nhớ đệm trên nhiều nhà cung cấp JDK hoặc phiên bản nhỏ do sự khác biệt về systemPropertyInputs.javaVersion
Công cụ tìm lỗi mã nguồn tự động sử dụng SDK mới nhất được cài đặt bất kể compileSdk, không đăng ký làm dữ liệu đầu vào của tác vụ và làm hỏng bộ nhớ đệm
Trình rút gọn (R8)
Tính năng rút gọn tài nguyên được tối ưu hoá của R8 sẽ tự động không hoạt động nếu sử dụng mã nhận dạng tài nguyên cuối cùng