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

Giống như các bản phát hành trước, Android 11 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 11 trở lên. Nếu ứng dụng của bạn đặt targetSdkVersion thành 30, bạn nên sửa đổi ứng dụng để hỗ trợ những hành vi này cho phù hợp (nếu có).

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

Quyền riêng tư

Android 11 đưa ra các thay đổi và hạn chế để tăng cường quyền riêng tư của người dùng, bao gồm:

  • Thực thi bộ nhớ có giới hạn: Quyền truy cập vào các thư mục bộ nhớ ngoài chỉ giới hạn ở một thư mục dành riêng cho ứng dụng và các loại nội dung nghe nhìn cụ thể mà ứng dụng tạo ra.
  • Tự động đặt lại quyền: Nếu người dùng không tương tác với ứng dụng trong vài tháng, thì hệ thống sẽ tự động đặt lại các quyền truy cập thông tin nhạy cảm của ứng dụng đó.
  • Quyền truy cập thông tin vị trí ở chế độ nền: Người dùng phải được chuyển đến phần cài đặt hệ thống để cấp quyền truy cập thông tin vị trí ở chế độ nền cho các ứng dụng.
  • Chế độ hiển thị gói: Khi một ứng dụng truy vấn danh sách các ứng dụng đã cài đặt trên thiết bị, danh sách trả về sẽ được lọc.

Để tìm hiểu thêm, hãy xem trang Quyền riêng tư.

Bảo mật

Gắn thẻ con trỏ trên vùng nhớ khối xếp

Thông tin chi tiết về các thay đổi

Đổi tên: NATIVE_HEAP_POINTER_TAGGING

Mã thay đổi: 135754954

Cách bật/tắt

Khi kiểm thử khả năng tương thích của ứng dụng với Android 11, bạn có thể bật hoặc tắt thay đổi này bằng các lệnh ADB sau đây:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

Để biết thêm thông tin về khung tương thích và các thay đổi về nút bật/tắt, hãy xem bài viết Kiểm thử và gỡ lỗi các thay đổi về hành vi của nền tảng trong ứng dụng.

Con trỏ vùng nhớ khối xếp hiện có một thẻ khác 0 trong byte quan trọng nhất (MSB). Giờ đây, các ứng dụng sử dụng con trỏ không chính xác, bao gồm cả những ứng dụng sửa đổi MSB, có thể gặp sự cố hoặc gặp phải các sự cố khác. Thay đổi này là cần thiết để hỗ trợ phần cứng trong tương lai có bật Tiện ích gắn thẻ bộ nhớ (MTE) ARM. Để tìm hiểu thêm, hãy xem bài viết Con trỏ được gắn thẻ.

Để tắt tính năng này, hãy xem tài liệu về tệp kê khai allowNativeHeapPointerTagging.

Cập nhật thông báo ngắn

Thông báo ngắn tuỳ chỉnh trong nền đã bị chặn

Vì lý do bảo mật và để duy trì trải nghiệm tốt cho người dùng, hệ thống sẽ chặn các thông báo ngắn chứa thành phần hiển thị tuỳ chỉnh nếu những thông báo ngắn đó được một ứng dụng nhắm đến Android 11 trở lên gửi từ chế độ nền. Xin lưu ý rằng thông báo ngắn bằng văn bản vẫn được phép sử dụng; đây là các thông báo ngắn được tạo bằng Toast.makeText() mà không gọi setView().

Nếu ứng dụng của bạn cố gắng đăng một thông báo ngắn chứa một khung hiển thị tuỳ chỉnh ở chế độ nền, thì hệ thống sẽ không hiện thông báo đó cho người dùng. Thay vào đó, hệ thống sẽ ghi lại thông báo sau trong logcat:

W/NotificationService: Blocking custom toast from package \
  <package> due to package not in the foreground

Lệnh gọi lại thông báo ngắn

Nếu bạn muốn nhận thông báo khi một thông báo ngắn (văn bản hoặc tuỳ chỉnh) xuất hiện hoặc biến mất, hãy sử dụng phương thức addCallback() đã được thêm vào Android 11.

Các thay đổi về API thông báo ngắn văn bản

Các ứng dụng nhắm đến Android 11 trở lên sẽ gặp phải những tác dụng phụ sau đây đối với thông báo ngắn dạng văn bản:

Khả năng kết nối

Quyền đọc bị hạn chế vào cơ sở dữ liệu APN

Thông tin chi tiết về các thay đổi

Đổi tên: APN_READING_PERMISSION_CHANGE_ID

Mã thay đổi: 124107808

Cách bật/tắt

Khi kiểm thử khả năng tương thích của ứng dụng với Android 11, bạn có thể bật hoặc tắt thay đổi này bằng các lệnh ADB sau đây:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

Để biết thêm thông tin về khung tương thích và các thay đổi về nút bật/tắt, hãy xem bài viết Kiểm thử và gỡ lỗi các thay đổi về hành vi của nền tảng trong ứng dụng.

Các ứng dụng nhắm đến Android 11 hiện yêu cầu quyền Manifest.permission.WRITE_APN_SETTINGS để đọc hoặc truy cập vào cơ sở dữ liệu APN của nhà cung cấp dịch vụ Điện thoại. Việc cố gắng truy cập vào cơ sở dữ liệu APN mà không có quyền này sẽ tạo ra một ngoại lệ về bảo mật.

Hỗ trợ tiếp cận

Khai báo hoạt động tương tác với công cụ TTS trong tệp kê khai

Do những thay đổi đối với chế độ hiển thị gói, các ứng dụng nhắm đến Android 11 và tương tác với công cụ chuyển văn bản sang lời nói (TTS) cần thêm phần tử <queries> sau đây vào tệp kê khai:

<queries>
  <intent>
    <action
       android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

Khai báo việc sử dụng nút hỗ trợ tiếp cận trong tệp siêu dữ liệu

Thông tin chi tiết về các thay đổi

Đổi tên: REQUEST_ACCESSIBILITY_BUTTON_CHANGE

Mã thay đổi: 136293963

Cách bật/tắt

Khi kiểm thử khả năng tương thích của ứng dụng với Android 11, bạn có thể bật hoặc tắt thay đổi này bằng các lệnh ADB sau đây:

adb shell am compat enable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME
adb shell am compat disable (136293963|REQUEST_ACCESSIBILITY_BUTTON_CHANGE) PACKAGE_NAME

Để biết thêm thông tin về khung tương thích và các thay đổi về nút bật/tắt, hãy xem bài viết Kiểm thử và gỡ lỗi các thay đổi về hành vi của nền tảng trong ứng dụng.

Kể từ Android 11, dịch vụ hỗ trợ tiếp cận của bạn sẽ không thể khai báo trong thời gian chạy rằng dịch vụ này có mối liên kết với nút hỗ trợ tiếp cận của hệ thống. Nếu bạn thêm AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON vào thuộc tính flags của đối tượng AccessibilityServiceInfo, khung sẽ không truyền các sự kiện gọi lại nút hỗ trợ tiếp cận đến dịch vụ của bạn.

Để nhận các sự kiện gọi lại hỗ trợ tiếp cận trong dịch vụ hỗ trợ tiếp cận của bạn, hãy sử dụng tệp siêu dữ liệu của dịch vụ hỗ trợ tiếp cận để khai báo mối liên kết của dịch vụ với nút hỗ trợ tiếp cận. Đưa giá trị flagRequestAccessibilityButton vào định nghĩa về thuộc tính accessibilityFlags. Một vị trí phổ biến cho tệp siêu dữ liệu của dịch vụ hỗ trợ tiếp cận là res/raw/accessibilityservice.xml.

Camera

Các thao tác theo ý định đối với nội dung đa phương tiện cần đến máy ảnh mặc định của hệ thống

Kể từ Android 11, chỉ các ứng dụng máy ảnh cài sẵn trên hệ thống mới có thể phản hồi các thao tác theo ý định sau đây:

Nếu có nhiều ứng dụng máy ảnh được cài đặt sẵn trên hệ thống, hệ thống sẽ hiển thị hộp thoại để người dùng chọn một ứng dụng. Nếu muốn ứng dụng của mình dùng một ứng dụng máy ảnh cụ thể của bên thứ ba để thay mặt ứng dụng đó chụp ảnh hoặc quay video, thì bạn có thể làm rõ các ý định này bằng cách đặt tên gói hoặc thành phần cho ý định.

Đóng gói và cài đặt ứng dụng

Tệp tài nguyên được nén

Thông tin chi tiết về các thay đổi

Đổi tên: RESOURCES_ARSC_COMPRESSED

Mã thay đổi: 132742131

Cách bật/tắt

Khi kiểm thử khả năng tương thích của ứng dụng với Android 11, bạn có thể bật hoặc tắt thay đổi này bằng các lệnh ADB sau đây:

adb shell am compat enable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME
adb shell am compat disable (132742131|RESOURCES_ARSC_COMPRESSED) PACKAGE_NAME

Để biết thêm thông tin về khung tương thích và các thay đổi về nút bật/tắt, hãy xem bài viết Kiểm thử và gỡ lỗi các thay đổi về hành vi của nền tảng trong ứng dụng.

Bạn không thể cài đặt các ứng dụng nhắm mục tiêu Android 11 (API cấp 30) trở lên nếu chúng có chứa tệp resources.arsc nén hoặc nếu tệp này không được căn chỉnh trên ranh giới 4 byte. Hệ thống không thể ánh xạ tệp này nếu có một trong hai điều kiện này. Các bảng tài nguyên không thể ánh xạ bộ nhớ phải được đọc vào một vùng đệm trong RAM, dẫn đến áp lực bộ nhớ không cần thiết lên hệ thống và làm tăng đáng kể mức sử dụng RAM trên thiết bị.

Nếu trước đây bạn đang dùng một tệp resources.arsc nén, hãy thử các chiến lược thay thế, chẳng hạn như rút gọn tài nguyên ứng dụng hoặc các phương thức khác để rút gọn, làm rối mã nguồn và tối ưu hoá ứng dụng.

Hiện bắt buộc sử dụng Lược đồ chữ ký APK phiên bản 2

Các ứng dụng nhắm mục tiêu đến Android 11 (API cấp 30) hiện chỉ được ký bằng Lược đồ chữ ký APK v1 giờ đây cũng phải được ký bằng Lược đồ chữ ký APK v2 trở lên. Người dùng không thể cài đặt hoặc cập nhật các ứng dụng chỉ được ký bằng Lược đồ chữ ký APK v1 trên những thiết bị chạy Android 11.

Để xác minh rằng ứng dụng của bạn đang được ký bằng Lược đồ chữ ký APK phiên bản 2 trở lên, bạn có thể dùng Android Studio hoặc công cụ apksigner trên dòng lệnh.

Firebase

Firebase JobDispatcher và GCMNetworkManager

Nếu ứng dụng của bạn nhắm đến API cấp 30 trở lên, thì các lệnh gọi API JobDispatcher và GcmNetworkManager của Firebase sẽ bị tắt trên các thiết bị chạy Android 6.0 (API cấp 23) trở lên. Để biết thông tin về việc di chuyển, hãy xem các phần Di chuyển từ Firebase JobDispatcher sang WorkManagerDi chuyển từ GCMNetworkManager sang WorkManager.

Nhận dạng lời nói

Do các thay đổi đối với chế độ hiển thị gói, các ứng dụng nhắm đến Android 11 và tương tác với dịch vụ nhận dạng lời nói cần thêm phần tử <queries> sau đây vào tệp kê khai:

<queries>
  <intent>
    <action
       android:name="android.speech.RecognitionService" />
  </intent>
</queries>

Các thay đổi về lệnh gọi lại cho OnSharedPreferencesChangeListener

Thông tin chi tiết về các thay đổi

Đổi tên: CALLBACK_ON_CLEAR_CHANGE

Mã thay đổi: 119147584

Cách bật/tắt

Khi kiểm thử khả năng tương thích của ứng dụng với Android 11, bạn có thể bật hoặc tắt thay đổi này bằng các lệnh ADB sau đây:

adb shell am compat enable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME
adb shell am compat disable (119147584|CALLBACK_ON_CLEAR_CHANGE) PACKAGE_NAME

Để biết thêm thông tin về khung tương thích và các thay đổi về nút bật/tắt, hãy xem bài viết Kiểm thử và gỡ lỗi các thay đổi về hành vi của nền tảng trong ứng dụng.

Đối với các ứng dụng nhắm mục tiêu Android 11 (API cấp 30), bất cứ khi nào Editor.clear được gọi, lệnh gọi lại giờ đây sẽ được thực hiện đến OnSharedPreferenceChangeListener.onSharedPreferenceChanged bằng khoá null.

Các hạn chế đối với giao diện không phải SDK

Android 11 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 11, 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 11. Để tìm hiểu tổng quan thêm về giao diện không phải SDK, hãy xem Hạn chế đối với giao diện không phải SDK.