Nền tảng Android 11 có những 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 á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).
Hãy nhớ xem lại danh sách các thay đổi về hành vi chỉ ảnh hưởng đến những ứng dụng nhắm đến Android 11.
Quyền riêng tư
Android 11 giới thiệu một số 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 quyền truy cập tạm thời vào các quyền về vị trí, micrô và máy ảnh.
- Khả năng hiển thị hộp thoại cấp quyền: Việc liên tục từ chối một quyền ngụ ý "không hỏi lại".
- Kiểm tra quyền truy cập dữ liệu: Nắm được thông tin chi tiết về vị trí mà ứ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 các thư viện phụ thuộc.
- Quyề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_WINDOWtheo yêu cầu. Ngoài ra, ý định bao gồm hành động ý địnhACTION_MANAGE_OVERLAY_PERMISSIONluô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 ICCID không thể đặt lại thông qua phương thức
getIccId()bị hạn chế. Phương thức này trả về một chuỗi không rỗng. Để xác định duy nhất một SIM đã cài đặt trên thiết bị, hãy sử dụnggetSubscriptionId()phương thức thay thế. 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 vật lý và SIM điện tử. Giá trị của giá trị nhận dạng này ổ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 với Hệ thống thông báo tiếp xúc trong tâm trí. 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à một trường hợp ngoại lệ chỉ dành 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 hệ thống này không thể suy ra 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, tất cả các ứng dụng khác vẫn bị cấm thực hiện quét tìm Bluetooth, trừ phi chế độ cài đặt vị trí trên thiết bị được bật và người dùng đã cấp quyền truy cập vị trí cho các ứng dụng đó. Bạn có thể đọc thêm trong bài viết 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
Việc triển khai SSLSocket mặc định của Android dựa trên Conscrypt.
Kể từ Android 11, việc triển khai đó được xây dựng nội bộ
dựa trên SSLEngine của Conscrypt.
Bộ phân bổ được tăng cường Scudo
Android 11 sử dụng
Bộ phân bổ được tăng cường Scudo
nội bộ để phân bổ vùng nhớ heap. Scudo có khả năng phát hiện và giảm thiểu
một số loại lỗi vi phạm về an toàn bộ nhớ. Nếu bạn thấy các 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ố Scudo.
Số liệu thống kê về việc 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ề việc sử dụng ứng dụng của mỗi người dùng trong bộ nhớ được mã hoá bằng thông tin đăng nhập. Do đó,
cả hệ thống và bất kỳ ứng dụng nào cũng không thể truy cập vào dữ liệu đó, trừ phi
isUserUnlocked()
trả về true. Điều này xảy ra sau khi một trong những điều sau đây diễn ra:
- Người dùng mở khoá thiết bị lần đầu tiên sau khi hệ thống khởi độ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 sẽ trả về giá trị rỗng hoặc giá trị trống.
Hỗ trợ trình mô phỏng cho 5G
Android 11 bổ sung các 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 bạn thêm,
bạn có thể sử dụng các tính năng mới của Android SDK
trình mô phỏng. Chức năng mới
này đã đượ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 đặt mức sử dụng dữ liệu có tính phí để xác minh
rằng ứng dụng của bạn phản hồi phù 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 hỗ trợ gỡ lỗi cho các ứng dụng để xác định
các lệnh gọi API JobScheduler tiềm ẩn đã vượt quá một số giới hạn về tốc độ.
Nhà phát triển có thể sử dụng tính năng này để xác định các vấn đề tiềm ẩn về hiệu suất. Đối với
các ứ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 về tốc độ sẽ trả về RESULT_FAILURE.
Giới hạn được đặt sao cho không ảnh hưởng đến các trường hợp sử dụng hợp lệ.
Trình dọn dẹp bộ mô tả tệp (fdsan)
Android 10 giới thiệu fdsan (trình dọn dẹp bộ mô tả tệp).
fdsan phát hiện việc xử lý sai quyền sở hữu bộ 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 đang thay đổi trong
Android 11. fdsan giờ đây sẽ huỷ bỏ khi phát hiện thấy lỗi;
hành vi trước đó là ghi nhật ký cảnh báo và tiếp tục. Nếu bạn thấy 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 bao gồm danh sách cập nhật về các giao diện không phải SDK bị hạn chế dựa trên sự hợp tác với nhà phát triển Android và hoạt động 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ể không ảnh hưởng ngay đến bạn. 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 về những hạn chế đối với giao diện không phải SDK trong Android 11. Để tìm hiểu thêm về giao diện không phải SDK nói chung, hãy xem bài viết Các hạn chế đối với giao diện không phải SDK interfaces.
Đã xoá thư viện dùng chung Maps v1
V1 của thư viện dùng chung Maps đã bị xoá hoàn toàn trong Android 11. Thư viện này trước đây đã bị ngừng hoạt động và ngừng hoạt động đối với các ứng dụng trong Android 10. Những ứng dụng trước đây dựa vào thư viện dùng chung này cho các thiết bị chạy Android 9 (API cấp 28) trở xuống nên sử dụng Maps SDK cho Android thay thế.
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_PERMISSION
và
FLAG_GRANT_WRITE_URI_PERMISSION.
Bằng cách đó, nếu ứng dụng khác nhắm đến Android 11, thì ứng dụng đó vẫn có thể truy cập vào URI nội dung. Ứng dụng của bạn phải bao gồm các 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 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 nhà cung cấp nội dung không được xuất. Chúng tôi đã đề xuất phương pháp hay nhất về bảo mật này.
Tải thư viện
Tải thư viện chung ICU bằng đườ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 giá trị nhận dạng 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", ...).