Thay đổi về hành vi: tất cả ứng dụng

Nền tảng 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 sau đây về hành vi sẽ áp dụng cho tất cả ứng dụng khi chạy trên Android 11, bất kể targetSdkVersion. Bạn nên kiểm thử ứng dụng rồi sửa đổi để hỗ trợ những thay đổi này cho phù hợp (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách thay đổi về hành vi chỉ ảnh hưởng đến ứng dụng nhắm đế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:

  • Quyền một lần: Cho phép người dùng cấp thêm quyền truy cập tạm thời vào các quyền truy cập thông tin vị trí, micrô và máy ảnh.
  • Chế độ hiển thị hộp thoại cấp quyền: Việc nhiều lần từ chối một quyền sẽ ngụ ý rằng "không hỏi lại".
  • Kiểm tra quyền truy cập dữ liệu: Nhận thông tin chi tiết về nơi ứng dụng của bạn truy cập vào dữ liệu riêng tư, cả trong mã của ứng dụng và trong mã của thư viện phụ thuộc.
  • Quyền trên cửa sổ cảnh báo hệ thống: Một số lớp ứng dụng sẽ tự động được cấp quyền SYSTEM_ALERT_WINDOW khi có yêu cầu. Ngoài ra, các ý định bao gồm thao tác theo ý định ACTION_MANAGE_OVERLAY_PERMISSION sẽ luôn đưa người dùng đến một màn hình trong phần cài đặt hệ thống.
  • Giá trị nhận dạng SIM vĩnh viễn: Trên Android 11 trở lên, quyền truy cập vào các ICCID không thể đặt lại thông qua phương thức getIccId() sẽ bị hạn chế. Phương thức này trả về một chuỗi trống, khác rỗng. Để xác định riêng biệt một SIM đã cài đặt trên thiết bị, hãy sử dụng phương thức getSubscriptionId(). Mã nhận dạng gói thuê bao cung cấp một giá trị chỉ mục (bắt đầu từ 1) để xác định duy nhất các SIM đã cài đặt, bao gồm cả SIM thực và SIM điện tử. Giá trị của giá trị nhận dạng này là ổn định đối với một SIM nhất định, trừ phi thiết bị được đặt lại về trạng thái ban đầu.

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

Thông báo tiếp xúc

Android 11 cập nhật nền tảng này, có lưu ý đến Hệ thống thông báo tiếp xúc. Giờ đây, người dùng có thể chạy các ứng dụng Thông báo tiếp xúc trên Android 11 mà không cần bật chế độ cài đặt vị trí trên thiết bị. Đây là trường hợp ngoại lệ dành riêng cho Hệ thống thông báo tiếp xúc vì hệ thống này được thiết kế theo cách mà các ứng dụng sử dụng không thể dự đoán vị trí của thiết bị thông qua tính năng quét tìm Bluetooth.

Để bảo vệ quyền riêng tư của người dùng, mọi ứng dụng khác vẫn bị cấm thực hiện quét Bluetooth, trừ phi chế độ cài đặt vị trí của thiết bị được bật và người dùng đã cấp quyền truy cập thông tin vị trí cho họ. Bạn có thể đọc thêm trong bài đăng Thông tin cập nhật về Thông báo tiếp xúc.

Bảo mật

Cổng SSL dùng công cụ SSL Conscrypt theo mặc định

Phương thức triển khai SSLSocket mặc định của Android dựa trên Conscrypt. Kể từ Android 11, hoạt động triển khai đó được xây dựng nội bộ dựa trên SSLEngine của Conscrypt.

Trình phân bổ cứng Scudo

Android 11 sử dụng Scudo Hardened Allocator trong nội bộ để phân bổ vùng nhớ khối xếp dịch vụ. Scudo có thể phát hiện và giảm thiểu một số loại vi phạm về an toàn bộ nhớ. Nếu bạn gặp sự cố liên quan đến Scudo (ví dụ: Scudo ERROR:) trong báo cáo sự cố gốc, hãy tham khảo tài liệu Khắc phục sự cố của Scudo.

Số liệu thống kê sử dụng ứng dụng

Để bảo vệ người dùng tốt hơn, Android 11 lưu trữ số liệu thống kê về mức sử dụng ứng dụng của từng người dùng trong bộ nhớ được mã hoá dành cho thông tin đăng nhập. Do đó, cả hệ thống và ứng dụng đều không thể truy cập vào dữ liệu đó trừ phi isUserUnlocked() trả về true, xảy ra sau khi một trong các điều sau xảy ra:

  • Người dùng mở khoá thiết bị lần đầu tiên sau khi khởi động hệ thống.
  • Người dùng chuyển sang tài khoản của họ trên thiết bị.

Nếu ứng dụng của bạn đã liên kết với một thực thể của UsageStatsManager, hãy kiểm tra để đảm bảo rằng bạn gọi các phương thức trên đối tượng này sau khi người dùng mở khoá thiết bị. Nếu không, API hiện sẽ trả về các giá trị rỗng hoặc trống.

Hỗ trợ trình mô phỏng cho 5G

Android 11 thêm API 5G để cho phép ứng dụng của bạn thêm các tính năng tiên tiến. Để kiểm thử các tính năng khi thêm, bạn có thể sử dụng các tính năng mới của Trình mô phỏng SDK Android. Chức năng mới đã được thêm vào Trình mô phỏng phiên bản 30.0.22. Việc chọn chế độ cài đặt mạng 5G sẽ đặt TelephonyDisplayInfo thành OVERRIDE_NETWORK_TYPE_NR_NSA, sửa đổi băng thông ước tính và cho phép bạn thiết lập mức đo lượng dữ liệu để xác minh rằng ứng dụng của bạn phản hồi thích hợp với các thay đổi về trạng thái NET_CAPABILITY_TEMPORARILY_NOT_METERED.

Hiệu suất và gỡ lỗi

Gỡ lỗi giới hạn lệnh gọi API JobScheduler

Android 11 cung cấp tính năng hỗ trợ gỡ lỗi cho các ứng dụng để xác định các lệnh gọi API JobScheduler có thể đã vượt quá một số giới hạn số lượng yêu cầu nhất định. Nhà phát triển có thể dùng cơ sở này để xác định các vấn đề tiềm ẩn về hiệu suất. Đối với ứng dụng có thuộc tính tệp kê khai debuggable được đặt thành true, các lệnh gọi API JobScheduler vượt quá giới hạn số lượng sẽ trả về RESULT_FAILURE. Các giới hạn được đặt ra sao cho các trường hợp sử dụng hợp pháp sẽ không bị ảnh hưởng.

Trình dọn dẹp chỉ số mô tả tệp (fdsan)

Android 10 ra mắt fdsan (trình dọn dẹp phần mô tả tệp). fdsan phát hiện hành vi xử lý sai cách quyền sở hữu chỉ số mô tả tệp, chẳng hạn như sử dụng sau khi đóng và đóng hai lần. Chế độ mặc định cho fdsan sẽ thay đổi trong Android 11. fdsan hiện huỷ khi phát hiện lỗi; hành vi trước đó là ghi lại cảnh báo và tiếp tục. Nếu bạn gặp sự cố do fdsan trong ứng dụng của mình, hãy tham khảo fdsan documentation.

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.

Đã xóa thư viện chia sẻ Maps phiên bản 1

Phiên bản 1 của thư viện chia sẻ Maps đã bị xoá hoàn toàn trong Android 11. Thư viện này trước đây đã ngừng hoạt động và ngừng hoạt động đối với các ứng dụng trong Android 10. Các ứng dụng trước đây dựa vào thư viện dùng chung này cho thiết bị chạy Android 9 (API cấp 28) trở xuống nên sử dụng SDK Maps cho Android.

Tương tác với ứng dụng khác

Chia sẻ URI nội dung

Nếu ứng dụng của bạn chia sẻ URI nội dung với một ứng dụng khác, thì ý định phải cấp quyền truy cập vào URI bằng cách đặt ít nhất một trong các cờ ý định sau: FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION. Bằng cách đó, nếu ứng dụng kia nhắm đến Android 11, thì ứng dụng đó vẫn có thể truy cập URI nội dung. Ứng dụng của bạn phải bao gồm cờ ý định ngay cả khi URI nội dung được liên kết với một nhà cung cấp nội dung mà ứng dụng của bạn không sở hữu.

Nếu ứng dụng của bạn sở hữu trình cung cấp nội dung được liên kết với URI nội dung, hãy xác minh rằng bạn không xuất trình cung cấp nội dung. Chúng tôi đã đề xuất phương pháp bảo mật hay nhất này.

Đang tải thư viện

Đang tải thư viện chung ICU với đường dẫn tuyệt đối

Các ứng dụng nhắm đến API 28 trở xuống không thể sử dụng dlopen(3) để tải libicuuc bằng đường dẫn tuyệt đối "/system/lib/libicuuc.so". Đối với những ứng dụng đó, dlopen("/system/lib/libicuuc.so", ...) sẽ trả về một xử lý rỗng.

Thay vào đó, để tải thư viện, vui lòng sử dụng tên thư viện làm tên tệp, ví dụ: dlopen("libicuuc.so", ...).