Trình bổ trợ Android cho Gradle 8.1.0 (tháng 7 năm 2023)

Trình bổ trợ Android cho Gradle 8.1.0 là một bản phát hành chính bao gồm nhiều tính năng và điểm cải thiện mới.

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 8.0 8.0 Để tìm hiểu thêm, hãy xem phần cập nhật Gradle.
Công cụ tạo SDK 33.0.1 33.0.1 Cài đặt hoặc định cấu hình Công cụ tạo SDK.
NDK Không áp dụng 25.1.8937393 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.

Kotlin DSL là cấu hình mặc định cho bản dựng

Theo mặc định, các dự án mới hiện sử dụng Kotlin DSL (build.gradle.kts) cho cấu hình bản dựng. Điều này mang lại trải nghiệm chỉnh sửa tốt hơn so với Groovy DSL (build.gradle) nhờ tính năng làm nổi bật cú pháp, hoàn tất mã và điều hướng đến phần khai báo. Xin lưu ý rằng nếu đang sử dụng AGP 8.1 và DSL Kotlin cho cấu hình bản dựng, bạn nên sử dụng Gradle 8.1 để có trải nghiệm tốt nhất. Để tìm hiểu thêm, hãy xem hướng dẫn di chuyển DSL Kotlin.

Tự động hỗ trợ ngôn ngữ cho mỗi ứng dụng

Kể từ Android Studio Giraffe Canary 7 và AGP 8.1.0-alpha07, bạn có thể định cấu hình ứng dụng để tự động hỗ trợ các lựa chọn ưu tiên về ngôn ngữ cho mỗi ứng dụng. Dựa trên tài nguyên của dự án, trình bổ trợ Android cho Gradle sẽ tạo tệp LocaleConfig và thêm mục tham chiếu đến tệp đó trong tệp kê khai cuối cùng, do đó, bạn không còn phải tạo hoặc cập nhật tệp theo cách thủ công nữa. AGP sẽ sử dụng các tài nguyên trong thư mục res của mô-đun ứng dụng và mọi phần phụ thuộc của mô-đun thư viện để xác định ngôn ngữ cần đưa vào tệp LocaleConfig.

Xin lưu ý rằng tính năng ngôn ngữ tự động cho mỗi ứng dụng hỗ trợ các ứng dụng chạy Android 13 (API cấp 33) trở lên. Để dùng tính năng này, bạn phải đặt compileSdkVersion thành 33 trở lên. Để định cấu hình các lựa chọn ưu tiên về ngôn ngữ cho mỗi ứng dụng đối với các phiên bản Android trước, bạn vẫn cần phải sử dụng các API và bộ chọn ngôn ngữ trong ứng dụng.

Để bật tính năng tự động hỗ trợ ngôn ngữ cho mỗi ứng dụng, hãy chỉ định một ngôn ngữ mặc định:

  1. Trong thư mục res của mô-đun ứng dụng, hãy tạo một tệp mới có tên resources.properties.
  2. Trong tệp resources.properties, hãy đặt ngôn ngữ mặc định bằng nhãn unqualifiedResLocale. Để tạo tên ngôn ngữ, hãy kết hợp mã ngôn ngữ với tập lệnh tuỳ chọn và mã vùng, phân tách mỗi mã bằng một dấu gạch ngang:

    • Ngôn ngữ: Sử dụng mã gồm hai hoặc ba chữ cái theo tiêu chuẩn ISO 639-1.
    • Tập lệnh (không bắt buộc): Sử dụng mã theo tiêu chuẩn ISO 15924.
    • Khu vực (không bắt buộc): Sử dụng mã gồm hai chữ cái theo tiêu chuẩn ISO 3166-1-alpha-2 hoặc mã gồm 3 chữ số theo tiêu chuẩn UN_M.49.

    Chẳng hạn, nếu ngôn ngữ mặc định của bạn là tiếng Anh Mỹ:

        unqualifiedResLocale=en-US
        

AGP sẽ thêm ngôn ngữ mặc định này và mọi ngôn ngữ thay thế mà bạn đã chỉ định (bằng cách dùng các đường dẫn values-* trong thư mục res) vào tệp LocaleConfig được tạo tự động.

Tính năng tự động hỗ trợ ngôn ngữ cho mỗi ứng dụng bị tắt theo mặc định. Để bật tính năng này, hãy sử dụng chế độ cài đặt generateLocaleConfig trong khối androidResources {} của tệp build.gradle.kts cấp mô-đun (tệp build.gradle nếu bạn đang sử dụng Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Công cụ tìm lỗi mã nguồn Android chứa mã byte nhắm đến JVM 17

Kể từ AGP 8.1.0-alpha04, Android Lint chứa mã byte nhắm đến JVM 17. Nếu viết quy trình kiểm tra tìm lỗi mã nguồn tuỳ chỉnh, bạn cần biên dịch bằng JDK 17 trở lên và chỉ định jvmTarget = '17' trong các tuỳ chọn trình biên dịch Kotlin.

Để tìm hiểu thêm về công cụ tìm lỗi mã nguồn, hãy xem bài viết Cải thiện mã bằng các lượt kiểm tra tìm lỗi mã nguồn.

Chế độ cài đặt nén thư viện gốc đã chuyển sang DSL

Kể từ AGP 8.1.0-alpha10, bạn sẽ nhận được cảnh báo nếu không định cấu hình tính năng nén thư viện gốc bằng DSL thay vì tệp kê khai. Hướng dẫn sau đây giải thích cách cập nhật cấu hình để sử dụng DSL. Để được trợ giúp thực hiện các bản cập nhật này, hãy sử dụng Trợ lý nâng cấp AGP (Tools > AGP Upgrade Assistant) (Công cụ > Trợ lý nâng cấp AGP).

Để sử dụng thư viện gốc không nén, hãy xoá thuộc tính android::extractNativeLibs khỏi tệp kê khai và thêm mã sau vào tệp build.gradle.kts cấp mô-đun (tệp build.gradle nếu bạn đang sử dụng Groovy):

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Cờ bản dựng thử nghiệm

Đây là các cờ thử nghiệm để định cấu hình bản dựng có trong AGP 8.1.

Gắn cờ Đã thêm vào Giá trị mặc định Ghi chú
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Việc bật tuỳ chọn này mà không chỉ định cấu hình ký sẽ khiến AGP sử dụng cấu hình ký gỡ lỗi mặc định khi chạy bản dựng có thể định cấu hình hoặc gỡ lỗi. Cờ này bị tắt theo mặc định để khuyến khích tác giả bản dựng khai báo cấu hình ký hồ sơ cụ thể.
android.experimental.library.desugarAndroidTest AGP 8.0 false Cờ này cho phép trình tạo thư viện bật tính năng đơn giản hoá thư viện cốt lõi cho các tệp APK kiểm thử mà không ảnh hưởng đến AAR được tạo, chẳng hạn như thông qua tính năng tìm lỗi mã nguồn. Chúng tôi dự định sẽ hỗ trợ hành vi này trong Variant API.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Nếu được bật, Thiết bị do Gradle quản lý sẽ cho phép một loại thiết bị tuỳ chỉnh do người dùng xác định mà trình bổ trợ có thể cung cấp. Bạn phải bật cờ này nếu muốn sử dụng trình bổ trợ Phòng kiểm thử Firebase.
android.lint.printStackTrace AGP 8.0 false Nếu được bật, công cụ tìm lỗi mã nguồn Android sẽ in một dấu vết ngăn xếp nếu gặp sự cố. Cờ này có các chức năng giống như biến môi trường LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Không có Chỉ định số lượng tối đa Thiết bị do Gradle quản lý (AVD) đồng thời hoạt động tại một thời điểm bất kỳ. Nếu giá trị là 0 hoặc âm, thì sẽ không có số lượng thiết bị tối đa.
android.experimental.testOptions.installApkTimeout AGP 8.0 Không có Thời gian chờ tính bằng giây để cài đặt tệp APK. Nếu giá trị là 0 hoặc âm, UTP sẽ đặt giá trị này thành giá trị mặc định.

Vấn đề đã khắc phục

Trình bổ trợ Android cho Gradle 8.1.0

Vấn đề đã khắc phục
Trình bổ trợ Android cho Gradle
Các vấn đề về "com.android.build.gradle.tasks.ShaderCompile" với bộ nhớ đệm cấu hình
Việc thêm vào tài nguyên Java bằng API AGP làm hỏng bộ nhớ đệm cấu hình
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so được đóng gói trong APK
KGP đọc tệp kê khai trong khi định cấu hình, vô hiệu hoá bộ nhớ đệm cấu hình khi thay đổi tệp kê khai
Thông báo cảnh báo về bản dựng không rõ ràng khi có sự cố trong tệp kê khai sáp nhập
Việc nâng cấp lên AGP 7.4 sẽ gây ra lỗi StackOverflowError
ClassNotFoundException trong tính năng động phụ thuộc trực tiếp vào dự án phụ của thư viện Kotlin
Không thực hiện được processDebugUnitTestManifest bằng phần giữ chỗ tệp kê khai cho các biến thể kiểm thử
Không thực hiện được processDebugUnitTestManifest bằng phần giữ chỗ tệp kê khai cho các biến thể kiểm thử
thuộc tính không gian tên có thể thuộc về HasAndroidResources
Không tắt được thông báo "Gradle files have changed since last project sync" (Các tệp Gradle đã thay đổi kể từ lần đồng bộ hoá dự án gần nhất).
Thông báo "We recommend using a newer Android Gradle plugin" (Bạn nên dùng trình bổ trợ Android mới hơn cho Gradle) khi không có trình bổ trợ mới hơn
Không thực hiện được processDebugUnitTestManifest bằng phần giữ chỗ tệp kê khai cho các biến thể kiểm thử
Cờ boolean để tắt tính năng kiểm tra SDK biên dịch trong CheckAarMetadataTask
Lỗi bản dựng đề cập đến API cấp 34, API này không tồn tại
Việc đặt chuỗi công cụ JVM không ảnh hưởng đến giá trị JavaCompile targetCompatibility
Các mục nhập deepLink trong Navigation có miền ký tự đại diện không có thuộc tính "android:host" trong tệp kê khai sáp nhập
Tác vụ processDebugMainManifest không thành công kể từ Trình bổ trợ Android cho Gradle 8.1
Chúng ta có thể xoá AnalyticsRecordTask không?
Nội dung của output-metadata.json không nhất quán
Chúng ta có thể xoá AnalyticsRecordTask không?
Nội dung của output-metadata.json không nhất quán
Việc đặt chuỗi công cụ JVM không ảnh hưởng đến giá trị JavaCompile targetCompatibility
Các mục nhập deepLink trong Navigation có miền ký tự đại diện không có thuộc tính "android:host" trong tệp kê khai sáp nhập
Tác vụ processDebugMainManifest không thành công kể từ Trình bổ trợ Android cho Gradle 8.1
Android Studio không tuân theo biến môi trường STUDIO_GRADLE_JDK
Các loại nguồn tuỳ chỉnh phải tạo ra các tập hợp nguồn có nhiều phiên bản
DependenciesInfoBuilder cần có tài liệu + bản cập nhật API
Mục tiêu DexingNoClasspathTransform (minSdk >= 24) với Java 11 không thành công do thiếu các phần tử lồng nhau
DslExtension.Builder.extendProjectWith() không hoạt động theo mô tả trong Groovy
Thêm VariantSelector.withFlavor API không dùng kotlin.Pair
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) thiếu bộ nhớ đệm do `proguard.txt` thay đổi
Tệp kê khai sáp nhập của ứng dụng chứa các thuộc tính extractNativeLibs và useEmbeddedDex của các phần phụ thuộc
AGP: Hiển thị đường dẫn đến công cụ AIDL và tệp AIDL khung ở dạng API công khai
Yêu cầu: cho phép IDE khắc phục lỗi "PermittedSubclasses requires ASM9"
Lỗi: "Enable KSP and use the KSP processor for this dependency instead" (Thay vào đó, hãy bật KSP và sử dụng bộ xử lý KSP cho phần phụ thuộc này) chỉ truy cập tới một trang web
Gradle 8.1 phá vỡ cấu hình lưu vào bộ nhớ đệm do tệp .gradle/.android/analytics.settings
generateLocaleConfig trong agp 8.1.0 sử dụng thứ tự không xác định, phá vỡ các bản dựng có thể tái tạo
Dexer (D8)
Thư viện Core giúp đơn giản hoá ứng dụng gặp sự cố sau các lần cập nhật gần đây.
agp 8.1.0 hồi quy với API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Kiểm tra không thành công: ! method-> IsAbstract()
Tìm lỗi mã nguồn
Công cụ tìm lỗi mã nguồn chỉ kiểm tra các lượt truyền an toàn đối với các giao diện được triển khai trực tiếp, chứ không phải các giao diện kế thừa
Công cụ tìm lỗi mã nguồn không kiểm tra các lượt truyền hợp lệ của thiết bị nhận cuộc gọi
TypedArray#close (API 31) không ở quy trình đơn giản hoá nhưng AS không hiển thị cảnh báo khi được dùng trong try-with-resources
Lỗi: cảnh báo dương tính giả cho biết "The 'BC' provider is deprecated and as of Android P…" (Ngừng sử dụng nhà cung cấp 'BC' và kể từ Android P…)
Công cụ tìm lỗi mã nguồn báo lỗi dương tính giả về việc ghi nhớ sau khi nâng cấp Kotlin lên 1.8.0
Cảnh báo tìm lỗi mã nguồn bị dương tính giả (FP) khi tiến hành kiểm tra SDK_INT trong một phương thức có tham số enum
Tính năng kiểm tra tìm lỗi mã nguồn đối với TypographyQuotes không hoạt động trên các dấu ngoặc kép đi theo cặp tương ứng
Kiểm tra tìm lỗi mã nguồn TrustAllX509TrustManager gắn cờ không chính xác các giao diện mở rộng X509TrustManager
Chỉ định dạng lại mã đã chèn của bản sửa lỗi thay thế
Tìm lỗi mã nguồn: bản xem trước ý định gửi trường hợp ngoại lệ cho ReplaceStringQuickFix
Trình rút gọn (R8)
VerifyError: Trình xác minh từ chối lớp khi sử dụng R8 với Kotlin 1.8.20
R8 trên AGP 8 làm gián đoạn dịch vụ Google Fit
Việc bao gồm thông tin tệp nguồn với các tên dư thừa, trùng lặp với tên đầu vào, không được biểu thị chính xác
R8 không thành công trong quá trình tạo bản dựng bằng ArrayIndexOutOfBoundsException
Mã liên quan đến StringBuilder đơn giản bỏ lỡ cuộc gọi đuôi để nối thêm trong chế độ phát hành hoặc debuggable=false
Một trường hợp xảy ra không như dự kiến trong phương thức VirtualDispatchMethodArgumentPropagator.shouldKíchMethodStateGuardedByBounds()
kết quả của dex-startup-optimization trong java.lang.VerifyError: Từ chối lớp
Sự cố lỗi khi Xác minh trên Android 12+

Trình bổ trợ Android cho Gradle 8.1.1

Vấn đề đã khắc phục
Dexer (D8)
Bản ghi Java 16: equals(null) gửi NullPointerException
Trình rút gọn (R8)
java.lang.VerifyError: Lớp bị từ chối của trình xác minh
Bản dựng bị lỗi trên :minifyReleaseWithR8 khi dùng thư viện Apache POI
Từ chối lệnh gọi khi bật tính năng tối ưu hoá R8
NoClassDefFoundError cho java.lang.reflect.Executable

Trình bổ trợ Android cho Gradle 8.1.2

Vấn đề đã khắc phục
Trình bổ trợ Android cho Gradle
androidResources không có trong mô-đun thư viện Android
[AGP 8.1.0] Kiểm thử ./gradlew không thành công và hiện thông báo lỗi "Unable to find manifest output" (Không tìm thấy đầu ra tệp kê khai) nếu cả splits.abi.isEnable và testOptions.unitTests.isIncludeAndroidResources đều mang giá trị true
Trình rút gọn (R8)
Kotlin 1.9 khiến R8 huỷ bỏ hàm lambda Kotlin nếu các giá trị nullchecks bị xoá
R8 không thành công với lỗi "Undefined value encountered during compilation" (Gặp giá trị không xác định trong quá trình biên dịch) cho play-services-measurement-21.3.0-runtime.jar

Trình bổ trợ Android cho Gradle 8.1.3

Vấn đề đã khắc phục
Trình bổ trợ Android cho Gradle
[AGP 8.1.0] Kiểm thử ./gradlew không thành công và hiện thông báo lỗi "Unable to find manifest output" (Không tìm thấy đầu ra tệp kê khai) nếu cả splits.abi.isEnable và testOptions.unitTests.isIncludeAndroidResources đều mang giá trị true
Lỗi bản dựng sau khi cập nhật lên AGP 8.1

Trình bổ trợ Android cho Gradle 8.1.4

Vấn đề đã khắc phục
Trình bổ trợ Android cho Gradle
Không chạy tác vụ tạo tệp dex trên các lớp của dự án phụ khi các lớp đó đã được tạo tệp dex thông qua việc biến đổi cấu phần phần mềm