Giống như các bản phát hành trước, Android 16 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 16 trở lên. Nếu ứng dụng của bạn nhắm đến Android 16 trở lên, bạn nên điều chỉnh ứng dụng để hỗ trợ những hành vi này (nếu cần).
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 16 bất kể targetSdkVersion
của ứng dụng.
Trải nghiệm người dùng và giao diện người dùng hệ thống
Android 16 (API cấp 36) có các thay đổi sau đây nhằm tạo ra trải nghiệm người dùng nhất quán và trực quan hơn.
Xoá chế độ chọn không hiển thị tràn viền
Android 15 đã thực thi chế độ tràn viền cho các ứng dụng nhắm đến Android 15 (API cấp 35), nhưng ứng dụng của bạn có thể chọn không sử dụng bằng cách đặt R.attr#windowOptOutEdgeToEdgeEnforcement
thành true
. Đối với các ứng dụng nhắm đến Android 16 (API cấp 36), R.attr#windowOptOutEdgeToEdgeEnforcement
không còn được dùng nữa và bị tắt, đồng thời ứng dụng của bạn không thể chọn không sử dụng chế độ tràn viền.
- Nếu ứng dụng của bạn nhắm đến Android 16 (API cấp 36) và đang chạy trên thiết bị Android 15, thì
R.attr#windowOptOutEdgeToEdgeEnforcement
sẽ tiếp tục hoạt động. - Nếu ứng dụng của bạn nhắm đến Android 16 (API cấp 36) và đang chạy trên thiết bị Android 16, thì
R.attr#windowOptOutEdgeToEdgeEnforcement
sẽ bị tắt.
Để kiểm thử trong Android 16 Beta 3, hãy đảm bảo ứng dụng của bạn hỗ trợ tràn viền và xoá mọi hoạt động sử dụng R.attr#windowOptOutEdgeToEdgeEnforcement
để ứng dụng cũng hỗ trợ tràn viền trên thiết bị Android 15. Để hỗ trợ chế độ tràn viền, hãy xem hướng dẫn về Compose và Khung hiển thị.
Bạn phải di chuyển hoặc chọn không sử dụng tính năng xem trước thao tác quay lại
Đối với các ứng dụng nhắm đến Android 16 (API cấp 36) trở lên và chạy trên thiết bị Android 16 trở lên, ảnh động dự đoán thao tác quay lại hệ thống (quay lại màn hình chính, giữa các tác vụ và giữa các hoạt động) được bật theo mặc định.
Ngoài ra, onBackPressed
không được gọi và KeyEvent.KEYCODE_BACK
không được gửi nữa.
Nếu ứng dụng của bạn chặn sự kiện quay lại và bạn chưa di chuyển sang tính năng xem trước thao tác quay lại, hãy cập nhật ứng dụng để sử dụng các API điều hướng quay lại được hỗ trợ. Hoặc tạm thời chọn không sử dụng bằng cách đặt thuộc tính android:enableOnBackInvokedCallback
thành false
trong thẻ <application>
hoặc <activity>
của tệp AndroidManifest.xml
của ứng dụng.
Ngừng sử dụng và vô hiệu hoá API phông chữ thanh lịch
Các ứng dụng nhắm đến Android 15 (API cấp 35) có thuộc tính elegantTextHeight
TextView
được đặt thành true
theo mặc định, thay thế phông chữ thu gọn bằng phông chữ dễ đọc hơn nhiều. Bạn có thể ghi đè hành vi này bằng cách đặt thuộc tính elegantTextHeight
thành false
.
Android 16 không dùng thuộc tính elegantTextHeight
nữa và thuộc tính này sẽ bị bỏ qua khi ứng dụng của bạn nhắm đến Android 16. "Phông chữ giao diện người dùng" do các API này kiểm soát sẽ ngừng hoạt động, vì vậy, bạn nên điều chỉnh mọi bố cục để đảm bảo việc hiển thị văn bản nhất quán và phù hợp với tương lai bằng tiếng Ả Rập, tiếng Lào, tiếng Myanmar, tiếng Tamil, tiếng Gujarati, tiếng Kannada, tiếng Malayalam, tiếng Odia, tiếng Telugu hoặc tiếng Thái.

elegantTextHeight
cho các ứng dụng nhắm đến Android 14 (API cấp 34) trở xuống hoặc cho các ứng dụng nhắm đến Android 15 (API cấp 35) đã ghi đè hành vi mặc định bằng cách đặt thuộc tính elegantTextHeight
thành false
.
elegantTextHeight
hành vi cho các ứng dụng nhắm đến Android
16 hoặc cho các ứng dụng nhắm đến Android 15 (API cấp 35) không ghi đè
mặc định bằng cách đặt thuộc tính elegantTextHeight
thành
false
.Chức năng cốt lõi
Android 16 (API cấp 36) bao gồm các thay đổi sau đây để sửa đổi hoặc mở rộng nhiều tính năng cốt lõi của hệ thống Android.
Tối ưu hoá việc lên lịch công việc theo tỷ lệ cố định
Trước khi nhắm đến Android 16, khi scheduleAtFixedRate
bỏ lỡ một lần thực thi tác vụ do nằm ngoài vòng đời quy trình hợp lệ, tất cả các lần thực thi bị bỏ lỡ sẽ thực thi ngay khi ứng dụng quay lại một vòng đời hợp lệ.
Khi nhắm đến Android 16, tối đa một lần thực thi bị bỏ lỡ của scheduleAtFixedRate
sẽ được thực thi ngay lập tức khi ứng dụng quay lại một vòng đời hợp lệ. Thay đổi về hành vi này dự kiến sẽ cải thiện hiệu suất của ứng dụng. Kiểm thử hành vi này trong ứng dụng để xem ứng dụng của bạn có bị ảnh hưởng hay không.
Bạn cũng có thể kiểm thử bằng cách sử dụng khung tương thích của ứng dụng và bật cờ tương thích STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS
.
Kiểu dáng thiết bị
Android 16 (API cấp 36) có các thay đổi sau đây đối với ứng dụng khi hiển thị trên thiết bị màn hình lớn.
Bố cục thích ứng (Adaptive Layouts)
Hiện tại, các ứng dụng Android chạy trên nhiều thiết bị (chẳng hạn như điện thoại, máy tính bảng, thiết bị có thể gập lại, máy tính, ô tô và TV) và các chế độ cửa sổ trên màn hình lớn (chẳng hạn như màn hình chia đôi và cửa sổ máy tính), nên nhà phát triển nên xây dựng ứng dụng Android thích ứng với mọi kích thước màn hình và cửa sổ, bất kể hướng thiết bị. Các mô hình như hạn chế hướng và khả năng đổi kích thước quá hạn chế trong thế giới đa thiết bị ngày nay.
Bỏ qua các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình
Đối với các ứng dụng nhắm đến Android 16 (API cấp 36), Android 16 có các thay đổi về cách hệ thống quản lý các hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình. Trên màn hình có chiều rộng nhỏ nhất >= 600 dp, các quy định hạn chế này sẽ không còn áp dụng nữa. Ứng dụng cũng lấp đầy toàn bộ cửa sổ hiển thị, bất kể tỷ lệ khung hình hoặc hướng ưu tiên của người dùng, và không sử dụng khung hòm thư.
Thay đổi này sẽ giới thiệu một hành vi mới theo tiêu chuẩn của nền tảng. Android đang chuyển sang một mô hình trong đó các ứng dụng dự kiến sẽ thích ứng với nhiều hướng, kích thước màn hình và tỷ lệ khung hình. Các hạn chế như hướng cố định hoặc khả năng đổi kích thước bị hạn chế sẽ cản trở khả năng thích ứng của ứng dụng. Vì vậy, bạn nên tạo ứng dụng thích ứng để mang lại trải nghiệm người dùng tốt nhất có thể.
Bạn cũng có thể kiểm thử hành vi này bằng cách sử dụng khung tương thích của ứng dụng và bật cờ tương thích UNIVERSAL_RESIZABLE_BY_DEFAULT
.
Các thay đổi có thể gây lỗi thường gặp
Việc bỏ qua các quy tắc hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình có thể ảnh hưởng đến giao diện người dùng của ứng dụng trên một số thiết bị, đặc biệt là các thành phần được thiết kế cho bố cục nhỏ bị khoá ở hướng dọc: ví dụ: các vấn đề như bố cục bị kéo giãn, ảnh động và thành phần ngoài màn hình. Mọi giả định về tỷ lệ khung hình hoặc hướng đều có thể gây ra vấn đề về hình ảnh cho ứng dụng. Tìm hiểu thêm về cách tránh các vấn đề này và cải thiện hành vi thích ứng của ứng dụng.
Việc cho phép xoay thiết bị sẽ dẫn đến việc tạo lại nhiều hoạt động hơn, điều này có thể dẫn đến việc mất trạng thái người dùng nếu không được lưu giữ đúng cách. Tìm hiểu cách lưu chính xác trạng thái giao diện người dùng trong bài viết Lưu trạng thái giao diện người dùng.
Thông tin chi tiết về cách triển khai
Các thuộc tính tệp kê khai và API thời gian chạy sau đây sẽ bị bỏ qua trên các thiết bị màn hình lớn ở chế độ toàn màn hình và nhiều cửa sổ:
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
Các giá trị sau đây cho screenOrientation
, setRequestedOrientation()
và getRequestedOrientation()
sẽ bị bỏ qua:
portrait
reversePortrait
sensorPortrait
userPortrait
landscape
reverseLandscape
sensorLandscape
userLandscape
Đối với khả năng đổi kích thước màn hình, android:resizeableActivity="false"
, android:minAspectRatio
và android:maxAspectRatio
không có tác dụng.
Đối với các ứng dụng nhắm đến Android 16 (API cấp 36), theo mặc định, các quy tắc hạn chế về hướng ứng dụng, khả năng đổi kích thước và tỷ lệ khung hình sẽ bị bỏ qua trên màn hình lớn, nhưng mọi ứng dụng chưa sẵn sàng hoàn toàn có thể tạm thời ghi đè hành vi này bằng cách chọn không sử dụng (khiến hành vi trước đó là được đặt ở chế độ tương thích).
Ngoại lệ
Các hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình của Android 16 không áp dụng trong các trường hợp sau:
- Trò chơi (dựa trên cờ
android:appCategory
) - Người dùng chọn rõ ràng hành vi mặc định của ứng dụng trong phần cài đặt tỷ lệ khung hình của thiết bị
- Màn hình nhỏ hơn
sw600dp
Tạm thời chọn không tham gia
Để chọn không sử dụng một hoạt động cụ thể, hãy khai báo thuộc tính tệp kê khai PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
Nếu quá nhiều phần của ứng dụng chưa sẵn sàng cho Android 16, bạn có thể chọn không sử dụng hoàn toàn bằng cách áp dụng cùng một thuộc tính ở cấp ứng dụng:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
Sức khoẻ và thể chất
Android 16 (API cấp 36) bao gồm các thay đổi sau đây liên quan đến dữ liệu sức khoẻ và thể chất.
Quyền đối với dữ liệu sức khoẻ và thể hình
Đối với các ứng dụng nhắm đến Android 16 (API cấp 36) trở lên, các quyền BODY_SENSORS
đang chuyển sang các quyền chi tiết trong android.permissions.health
cũng được Health Connect sử dụng. Mọi API trước đây yêu cầu quyền BODY_SENSORS
hoặc BODY_SENSORS_BACKGROUND
hiện đều yêu cầu quyền android.permissions.health
tương ứng. Điều này ảnh hưởng đến các loại dữ liệu, API và loại dịch vụ trên nền trước sau đây:
HEART_RATE_BPM
từ Dịch vụ sức khoẻ trên WearSensor.TYPE_HEART_RATE
từ Trình quản lý cảm biến AndroidheartRateAccuracy
vàheartRateBpm
từ WearProtoLayout
FOREGROUND_SERVICE_TYPE_HEALTH
trong đó cần có quyềnandroid.permission.health
tương ứng thay vìBODY_SENSORS
Nếu sử dụng các API này, ứng dụng của bạn hiện sẽ yêu cầu các quyền chi tiết tương ứng:
- Để theo dõi Nhịp tim, SpO2 hoặc Nhiệt độ da trong khi sử dụng: yêu cầu quyền chi tiết trong
android.permissions.health
, chẳng hạn nhưREAD_HEART_RATE
thay vìBODY_SENSORS
. - Để truy cập cảm biến ở chế độ nền: hãy yêu cầu
READ_HEALTH_DATA_IN_BACKGROUND
thay vìBODY_SENSORS_BACKGROUND
.
Các quyền này giống với các quyền bảo vệ quyền truy cập để đọc dữ liệu từ Health Connect, kho dữ liệu Android dành cho dữ liệu sức khoẻ, thể chất và chăm sóc sức khoẻ tinh thần.
Ứng dụng dành cho thiết bị di động
Các ứng dụng di động di chuyển để sử dụng READ_HEART_RATE
và các quyền chi tiết khác cũng phải khai báo một hoạt động để hiển thị chính sách quyền riêng tư của ứng dụng. Đây là yêu cầu giống như Health Connect.
Khả năng kết nối
Android 16 (API cấp 36) có các thay đổi sau đây trong ngăn xếp Bluetooth để cải thiện khả năng kết nối với các thiết bị ngoại vi.
Ý định mới để xử lý việc mất liên kết và thay đổi về mã hoá
Trong phần Cải thiện khả năng xử lý việc mất liên kết, Android 16 cũng giới thiệu 2 ý định mới để giúp ứng dụng nhận biết rõ hơn về việc mất liên kết và các thay đổi về mã hoá.
Ứng dụng nhắm đến Android 16 hiện có thể:
- Nhận ý định
ACTION_KEY_MISSING
khi phát hiện mất liên kết từ xa, cho phép họ cung cấp ý kiến phản hồi chi tiết hơn cho người dùng và thực hiện các hành động thích hợp. - Nhận ý định
ACTION_ENCRYPTION_CHANGE
bất cứ khi nào trạng thái mã hoá của đường liên kết thay đổi. Điều này bao gồm thay đổi trạng thái mã hoá, thay đổi thuật toán mã hoá và thay đổi kích thước khoá mã hoá. Các ứng dụng phải xem xét việc khôi phục liên kết nếu đường liên kết được mã hoá thành công sau khi nhận được ý địnhACTION_ENCRYPTION_CHANGE
.
Nếu ứng dụng của bạn hiện đang sử dụng các cơ chế tuỳ chỉnh để xử lý việc mất liên kết, hãy chuyển sang ý định mới ACTION_KEY_MISSING
để phát hiện và quản lý các sự kiện mất liên kết. Bạn nên hướng dẫn người dùng xác nhận thiết bị từ xa nằm trong phạm vi trước khi bắt đầu quên thiết bị và ghép nối lại.
Hơn nữa, nếu một thiết bị ngắt kết nối sau khi nhận được ý định ACTION_KEY_MISSING
, thì ứng dụng của bạn cần lưu ý về việc kết nối lại với thiết bị đó vì thiết bị đó có thể không còn liên kết với hệ thống nữa.
Bảo mật
Android 16 (API cấp 36) có các thay đổi về bảo mật sau.
Khóa phiên bản MediaStore
Đối với các ứng dụng nhắm đến Android 16 trở lên, MediaStore#getVersion()
hiện sẽ là duy nhất cho mỗi ứng dụng. Điều này giúp loại bỏ các thuộc tính nhận dạng khỏi chuỗi phiên bản để ngăn chặn việc lợi dụng và sử dụng cho các kỹ thuật tạo vân tay số. Ứng dụng không được đưa ra bất kỳ giả định nào về định dạng của phiên bản này. Các ứng dụng phải xử lý các thay đổi về phiên bản khi sử dụng API này và trong hầu hết các trường hợp, không cần thay đổi hành vi hiện tại, trừ phi nhà phát triển đã cố gắng suy luận thêm thông tin nằm ngoài phạm vi dự kiến của API này.
Quyền riêng tư
Android 16 (API cấp 36) có các thay đổi về quyền riêng tư sau đây.
Quyền truy cập mạng cục bộ
Mọi ứng dụng có quyền INTERNET
đều có thể truy cập vào các thiết bị trên mạng LAN.
Điều này giúp ứng dụng dễ dàng kết nối với các thiết bị cục bộ, nhưng cũng có những tác động đến quyền riêng tư, chẳng hạn như tạo vân tay số của người dùng và là proxy cho vị trí.
Dự án Bảo vệ mạng cục bộ nhằm bảo vệ quyền riêng tư của người dùng bằng cách kiểm soát quyền truy cập vào mạng cục bộ thông qua một quyền mới trong thời gian chạy.
Kế hoạch phát hành
Thay đổi này sẽ được triển khai giữa hai bản phát hành, lần lượt là 25Q2 và TBD. Nhà phát triển cần phải tuân thủ hướng dẫn này cho 25Q2 và chia sẻ ý kiến phản hồi vì các biện pháp bảo vệ này sẽ được thực thi trong một bản phát hành Android sau này. Hơn nữa, họ sẽ cần cập nhật các tình huống phụ thuộc vào quyền truy cập mạng cục bộ ngầm ẩn bằng cách sử dụng hướng dẫn sau đây và chuẩn bị cho việc người dùng từ chối và thu hồi quyền mới.
Tác động
Ở giai đoạn hiện tại, LNP là một tính năng không bắt buộc, tức là chỉ những ứng dụng chọn sử dụng tính năng này mới bị ảnh hưởng. Mục tiêu của giai đoạn chọn tham gia là giúp nhà phát triển ứng dụng hiểu được những phần nào của ứng dụng phụ thuộc vào quyền truy cập mạng cục bộ ngầm ẩn để họ có thể chuẩn bị bảo vệ quyền cho các phần đó trong bản phát hành tiếp theo.
Ứng dụng sẽ bị ảnh hưởng nếu truy cập vào mạng cục bộ của người dùng bằng:
- Sử dụng trực tiếp hoặc sử dụng thư viện của ổ cắm thô trên địa chỉ mạng cục bộ (ví dụ: giao thức khám phá dịch vụ mDNS hoặc SSDP)
- Sử dụng các lớp cấp khung truy cập vào mạng cục bộ (ví dụ: NsdManager)
Lưu lượng truy cập đến và từ địa chỉ mạng cục bộ cần có quyền truy cập vào mạng cục bộ. Bảng sau đây liệt kê một số trường hợp thường gặp:
Thao tác mạng cấp thấp của ứng dụng | Cần có quyền truy cập mạng cục bộ |
---|---|
Tạo kết nối TCP đi | có |
Chấp nhận các kết nối TCP đến | có |
Gửi UDP unicast, multicast, broadcast | có |
Nhận thông báo truyền tin một địa chỉ, truyền tin nhiều địa chỉ, truyền tin phát sóng UDP đến | có |
Các quy định hạn chế này được triển khai sâu trong ngăn xếp mạng, vì vậy, chúng áp dụng cho tất cả API mạng. Điều này bao gồm các ổ cắm được tạo trong mã gốc hoặc mã được quản lý, các thư viện kết nối mạng như Cronet và OkHttp, cũng như mọi API được triển khai trên các thư viện đó. Việc cố gắng phân giải các dịch vụ trên mạng cục bộ (tức là các dịch vụ có hậu tố .local) sẽ yêu cầu quyền truy cập mạng cục bộ.
Các trường hợp ngoại lệ đối với các quy tắc trên:
- Nếu máy chủ DNS của thiết bị nằm trên mạng cục bộ, thì lưu lượng truy cập đến hoặc từ máy chủ đó (tại cổng 53) không yêu cầu quyền truy cập mạng cục bộ.
- Các ứng dụng sử dụng Trình chuyển đổi đầu ra làm bộ chọn trong ứng dụng sẽ không cần quyền truy cập mạng cục bộ (sẽ có thêm hướng dẫn vào Quý 4 năm 2025).
Hướng dẫn dành cho nhà phát triển (Chọn sử dụng)
Để chọn sử dụng các quy định hạn chế về mạng cục bộ, hãy làm như sau:
- Cài đặt ROM cho thiết bị lên bản dựng 25Q2 Beta 3 trở lên.
- Cài đặt ứng dụng cần kiểm thử.
Bật/tắt cờ Appcompat trong adb:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
Khởi động lại thiết bị
Giờ đây, quyền truy cập của ứng dụng vào mạng cục bộ bị hạn chế và mọi nỗ lực truy cập vào mạng cục bộ sẽ dẫn đến lỗi ổ cắm. Nếu bạn đang sử dụng các API thực hiện hoạt động mạng cục bộ bên ngoài quy trình ứng dụng (ví dụ: NsdManager), thì các API đó sẽ không bị ảnh hưởng trong giai đoạn chọn sử dụng.
Để khôi phục quyền truy cập, bạn phải cấp cho ứng dụng quyền truy cập vào NEARBY_WIFI_DEVICES
.
- Đảm bảo ứng dụng khai báo quyền
NEARBY_WIFI_DEVICES
trong tệp kê khai. - Chuyển đến phần Cài đặt > Ứng dụng > [Tên ứng dụng] > Quyền > Thiết bị ở gần > Cho phép.
Lúc này, quyền truy cập của ứng dụng vào mạng cục bộ sẽ được khôi phục và tất cả các trường hợp của bạn sẽ hoạt động như trước khi chọn ứng dụng.
Sau khi quá trình thực thi biện pháp bảo vệ mạng cục bộ bắt đầu, lưu lượng truy cập mạng của ứng dụng sẽ bị ảnh hưởng như sau.
Quyền | Yêu cầu LAN đi | Yêu cầu Internet đi/đến | Yêu cầu LAN đến |
---|---|---|---|
Đã cấp | Works | Works | Works |
Không được cấp | Thất bại | Works | Thất bại |
Sử dụng lệnh sau để tắt cờ App-Compat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Lỗi
Lỗi phát sinh từ các quy định hạn chế này sẽ được trả về ổ cắm gọi bất cứ khi nào ổ cắm gọi phương thức gửi hoặc biến thể gửi đến địa chỉ mạng cục bộ.
Ví dụ về lỗi:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
Định nghĩa về mạng cục bộ
Mạng cục bộ trong dự án này đề cập đến một mạng IP sử dụng giao diện mạng có khả năng truyền tin, chẳng hạn như Wi-Fi hoặc Ethernet, nhưng loại trừ các kết nối di động (WWAN) hoặc VPN.
Sau đây là những mạng được coi là mạng cục bộ:
IPv4:
- 169.254.0.0/16 // Đường liên kết cục bộ
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- Liên kết cục bộ
- Các tuyến được kết nối trực tiếp
- Mạng giả lập như Thread
- Nhiều mạng con (TBD)
Ngoài ra, cả địa chỉ đa điểm (224.0.0.0/4, ff00::/8) và địa chỉ truyền tin IPv4 (255.255.255.255) đều được phân loại là địa chỉ mạng cục bộ.