Ghi chú phát hành cho bản xem trước trình bổ trợ Android cho Gradle

Trang này chứa ghi chú phát hành cho các bản phát hành dùng thử của trình bổ trợ Android cho Gradle (AGP).

Trình bổ trợ Android cho Gradle 9.0

Trình bổ trợ Android cho Gradle 9.0 là một bản phát hành chính mới của AGP, đồng thời 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 9.0.0-alpha05, hãy sử dụng Trợ lý nâng cấp trình bổ trợ Android cho Gradle trong Android Studio Narwhal 4 Feature Drop | 2025.1.4.

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 của bạn (nếu thích hợp), cho phép bạn nâng cấp dự án để sử dụng AGP 9.0, ngay cả khi bạn 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.

Khả năng tương thích

Cấp độ API Android tối đa mà trình bổ trợ Android cho Gradle 9.0.0-alpha05 hỗ trợ là cấp độ API 36.

Trình bổ trợ Android cho Gradle 9.0.0-alpha05 yêu cầu Gradle 9.0.0.

Phiên bản tối thiểu Phiên bản mặc định Lưu ý
Gradle 9.0.0 9.0.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.

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 đã giới thiệu các giao diện mới cho DSL và API của mình để 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 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 để 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. Thay đổi 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ững việc sau:

  • Chuyển sang Kotlin tích hợp: Trình bổ trợ org.jetbrains.kotlin.android không tương thích với DSL mới.
  • Chuyển các dự án KMP sang Trình bổ trợ thư viện Android cho Gradle cho KMP: Việc sử dụng trình bổ trợ org.jetbrains.kotlin.multiplatform trong cùng một dự án con Gradle như trình bổ trợ com.android.librarycom.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 mục đích giữ cho DSL giống nhau nhất có thể, nhưng có thể sẽ 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 tham chiếu đến DSL nội bộ bằng các giao diện DSL công khai. Trong hầu hết các trường hợp, đây sẽ là một thay thế tương đương. Thay thế mọi hoạt động sử dụng applicationVariants và các API tương tự bằng API androidComponents mới. Điều này có thể phức tạp hơn vì API androidComponents được thiết kế để ổn định hơn nhằm duy trì khả năng tương thích của các trình bổ trợ lâu hơn. Hãy xem Công thức Gradle của chúng tôi để biết các ví dụ.

  • Cập nhật trình bổ trợ bên thứ ba: Một số trình bổ trợ 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 của những trình bổ trợ tương thích với AGP 9.0.

Nếu bạn cập nhật lên AGP 9.0 và thấy thông báo lỗi sau, thì có nghĩa là dự án của bạn vẫn đang tham chiếu 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à khôi phục các phương thức triển khai cũ cho DSL, cũng như API biến thể cũ. Trong quá trình 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

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 đã xuất hiện trong nhiều phiên bản AGP, vì vậy bạn có thể kết hợp giữa giao diện mới và cũ. Tài liệu tham khảo về API AGP cho biết giao diện API cho từng phiên bản AGP, cũng như thời điểm từng lớp, phương thức và trường được thêm vào.

Trong giai đoạn alpha 9.0, chúng tôi sẽ liên hệ với các tác giả trình bổ trợ để giúp họ điều chỉnh và phát hành các trình bổ trợ tương thích hoàn toàn với các chế độ mới, đồng thời cải thiện Trợ lý nâng cấp AGP trong Android Studio để hướng dẫn bạn trong quá trình di chuyển.

Nếu bạn nhận thấy DSL hoặc Variant API 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.

Được tích hợp sẵn trong Kotlin

Trình bổ trợ Android cho Gradle 9.0 có tính năng hỗ trợ tích hợp để biên dịch Kotlin, thay thế cho trình bổ trợ Kotlin được áp dụng riêng. Điều này giúp đơn giản hoá quy trình tích hợp 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.

Trình bổ trợ Android cho Gradle 9.0 có một phần phụ thuộc thời gian chạy trên trình bổ trợ Kotlin cho Gradle 2.2.10. Đây là phiên bản tối thiểu cần thiết để hỗ trợ Kotlin tích hợp.

Bạn có thể chọn không sử dụng Kotlin tích hợp bằng cách thiết lập android.builtInKotlin=false.

Nếu đã chọn không sử dụng Kotlin tích hợp và cũng cần dùng phiên bản cũ hơn của trình bổ trợ Kotlin cho Gradle, bạn có thể buộc hạ cấp:

buildscript {
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("2.0.0") } // or another version that you want to use
        }
    }
}

Thay đổi về hành vi

Trình bổ trợ Android cho Gradle 9.0 có những hành vi mới sau đây:

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õ ràng phiên bản NDK mà bạn muốn sử dụng.
Theo mặc định, trình bổ trợ Android 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 cùng một SDK biên dịch hoặc SDK biên dịch 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 nội dung cập nhật cho chế độ cài đặt mặc định của các thuộc tính Gradle sau đây. Nhờ đó, bạn có thể chọn giữ nguyên hành vi của 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 các giao diện DSL mới mà không cần hiển thị các quy trình 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.
falsetrue Bạn có thể chọn không tham gia bằng cách đặt android.newDsl=false.
Sau khi tất cả cá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 tham gia.
android.builtInKotlin Đã bật tính năng hỗ trợ biên dịch trực tiếp mã Kotlin trong trình bổ trợ Android cho Gradle mà không cần trình bổ trợ org.jetbrains.kotlin.android. falsetrue Áp dụng Kotlin tích hợp sẵn bằng cách xoá việc sử dụng trình bổ trợ org.jetbrains.kotlin.android nếu có thể. Nếu không, hãy chọn không tham gia bằng cách đặt android.builtInKotlin=false
android.uniquePackageNames Đảm bảo rằng mỗi thư viện có một tên gói riêng biệt. falsetrue Chỉ định tên gói riêng biệt cho tất cả cá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.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 điều kiện hạn chế 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.
truefalse Đừng sử dụng cá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.
aandroid.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 quá trình biên dịch ứng dụng phù hợp với quá trình biên dịch thư viện.
Điều này giúp cải thiện mức độ gia tăng và mở đường cho các hoạt động tối ưu hoá hiệu suất trong tương lai đối với quy trình xử lý tài nguyên.
falsetrue Nhiều dự án có thể chỉ cần áp dụng hành vi mới mà không cần thay đổi mã nguồn. Nếu các trường lớp R được dùng ở bất kỳ nơi nào yêu cầu một hằng số, chẳng hạn như các trường hợp chuyển đổi, hãy tái cấu trúc để dùng các câu lệnh if được liên kết.
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à 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.
falsetrue Chỉ định rõ ràng phiên bản SDK mục tiêu cho ứng dụng và các 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, thao tác này sẽ tạo ra một phương thức kiểm thử đơn vị duy nhất để gỡ lỗi, trong đó hành vi trước đây là chạy phương thức kiểm thử đơn vị để gỡ lỗi hoặc phát hành.
falsetrue Nếu dự án của bạn không yêu cầu chạy kiểm thử cho cả gỡ lỗi và 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à xảy ra lỗi nếu bất kỳ tệp 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 các tệp bị bỏ qua mà không có thông báo. falsetrue Xoá mọi khai báo tệp proguard không hợp lệ
android.r8.optimizedResourceShrinking Cho phép R8 lưu giữ í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. falsetrue Nếu quy tắc giữ lại của dự án đã hoàn tất, thì 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 giữ lại hàm khởi tạo mặc định một cách ngầm đị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
falsetrue Nếu quy tắc giữ lại của dự án đã hoàn tất, thì bạn không cần thay đổi gì.

Thay thế -keep class A bằng -keep class A { <init>(); } trong các 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 Cho phép resValues trong tất cả các dự án con truefalse Chỉ bật resValues trong những dự án con cần đến bằng cách đặt nội dung 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 truefalse Chỉ bật tính năng biên dịch chương trình đổ bóng trong các dự án con có chứa chương trình đổ bóng cần được biên dịch bằng cách thiết lập nội dung sau trong tệp bản dựng Gradle của các dự án đó:
android {
  buildFeatures {
    shaders = true
  }
}

Các tính năng đã bị xoá

Trình bổ trợ Android cho Gradle 9.0 sẽ loại bỏ chức năng sau:

Đã thay đổi DSL

Trình bổ trợ Android cho Gradle 9.0 có những thay đổi DSL có thể gây lỗi sau đây:

  • Đã xoá tham số hoá của CommonExtension.

    Bản thân thay đổi này chỉ là một thay đổi mang tính đột phá ở cấp nguồn để giúp tránh các thay đổi mang tính đột phá ở 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, LibraryExension, DynamicFeatureExtensionTestExtension.

    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 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 đã 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 dải phiên bản AGP, việc sử dụng trực tiếp phương thức getter tương thích nhị phân với các phiên bản AGP thấp hơn 9.0.

Đã xoá DSL

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

Đã xoá các thuộc tính Gradle

Ban đầu, các thuộc tính Gradle sau đây được thêm vào để tắt các tính năng được bật theo mặc định trên toàn cầu.

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 phụ 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ỉ bật quá trình biên dịch AIDL trong các dự án con có nguồn AIDL bằng cách thiết lập 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 con chứa các 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ỉ bật quá trình biên dịch renderscript trong các dự án con có nguồn renderscript bằng cách thiết lập thuộc tính sau trong tệp bản dựng Gradle của các dự án đó:
android {
  buildFeatures {
    renderScript = true
  }
}

Các API đã bị xoá

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

  • Các API BaseExtension.registerTransform đã ngừng hoạt động 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.

  • FeaturePluginFeatureExtension đã ngừng hoạt động và bị vô hiệu hoá.

Các thuộc tính Gradle bắt buộc

AGP 9.0 sẽ phát sinh 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 lên AGP 9.0 sử dụng những thuộc tính này.

Thuộc tính Chức năng
android.r8.integratedResourceShrinking Giờ đây, quá trình giảm kích thước tài nguyên luôn được chạy trong R8, chúng tôi đã xoá chế độ triển khai trước đó.