Thay đổi về hành vi: Ứng dụng nhắm đến Android 12

Giống như các bản phát hành trước, Android 12 có các thay đổi về hành vi có thể ảnh hưởng đến ứng dụng của bạn. Những thay đổi về hành vi sau đây chỉ áp dụng cho ứng dụng nhắm đến Android 12 trở lên. Nếu ứng dụng của bạn nhắm đến Android 12, bạn nên điều chỉnh ứng dụng để hỗ trợ những hành vi này cho phù hợp (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách các thay đổi về hành vi ảnh hưởng đến tất cả ứng dụng chạy trên Android 12.

Trải nghiệm người dùng

Thông báo tuỳ chỉnh

Android 12 thay đổi giao diện và hành vi của thông báo hoàn toàn tuỳ chỉnh. Trước đây, thông báo tuỳ chỉnh có thể sử dụng toàn bộ khu vực thông báo và cung cấp bố cục cũng như kiểu riêng. Điều này dẫn đến các mẫu chống lại có thể khiến người dùng nhầm lẫn hoặc gây ra các vấn đề về khả năng tương thích bố cục trên các thiết bị khác nhau.

Đối với các ứng dụng nhắm đến Android 12, thông báo có khung hiển thị nội dung tuỳ chỉnh sẽ không còn sử dụng toàn bộ khu vực thông báo; thay vào đó, hệ thống sẽ áp dụng một mẫu chuẩn. Mẫu này đảm bảo rằng thông báo tuỳ chỉnh có cách trang trí giống như các thông báo khác ở tất cả các trạng thái, chẳng hạn như biểu tượng và các thành phần có thể mở rộng của thông báo (ở trạng thái thu gọn), cũng như biểu tượng, tên ứng dụng và thành phần có thể thu gọn của thông báo (ở trạng thái mở rộng). Hành vi này gần giống với hành vi của Notification.DecoratedCustomViewStyle.

Bằng cách này, Android 12 giúp tất cả thông báo nhất quán về mặt hình ảnh và dễ dàng quét, với một thông báo có thể mở rộng quen thuộc mà người dùng có thể khám phá.

Hình minh hoạ sau đây cho thấy một thông báo tuỳ chỉnh trong mẫu tiêu chuẩn:

Các ví dụ sau đây cho thấy cách thông báo tuỳ chỉnh sẽ hiển thị ở trạng thái thu gọn và trạng thái mở rộng:

Thay đổi này trong Android 12 ảnh hưởng đến những ứng dụng xác định các lớp con tuỳ chỉnh của Notification.Style hoặc sử dụng các phương thức Notification.Builder setCustomContentView(RemoteViews), setCustomBigContentView(RemoteViews)setCustomHeadsUpContentView(RemoteViews).

Nếu ứng dụng của bạn đang sử dụng thông báo hoàn toàn tuỳ chỉnh, bạn nên kiểm thử bằng mẫu mới càng sớm càng tốt.

  1. Bật thay đổi về thông báo tuỳ chỉnh:

    1. Thay đổi targetSdkVersion của ứng dụng thành S để bật hành vi mới.
    2. Biên dịch lại.
    3. Cài đặt ứng dụng của bạn trên một thiết bị hoặc trình mô phỏng chạy Android 12.
  2. Kiểm thử tất cả các thông báo sử dụng chế độ xem tuỳ chỉnh, đảm bảo chúng xuất hiện như bạn mong đợi trong bóng. Trong quá trình kiểm thử, hãy cân nhắc những điều sau đây và điều chỉnh nếu cần:

    • Kích thước của các khung hiển thị tuỳ chỉnh đã thay đổi. Nhìn chung, chiều cao dành cho thông báo tuỳ chỉnh sẽ ít hơn trước. Ở trạng thái thu gọn, chiều cao tối đa của nội dung tuỳ chỉnh đã giảm từ 106 dp xuống còn 48 dp. Ngoài ra, không gian theo chiều ngang cũng ít hơn.

    • Tất cả thông báo đều có thể mở rộng đối với các ứng dụng nhắm đến Android 12. Thông thường, điều này có nghĩa là nếu đang dùng setCustomContentView, bạn cũng nên dùng setBigCustomContentView để đảm bảo trạng thái thu gọn và mở rộng nhất quán.

    • Để đảm bảo trạng thái "Heads Up" (Thông báo quan trọng) xuất hiện như bạn mong đợi, đừng quên tăng mức độ quan trọng của kênh thông báo lên "HIGH" (Xuất hiện trên màn hình).

Trên các ứng dụng nhắm đến Android 12 trở lên, hệ thống thực hiện một số thay đổi đối với cách xác minh Đường liên kết trong ứng dụng Android. Những thay đổi này cải thiện độ tin cậy của trải nghiệm liên kết ứng dụng, mang lại nhiều quyền kiểm soát hơn cho nhà phát triển ứng dụng và người dùng cuối.

Nếu bạn dựa vào quy trình xác minh Đường liên kết trong ứng dụng Android để mở đường liên kết trang web trong ứng dụng, hãy kiểm tra để đảm bảo bạn sử dụng đúng định dạng khi thêm bộ lọc ý định cho quy trình xác minh Đường liên kết trong ứng dụng Android. Cụ thể, hãy đảm bảo rằng các bộ lọc ý định này bao gồm danh mục BROWSABLE và hỗ trợ giản đồ https.

Bạn cũng có thể xác minh theo cách thủ công các đường liên kết của ứng dụng để kiểm tra độ tin cậy của nội dung khai báo.

Cải thiện hành vi của tính năng hình trong hình

Android 12 cải thiện hành vi cho chế độ hình trong hình (PiP) và đề xuất cải thiện về mặt thẩm mỹ cho ảnh động chuyển đổi đối với cả chế độ thao tác bằng cử chỉ và chế độ thao tác dựa trên phần tử.

Hãy xem phần Những điểm cải tiến về chế độ hình trong hình để biết thêm thông tin.

Thiết kế lại thông báo

Trong Android 12, chế độ xem thông báo đã được thiết kế lại. Giờ đây, thông báo ngắn chỉ giới hạn ở 2 dòng văn bản và hiển thị biểu tượng ứng dụng bên cạnh văn bản.

Hình ảnh thiết bị Android hiển thị cửa sổ bật lên hiển thị thông báo ngắn "Đang gửi tin nhắn" bên cạnh biểu tượng ứng dụng

Hãy xem bài viết Tổng quan về thông báo dạng toast để biết thêm thông tin chi tiết.

Bảo mật và quyền riêng tư

Vị trí ước chừng

Trên các thiết bị chạy Android 12 trở lên, người dùng có thể yêu cầu độ chính xác của thông tin vị trí gần đúng cho ứng dụng của bạn.

Cookie SameSite hiện đại trong WebView

Thành phần WebView của Android dựa trên Chromium, dự án nguồn mở hỗ trợ trình duyệt Chrome của Google. Chromium đã giới thiệu các thay đổi đối với cách xử lý cookie của bên thứ ba để tăng cường tính bảo mật và quyền riêng tư, đồng thời giúp người dùng hiểu rõ hơn và có nhiều quyền kiểm soát hơn. Kể từ Android 12, những thay đổi này cũng có trong WebView khi ứng dụng nhắm đến Android 12 (API cấp 31) trở lên.

Thuộc tính SameSite của cookie kiểm soát việc cookie có thể được gửi cùng với mọi yêu cầu hay chỉ với các yêu cầu same-site. Những thay đổi sau đây nhằm bảo vệ quyền riêng tư sẽ cải thiện cách xử lý cookie của bên thứ ba theo mặc định và giúp ngăn chặn hoạt động chia sẻ ngoài ý muốn trên nhiều trang web:

  • Những cookie không có thuộc tính SameSite sẽ được coi là SameSite=Lax.
  • Cookie có SameSite=None cũng phải chỉ định thuộc tính Secure, tức là chúng yêu cầu một bối cảnh an toàn và phải được gửi qua HTTPS.
  • Giờ đây, các đường liên kết giữa phiên bản HTTP và HTTPS của một trang web được coi là yêu cầu trên nhiều trang web, vì vậy, cookie sẽ không được gửi trừ phi được đánh dấu thích hợp là SameSite=None; Secure.

Đối với nhà phát triển, hướng dẫn chung là xác định các phần phụ thuộc cookie trên nhiều trang web trong luồng người dùng quan trọng và đảm bảo rằng thuộc tính SameSite được đặt rõ ràng với các giá trị thích hợp khi cần. Bạn phải chỉ định rõ ràng những cookie được phép hoạt động trên các trang web hoặc trên các thao tác điều hướng cùng trang web chuyển từ HTTP sang HTTPS.

Để biết hướng dẫn đầy đủ cho nhà phát triển web về những thay đổi này, hãy xem bài viết Giải thích về cookie SameSiteSchemeful SameSite.

Kiểm thử hành vi SameSite trong ứng dụng của bạn

Nếu ứng dụng của bạn dùng WebView hoặc nếu bạn quản lý một trang web hay dịch vụ dùng cookie, thì bạn nên kiểm thử các luồng trên Android 12 WebView. Nếu gặp vấn đề, bạn có thể cần cập nhật cookie để hỗ trợ các hành vi SameSite mới.

Theo dõi các vấn đề khi đăng nhập và nội dung được nhúng, cũng như quy trình đăng nhập, mua hàng và các quy trình xác thực khác mà người dùng bắt đầu trên một trang không an toàn và chuyển sang một trang an toàn.

Để kiểm thử một ứng dụng bằng WebView, bạn phải bật các hành vi SameSite mới cho ứng dụng mà bạn muốn kiểm thử bằng cách hoàn tất một trong các bước sau:

  • Bật hành vi SameSite theo cách thủ công trên thiết bị thử nghiệm bằng cách chuyển đổi cờ giao diện người dùng webview-enable-modern-cookie-same-site trong WebView devtools.

    Phương pháp này cho phép bạn kiểm thử trên mọi thiết bị chạy Android 5.0 (API cấp 21) trở lên (bao gồm cả Android 12) và WebView phiên bản 89.0.4385.0 trở lên.

  • Biên dịch ứng dụng để nhắm đến Android 12 (API cấp 31) chậm nhất là targetSdkVersion.

    Nếu sử dụng phương pháp này, bạn phải dùng một thiết bị chạy Android 12.

Để biết thông tin về gỡ lỗi từ xa cho WebView trên Android, hãy xem bài viết Bắt đầu gỡ lỗi từ xa cho các thiết bị Android.

Tài nguyên khác

Để biết thêm thông tin về các hành vi hiện đại của SameSite và việc triển khai cho Chrome và WebView, hãy truy cập vào trang Cập nhật về SameSite của Chromium. Nếu phát hiện thấy lỗi trong WebView hoặc Chromium, bạn có thể báo cáo lỗi đó trong trình theo dõi vấn đề công khai của Chromium.

Cảm biến chuyển động bị giới hạn tốc độ

Để bảo vệ thông tin có thể nhạy cảm về người dùng, nếu ứng dụng của bạn nhắm đến Android 12 trở lên, hệ thống sẽ giới hạn tốc độ làm mới dữ liệu từ một số cảm biến chuyển động và cảm biến vị trí.

Tìm hiểu thêm về tính năng giới hạn tốc độ của cảm biến.

Trạng thái ngủ đông của ứng dụng

Android 12 mở rộng hành vi tự động đặt lại quyền từng ra mắt trong Android 11 (API cấp 30). Nếu ứng dụng của bạn nhắm đến Android 12 và người dùng không tương tác với ứng dụng của bạn trong vài tháng, thì hệ thống sẽ tự động đặt lại mọi quyền đã cấp và đặt ứng dụng của bạn ở trạng thái ngủ đông.

Tìm hiểu thêm trong hướng dẫn về chế độ ngủ đông của ứng dụng.

Khai báo quyền phân bổ trong hoạt động kiểm tra quyền truy cập dữ liệu

API kiểm tra quyền truy cập dữ liệu (ra mắt trong Android 11 (API cấp 30)) cho phép bạn tạo thẻ phân bổ dựa trên các trường hợp sử dụng của ứng dụng. Các thẻ này giúp bạn dễ dàng xác định phần nào trong ứng dụng thực hiện một loại quyền truy cập dữ liệu cụ thể.

Nếu ứng dụng của bạn nhắm đến Android 12 trở lên, bạn phải khai báo các thẻ phân bổ này trong tệp kê khai của ứng dụng.

Hạn chế đối với bản sao lưu ADB

Để giúp bảo vệ dữ liệu ứng dụng riêng tư, Android 12 sẽ thay đổi hành vi mặc định của lệnh adb backup. Đối với các ứng dụng nhắm đến Android 12 (API cấp 31) trở lên, khi người dùng chạy lệnh adb backup, dữ liệu ứng dụng sẽ bị loại trừ khỏi mọi dữ liệu hệ thống khác được xuất từ thiết bị.

Nếu quy trình kiểm thử hoặc phát triển của bạn dựa vào dữ liệu ứng dụng bằng cách sử dụng adb backup, thì giờ đây, bạn có thể chọn xuất dữ liệu của ứng dụng bằng cách đặt android:debuggable thành true trong tệp kê khai của ứng dụng.

Xuất thành phần an toàn hơn

Nếu ứng dụng của bạn nhắm đến Android 12 trở lên và chứa các hoạt động, dịch vụ hoặc broadcast receiver sử dụng bộ lọc ý định, thì bạn phải khai báo rõ ràng thuộc tính android:exported cho các thành phần ứng dụng này.

Nếu thành phần ứng dụng bao gồm danh mục LAUNCHER, hãy đặt android:exported thành true. Trong hầu hết các trường hợp khác, hãy đặt android:exported thành false.

Đoạn mã sau đây minh hoạ một ví dụ về dịch vụ chứa bộ lọc ý định có thuộc tính android:exported được đặt thành false:

<service android:name="com.example.app.backgroundService"
         android:exported="false">
    <intent-filter>
        <action android:name="com.example.app.START_BACKGROUND" />
    </intent-filter>
</service>

Thông báo trong Android Studio

Nếu ứng dụng của bạn chứa một hoạt động, dịch vụ hoặc broadcast receiver sử dụng bộ lọc ý định nhưng không khai báo android:exported, thì các thông báo cảnh báo sau sẽ xuất hiện, tuỳ thuộc vào phiên bản Android Studio mà bạn sử dụng:

Android Studio 2020.3.1 Canary 11 trở lên

Các thông báo sau đây sẽ xuất hiện:

  1. Cảnh báo lint sau đây xuất hiện trong tệp kê khai của bạn:

    When using intent filters, please specify android:exported as well
    
  2. Khi bạn cố gắng biên dịch ứng dụng, thông báo lỗi bản dựng sau đây sẽ xuất hiện:

    Manifest merger failed : Apps targeting Android 12 and higher are required \
    to specify an explicit value for android:exported when the corresponding \
    component has an intent filter defined.
    
Các phiên bản cũ của Android Studio

Nếu bạn cố gắng cài đặt ứng dụng, Logcat sẽ hiển thị thông báo lỗi sau:

Installation did not succeed.
The application could not be installed: INSTALL_FAILED_VERIFICATION_FAILURE
List of apks:
[0] '.../build/outputs/apk/debug/app-debug.apk'
Installation failed due to: 'null'

Khả năng biến đổi của ý định đang chờ xử lý

Nếu ứng dụng của bạn nhắm đến Android 12, bạn phải chỉ định khả năng thay đổi của từng đối tượng PendingIntent mà ứng dụng của bạn tạo. Yêu cầu bổ sung này giúp cải thiện tính bảo mật của ứng dụng.

Kiểm thử thay đổi về khả năng thay đổi của ý định đang chờ xử lý

Để xác định xem ứng dụng của bạn có thiếu khai báo khả năng biến đổi hay không, hãy tìm cảnh báo tìm lỗi mã nguồn sau đây trong Android Studio:

Warning: Missing PendingIntent mutability flag [UnspecifiedImmutableFlag]

Khởi chạy ý định không an toàn

Để cải thiện tính bảo mật của nền tảng, Android 12 trở lên cung cấp một tính năng gỡ lỗi giúp phát hiện các lần khởi chạy ý định không an toàn. Khi hệ thống phát hiện thấy một lượt khởi chạy không an toàn như vậy, lỗi vi phạm StrictMode sẽ xảy ra.

Hiệu suất

Các hạn chế khi khởi động dịch vụ trên nền trước

Những ứng dụng nhắm đến Android 12 trở lên không thể bắt đầu các dịch vụ trên nền trước trong khi chạy ở chế độ nền, ngoại trừ một vài trường hợp đặc biệt. Nếu một ứng dụng cố gắng bắt đầu một dịch vụ trên nền trước trong khi chạy ở chế độ nền, thì sẽ có ngoại lệ (ngoại trừ một vài trường hợp đặc biệt).

Cân nhắc sử dụng WorkManager để lên lịch và bắt đầu công việc ưu tiên trong khi ứng dụng của bạn chạy ở chế độ nền. Để hoàn tất các thao tác cần chính xác về thời gian mà người dùng yêu cầu, hãy bắt đầu các dịch vụ trên nền trước trong phạm vi chuông báo chính xác.

Quyền thông báo chính xác

Để khuyến khích các ứng dụng tiết kiệm tài nguyên hệ thống, những ứng dụng nhắm đến Android 12 trở lên và đặt chuông báo chính xác phải có quyền truy cập vào chức năng "Chuông báo và lời nhắc" xuất hiện trong màn hình Quyền truy cập đặc biệt của ứng dụng trong phần cài đặt hệ thống.

Để có được quyền truy cập đặc biệt này của ứng dụng, hãy yêu cầu quyền SCHEDULE_EXACT_ALARM trong tệp kê khai.

Bạn chỉ nên dùng chuông báo chính xác cho các tính năng dành cho người dùng. Tìm hiểu thêm về các trường hợp sử dụng được phép để đặt thông báo chính xác.

Tắt thay đổi về hành vi

Khi chuẩn bị để ứng dụng nhắm đến Android 12, bạn có thể tạm thời tắt thay đổi về hành vi trong biến thể bản dựng có thể gỡ lỗi cho mục đích kiểm thử. Để làm như vậy, hãy hoàn tất một trong các thao tác sau:

  • Trên màn hình cài đặt Tuỳ chọn cho nhà phát triển, hãy chọn Các thay đổi về khả năng tương thích của ứng dụng. Trên màn hình xuất hiện, hãy nhấn vào tên ứng dụng của bạn, sau đó tắt REQUIRE_EXACT_ALARM_PERMISSION.
  • Trong cửa sổ dòng lệnh trên máy phát triển của bạn, hãy chạy lệnh sau:

    adb shell am compat disable REQUIRE_EXACT_ALARM_PERMISSION PACKAGE_NAME
    

Các hạn chế về thành phần phản hồi với thao tác nhấn vào thông báo

Khi người dùng tương tác với thông báo, một số ứng dụng sẽ phản hồi thao tác nhấn vào thông báo bằng cách chạy một thành phần ứng dụng. Thành phần này cuối cùng sẽ bắt đầu hoạt động mà người dùng nhìn thấy và tương tác. Thành phần ứng dụng này được gọi là thành phần phản hồi với thao tác nhấn vào thông báo.

Để cải thiện hiệu suất và trải nghiệm người dùng của ứng dụng, các ứng dụng nhắm đến Android 12 trở lên không thể bắt đầu các hoạt động từ dịch vụ hoặc broadcast receiver dùng làm thành phần phản hồi với thao tác nhấn vào thông báo. Nói cách khác, sau khi người dùng nhấn vào một thông báo hoặc nút hành động trong thông báo, ứng dụng của bạn sẽ không thể gọi startActivity() bên trong một dịch vụ hoặc broadcast receiver.

Khi ứng dụng của bạn cố gắng bắt đầu một hoạt động từ một dịch vụ hoặc broadcast receiver đóng vai trò là thành phần phản hồi với thao tác nhấn vào thông báo, hệ thống sẽ ngăn hoạt động bắt đầu và thông báo sau sẽ xuất hiện trong Logcat:

Indirect notification activity start (trampoline) from PACKAGE_NAME, \
this should be avoided for performance reasons.

Xác định những thành phần ứng dụng đóng vai trò là thành phần phản hồi với thao tác nhấn vào thông báo

Khi kiểm thử ứng dụng, sau khi nhấn vào một thông báo, bạn có thể xác định dịch vụ hoặc broadcast receiver nào đóng vai trò là thông báo trampoline trong ứng dụng của mình. Để làm như vậy, hãy xem đầu ra của lệnh sau đây trên thiết bị đầu cuối:

adb shell dumpsys activity service \
  com.android.systemui/.dump.SystemUIAuxiliaryDumpService

Một phần của đầu ra có chứa văn bản "NotifInteractionLog". Phần này chứa thông tin cần thiết để xác định thành phần bắt đầu dưới dạng kết quả của thao tác nhấn vào thông báo.

Cập nhật ứng dụng

Nếu ứng dụng của bạn bắt đầu một hoạt động từ một dịch vụ hoặc broadcast receiver đóng vai trò là thành phần phản hồi với thao tác nhấn vào thông báo, hãy hoàn tất các bước di chuyển sau:

  1. Tạo một đối tượng PendingIntent được liên kết với hoạt động mà người dùng nhìn thấy sau khi họ nhấn vào thông báo.
  2. Sử dụng đối tượng PendingIntent mà bạn đã tạo ở bước trước trong quá trình tạo thông báo.

Để xác định nguồn gốc của hoạt động, chẳng hạn như để thực hiện ghi nhật ký, hãy sử dụng các phần bổ sung khi đăng thông báo. Để ghi nhật ký tập trung, hãy sử dụng ActivityLifecycleCallbacks hoặc các đối tượng theo dõi vòng đời Jetpack.

Bật/tắt hành vi

Khi kiểm thử phiên bản có thể gỡ lỗi của ứng dụng, bạn có thể bật và tắt chế độ hạn chế này bằng cách sử dụng cờ tương thích của ứng dụng NOTIFICATION_TRAMPOLINE_BLOCK.

Sao lưu và khôi phục

Có những thay đổi về cách hoạt động của tính năng sao lưu và khôi phục trong các ứng dụng chạy trên và nhắm đến Android 12 (API cấp 31). Dịch vụ sao lưu và khôi phục của Android có 2 dạng:

  • Sao lưu trên đám mây: Dữ liệu người dùng được lưu trữ trong Google Drive của người dùng để sau này có thể khôi phục trên thiết bị đó hoặc một thiết bị mới.
  • Chuyển dữ liệu giữa các thiết bị (D2D): Dữ liệu người dùng được gửi trực tiếp đến thiết bị mới của người dùng từ thiết bị cũ của họ, chẳng hạn như bằng cách sử dụng cáp.

Để biết thêm thông tin về cách sao lưu và khôi phục dữ liệu, hãy xem phần Sao lưu dữ liệu người dùng bằng tính năng Tự động sao lưuSao lưu các cặp khoá-giá trị bằng Android Backup Service.

Các thay đổi về chức năng chuyển dữ liệu từ thiết bị sang thiết bị

Đối với các ứng dụng chạy trên và nhắm đến Android 12 trở lên:

  • Chỉ định các quy tắc bao gồm và loại trừ bằng cơ chế định cấu hình XML không ảnh hưởng đến các hoạt động chuyển D2D, mặc dù cơ chế này vẫn ảnh hưởng đến hoạt động sao lưu và khôi phục dựa trên đám mây (chẳng hạn như bản sao lưu trên Google Drive). Để chỉ định các quy tắc cho hoạt động truyền dữ liệu D2D, bạn phải sử dụng cấu hình mới được đề cập trong phần tiếp theo.

  • Trên thiết bị của một số nhà sản xuất thiết bị, việc chỉ định android:allowBackup="false" sẽ tắt tính năng sao lưu vào Google Drive, nhưng không tắt tính năng chuyển dữ liệu trực tiếp cho ứng dụng.

Định dạng mới để bao gồm và loại trừ

Các ứng dụng chạy trên và nhắm đến Android 12 trở lên sử dụng một định dạng khác cho cấu hình XML. Định dạng này phân biệt rõ ràng giữa bản sao lưu trên Google Drive và hoạt động chuyển dữ liệu D2D bằng cách yêu cầu bạn chỉ định riêng các quy tắc bao gồm và loại trừ cho bản sao lưu trên đám mây và cho hoạt động chuyển dữ liệu D2D.

Ngoài ra, bạn cũng có thể dùng tính năng này để chỉ định các quy tắc sao lưu. Trong trường hợp đó, cấu hình đã dùng trước đây sẽ bị bỏ qua trên các thiết bị chạy Android 12 trở lên. Bạn vẫn cần cấu hình cũ cho các thiết bị chạy Android 11 trở xuống.

Thay đổi về định dạng XML

Sau đây là định dạng được dùng cho cấu hình sao lưu và khôi phục trong Android 11 trở xuống:

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root"] path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root"] path="string" />
</full-backup-content>

Sau đây là những thay đổi về định dạng được đánh dấu bằng chữ in đậm.

<data-extraction-rules>
  <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                        "root"] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                        "root"] path="string"/>
    ...
  </cloud-backup>
  <device-transfer>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                        "root"] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                        "root"] path="string"/>
    ...
  </device-transfer>
</data-extraction-rules>

Để biết thêm thông tin, hãy xem phần tương ứng trong hướng dẫn sao lưu dữ liệu người dùng bằng tính năng Tự động sao lưu.

Cờ kê khai cho ứng dụng

Trỏ ứng dụng của bạn đến cấu hình XML mới bằng cách sử dụng thuộc tính android:dataExtractionRules trong tệp kê khai. Khi bạn trỏ đến cấu hình XML mới, thuộc tính android:fullBackupContent trỏ đến cấu hình cũ sẽ bị bỏ qua trên các thiết bị chạy Android 12 trở lên. Đoạn mã sau đây cho thấy các mục mới trong tệp kê khai:

<application
    ...
    <!-- The below attribute is ignored. -->
    android:fullBackupContent="old_config.xml"
    <!-- You can point to your new configuration using the new
         dataExtractionRules attribute . -->
    android:dataExtractionRules="new_config.xml"
    ...>
</application>

Khả năng kết nối

Quyền truy cập Bluetooth

Android 12 giới thiệu các quyền BLUETOOTH_SCAN, BLUETOOTH_ADVERTISEBLUETOOTH_CONNECT. Những quyền này giúp các ứng dụng nhắm đến Android 12 dễ dàng tương tác với các thiết bị Bluetooth, đặc biệt là đối với những ứng dụng không yêu cầu quyền truy cập vào thông tin vị trí của thiết bị.

Để chuẩn bị thiết bị cho việc nhắm đến Android 12 trở lên, hãy cập nhật logic của ứng dụng. Thay vì khai báo một nhóm quyền Bluetooth cũ, hãy khai báo một nhóm quyền Bluetooth hiện đại hơn.

Kết nối ngang hàng và Internet đồng thời

Đối với các ứng dụng nhắm đến Android 12 (API cấp 31) trở lên, những thiết bị hỗ trợ các kết nối ngang hàng và kết nối Internet đồng thời có thể duy trì các kết nối Wi-Fi đồng thời với cả thiết bị ngang hàng và mạng cung cấp Internet chính, giúp trải nghiệm người dùng liền mạch hơn. Các ứng dụng nhắm đến Android 11 (API cấp 30) trở xuống vẫn gặp phải hành vi cũ, trong đó mạng Wi-Fi chính bị ngắt kết nối trước khi kết nối với thiết bị ngang hàng.

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

WifiManager.getConnectionInfo() có thể trả về WifiInfo chỉ cho một mạng duy nhất. Do đó, hành vi của API đã thay đổi theo những cách sau trong Android 12 trở lên:

  • Nếu chỉ có một mạng Wi-Fi, WifiInfo của mạng đó sẽ được trả về.
  • Nếu có nhiều mạng Wi-Fi và ứng dụng gọi đã kích hoạt kết nối ngang hàng, thì WifiInfo tương ứng với thiết bị ngang hàng sẽ được trả về.
  • Nếu có nhiều mạng Wi-Fi và ứng dụng gọi không kích hoạt kết nối ngang hàng, thì WifiInfo của kết nối chính cung cấp Internet sẽ được trả về.

Để mang lại trải nghiệm người dùng tốt hơn trên các thiết bị hỗ trợ mạng Wi-Fi kép đồng thời, tất cả ứng dụng (đặc biệt là những ứng dụng kích hoạt các kết nối ngang hàng) nên di chuyển khỏi việc gọi WifiManager.getConnectionInfo() và thay vào đó sử dụng NetworkCallback.onCapabilitiesChanged() để nhận tất cả các đối tượng WifiInfo khớp với NetworkRequest được dùng để đăng ký NetworkCallback. getConnectionInfo() không được dùng nữa kể từ Android 12.

Mã mẫu sau đây cho biết cách lấy WifiInfo trong NetworkCallback:

Kotlin

val networkCallback = object : ConnectivityManager.NetworkCallback() {
  ...
  override fun onCapabilitiesChanged(
           network : Network,
           networkCapabilities : NetworkCapabilities) {
    val transportInfo = networkCapabilities.getTransportInfo()
    if (transportInfo !is WifiInfo) return
    val wifiInfo : WifiInfo = transportInfo
    ...
  }
}

Java

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  public void onCapabilitiesChanged(
         Network network,
         NetworkCapabilities networkCapabilities) {
    final TransportInfo transportInfo = networkCapabilities.getTransportInfo();
    if (!(transportInfo instanceof WifiInfo)) return;
    final WifiInfo wifiInfo = (WifiInfo) transportInfo;
    ...
  }
  ...
};

mDNSResponder native API

Android 12 thay đổi thời điểm các ứng dụng có thể tương tác với trình nền mDNSResponder bằng API gốc mDNSResponder. Trước đây, khi một ứng dụng đăng ký một dịch vụ trên mạng và gọi phương thức getSystemService(), dịch vụ NSD của hệ thống sẽ khởi động trình nền mDNSResponder, ngay cả khi ứng dụng chưa gọi bất kỳ phương thức NsdManager nào. Sau đó, trình nền đã đăng ký thiết bị vào các nhóm truyền tin đa hướng tất cả các nút, khiến hệ thống thường xuyên thức và tiêu thụ thêm điện. Để giảm thiểu mức sử dụng pin, trong Android 12 trở lên, hệ thống hiện chỉ khởi động trình nền mDNSResponder khi cần cho các sự kiện NSD và dừng trình nền này sau đó.

Vì thay đổi này ảnh hưởng đến thời điểm có sẵn trình nền mDNSResponder, nên những ứng dụng giả định rằng trình nền mDNSResponder sẽ được khởi động sau khi gọi phương thức getSystemService() có thể nhận được thông báo từ hệ thống cho biết trình nền mDNSResponder không có sẵn. Những ứng dụng sử dụng NsdManager và không sử dụng API gốc mDNSResponder sẽ không bị ảnh hưởng bởi thay đổi này.

Thư viện của nhà cung cấp

Thư viện dùng chung gốc do nhà cung cấp cung cấp

Thư viện gốc dùng chung không phải NDK do nhà cung cấp silicon hoặc nhà sản xuất thiết bị cung cấp sẽ không thể truy cập theo mặc định nếu ứng dụng đang nhắm đến Android 12 (API cấp 31) trở lên. Bạn chỉ có quyền truy cập vào các thư viện khi chúng được yêu cầu rõ ràng bằng thẻ <uses-native-library>.

Nếu ứng dụng nhắm đến Android 11 (API cấp 30) trở xuống, thì bạn không bắt buộc phải sử dụng thẻ <uses-native-library>. Trong trường hợp đó, mọi thư viện gốc dùng chung đều có thể truy cập được, bất kể đó là thư viện NDK.

Các quy tắc hạn chế mới cập nhật đối với yếu tố ngoài SDK

Android 12 cung cấp danh sách mới cập nhật về các giao diện không phải SDK bị hạn chế dựa trên khả năng cộng tác với nhà phát triển Android và kiểm thử nội bộ mới nhất. Bất cứ khi nào có thể, chúng tôi phải đảm bảo việc cung cấp các phương án thay thế công khai trước khi hạn chế giao diện không phải SDK.

Nếu ứng dụng của bạn không nhắm đến Android 12, thì một số thay đổi này có thể sẽ không ảnh hưởng ngay. Tuy nhiên, mặc dù hiện tại bạn có thể sử dụng một số giao diện không phải SDK (tuỳ thuộc vào cấp độ API mục tiêu của ứng dụng), nhưng việc sử dụng phương thức hoặc trường không phải SDK luôn có nguy cơ cao làm hỏng ứng dụng.

Nếu không chắc ứng dụng của mình có sử dụng giao diện không phải SDK hay không, bạn có thể kiểm tra ứng dụng để tìm hiểu. Nếu ứng dụng của bạn dựa vào giao diện không phải SDK, thì bạn nên bắt đầu lập kế hoạch di chuyển sang SDK làm giải pháp thay thế. Tuy nhiên, chúng tôi hiểu rằng vẫn có một số trường hợp sử dụng hợp lệ cho việc ứng dụng sử dụng giao diện không phải SDK. Nếu không tìm được giải pháp thay thế cho việc sử dụng giao diện không phải SDK cho một tính năng trong ứng dụng, thì bạn nên yêu cầu một API công khai mới.

Để tìm hiểu thêm về những thay đổi trong bản phát hành Android này, hãy xem bài viết Thông tin cập nhật đối với những hạn chế về giao diện không phải SDK trong Android 12. Để tìm hiểu thêm về giao diện không phải SDK nói chung, hãy xem Các hạn chế đối với giao diện không phải SDK.