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 (cấp độ API 36) có những 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.
Sắp ngừng hỗ trợ lựa chọn không sử dụng chế độ 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 tham gia 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 một thiết bị Android 15, thì
R.attr#windowOptOutEdgeToEdgeEnforcementsẽ tiếp tục hoạt động. - Nếu ứng dụng của bạn nhắm đến Android 16 (cấp độ API 36) và đang chạy trên một thiết bị Android 16, thì
R.attr#windowOptOutEdgeToEdgeEnforcementsẽ bị tắt.
Để thử nghiệm trên Android 16, hãy đảm bảo ứng dụng của bạn hỗ trợ chế độ tràn viền và
xoá mọi trường hợp sử dụng R.attr#windowOptOutEdgeToEdgeEnforcement để ứng dụng
cũng hỗ trợ chế độ 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ị.
Cần di chuyển hoặc chọn không tham gia 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 (cấp độ API 36) trở lên và chạy trên thiết bị Android 16 trở lên, ảnh động hệ thống xem trước thao tác quay lại (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òn được gửi đ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 trong ứng dụng.
Ngừng sử dụng và tắt các 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ữ nhỏ gọn bằng một phông chữ dễ đọc hơn nhiều. Bạn có thể ghi đè điều 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à không bị ảnh hưởng trong tương lai bằng tiếng Ả Rập, tiếng Lào, tiếng Miến Điện, tiếng Tamil, tiếng Gujarati, tiếng Kannada, tiếng Malayalam, tiếng Odia, tiếng Telugu hoặc tiếng Thái.
Hành vi elegantTextHeight đối với các ứng dụng nhắm đến Android 14 (API cấp 34) trở xuống hoặc đối với các ứng dụng nhắm đến Android 15 (API cấp 35) đã ghi đè giá trị mặc định bằng cách đặt thuộc tính elegantTextHeight thành false.
Hành vi elegantTextHeight đối với các ứng dụng nhắm đến Android 16 (API cấp 36) hoặc đối với các ứng dụng nhắm đến Android 15 (API cấp 35) không ghi đè giá trị 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 (cấp độ API 36) bao gồm những thay đổi sau đây nhằm sửa đổi hoặc mở rộng nhiều khả năng cốt lõi của hệ thống Android.
Tối ưu hoá việc lên lịch cho công việc theo tốc độ 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 (cấp độ API 36) có những 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)
Vì ứng dụng Android hiện chạy trên nhiều loại 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à chế độ cửa sổ trên màn hình lớn (chẳng hạn như chế độ chia đôi màn hình và cửa sổ kiểu máy tính), nên nhà phát triển cầ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 là 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 (cấp độ API 36), các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình sẽ không còn áp dụng trên màn hình có chiều rộng nhỏ nhất >= 600dp. Ứng dụng lấp đầy toàn bộ cửa sổ hiển thị, bất kể tỷ lệ khung hình hay hướng ưu tiên của người dùng và không sử dụng hiệu ứng pillarbox.
Thay đổi này sẽ giới thiệu một hành vi mới của nền tảng tiêu chuẩn. 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 quy tắc hạn chế như hướng cố định hoặc khả năng đổi kích thước bị giới hạn sẽ cản trở khả năng thích ứng của ứng dụng. Điều chỉnh ứng dụng để mang lại trải nghiệm tốt nhất có thể cho người dùng.
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á theo 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 nằm 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 của bạn. 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 duy trì đúng cách. Tìm hiểu cách lưu trạng thái giao diện người dùng đúng cách 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ề việc 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à chế độ nhiều cửa sổ:
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
Các giá trị sau đây cho screenOrientation, setRequestedOrientation() và getRequestedOrientation() sẽ bị bỏ qua:
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
Về khả năng đổi kích thước màn hình, android:resizeableActivity="false", android:minAspectRatio và android:maxAspectRatio không có hiệu lực.
Đối với các ứng dụng nhắm đến Android 16 (cấp độ API 36), 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ủa ứng dụng sẽ bị bỏ qua trên màn hình lớn theo mặc định. Mọi ứng dụng chưa hoàn toàn sẵn sàng đều có thể tạm thời ghi đè hành vi này bằng cách chọn không sử dụng, dẫn đến hành vi trước đó là được đặt ở chế độ tương thích.
Ngoại lệ
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ủa Android 16 không áp dụng trong những 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 chế độ 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 có quá nhiều phần trong ứ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 (cấp độ API 36) có những thay đổi sau đây liên quan đến dữ liệu sức khoẻ và dữ liệu thể chất.
Quyền đối với dữ liệu sức khoẻ và thể dục
Đối với các ứng dụng nhắm đến Android 16 (API cấp 36) trở lên,
quyền BODY_SENSORS sử dụng các quyền chi tiết hơn
trong android.permissions.health, mà Health Connect
cũng sử dụng. Kể từ Android 16, 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ụ nền trước sau đây:
HEART_RATE_BPMtừ Dịch vụ sức khoẻ trên Wear OSSensor.TYPE_HEART_RATEtừ Trình quản lý cảm biến AndroidheartRateAccuracyvàheartRateBpmcủaProtoLayouttrên Wear OSFOREGROUND_SERVICE_TYPE_HEALTHtrong đó quyềnandroid.permission.healthtương ứng là cần thiết thay choBODY_SENSORS
Nếu sử dụng các API này, ứng dụng của bạn nên yêu cầu các quyền chi tiết tương ứng:
- Để theo dõi Tần số tim, SpO2 hoặc Nhiệt độ trên da khi đang sử dụng:
hãy yêu cầu quyền truy cập chi tiết trong
android.permissions.health, chẳng hạn nhưREAD_HEART_RATEthay vìBODY_SENSORS. - Đối với quyền truy cập vào cảm biến nền: hãy yêu cầu quyền
READ_HEALTH_DATA_IN_BACKGROUNDthay 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 cho dữ liệu về sức khoẻ, thể dục và thể chất.
Ứng dụng trên điện thoại 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 cũng là yêu cầu của Health Connect.
Khả năng kết nối
Android 16 (cấp độ API 36) bao gồm những thay đổi sau 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 chế độ 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_MISSINGkhi 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_CHANGEbấ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.
Điều chỉnh cho phù hợp với nhiều cách triển khai của nhà sản xuất thiết bị gốc (OEM)
Mặc dù Android 16 giới thiệu các ý định mới này, nhưng cách triển khai và truyền tin của các ý định này có thể khác nhau tuỳ theo nhà sản xuất thiết bị gốc (OEM). Để đảm bảo ứng dụng của bạn mang lại trải nghiệm nhất quán và đáng tin cậy trên tất cả thiết bị, nhà phát triển nên thiết kế cách xử lý việc mất liên kết để thích ứng linh hoạt với những biến thể tiềm ẩn này.
Bạn nên áp dụng các hành vi sau đây cho ứng dụng:
Nếu ý định
ACTION_KEY_MISSINGđược truyền tin:Hệ thống sẽ ngắt kết nối liên kết ACL (Không có kết nối không đồng bộ), nhưng thông tin liên kết cho thiết bị sẽ được giữ lại (như mô tả tại đây).
Ứng dụng của bạn nên sử dụng ý định này làm tín hiệu chính để phát hiện mất liên kết và 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ị hoặc ghép nối lại.
Nếu một thiết bị ngắt kết nối sau khi nhận được
ACTION_KEY_MISSING, thì ứng dụng của bạn nên thận trọng khi kết nối lại, vì thiết bị có thể không còn liên kết với hệ thống nữa.Nếu ý định
ACTION_KEY_MISSINGKHÔNG được truyền tin:Đường liên kết ACL sẽ vẫn được kết nối và hệ thống sẽ xoá thông tin liên kết cho thiết bị, tương tự như hành vi trong Android 15.
Trong trường hợp này, ứng dụng của bạn sẽ tiếp tục các cơ chế xử lý mất liên kết hiện có như trong các bản phát hành Android trước, để phát hiện và quản lý các sự kiện mất liên kết.
Cách mới để xoá liên kết Bluetooth
Giờ đây, tất cả ứng dụng nhắm đến Android 16 đều có thể huỷ ghép nối thiết bị Bluetooth bằng cách sử dụng API công khai trong CompanionDeviceManager. Nếu một thiết bị đồng hành đang được quản lý dưới dạng liên kết CDM, thì ứng dụng có thể kích hoạt việc xoá liên kết Bluetooth bằng cách sử dụng API removeBond(int) mới trên thiết bị được liên kết. Ứng dụng có thể theo dõi các thay đổi về trạng thái liên kết bằng cách nghe sự kiện truyền tin của thiết bị Bluetooth ACTION_BOND_STATE_CHANGED.
Bảo mật
Android 16 (cấp độ API 36) có những thay đổi sau đây về bảo mật.
Khoá 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.
Ý định an toàn hơn
Tính năng Ý định an toàn hơn là một sáng kiến bảo mật gồm nhiều giai đoạn, được thiết kế để cải thiện tính bảo mật của cơ chế phân giải ý định của Android. Mục tiêu là bảo vệ ứng dụng khỏi các hành động độc hại bằng cách thêm các bước kiểm tra trong quá trình xử lý ý định và lọc các ý định không đáp ứng tiêu chí cụ thể.
Trong Android 15, tính năng này tập trung vào ứng dụng gửi. Giờ đây, với Android 16, quyền kiểm soát sẽ chuyển sang ứng dụng nhận, cho phép nhà phát triển chọn sử dụng tính năng phân giải ý định nghiêm ngặt bằng tệp kê khai ứng dụng.
Chúng tôi sẽ triển khai hai thay đổi quan trọng:
Ý định tường minh phải khớp với bộ lọc ý định của thành phần mục tiêu: Nếu một ý định nhắm mục tiêu rõ ràng đến một thành phần, thì ý định đó phải khớp với bộ lọc ý định của thành phần đó.
Ý định không có hành động không thể khớp với bất kỳ bộ lọc ý định nào: Ý định không có hành động được chỉ định không được phân giải cho bất kỳ bộ lọc ý định nào.
Những thay đổi này chỉ áp dụng khi có nhiều ứng dụng liên quan và không ảnh hưởng đến việc xử lý ý định trong một ứng dụng.
Tác động
Tính chất chọn sử dụng có nghĩa là nhà phát triển phải bật tính năng này một cách rõ ràng trong tệp kê khai ứng dụng để tính năng này có hiệu lực. Do đó, tính năng này sẽ chỉ ảnh hưởng đến những ứng dụng có nhà phát triển:
- Biết về tính năng Ý định an toàn hơn và lợi ích của tính năng này.
- Chủ động chọn áp dụng các phương pháp xử lý ý định nghiêm ngặt hơn vào ứng dụng của họ.
Phương pháp chọn sử dụng này giúp giảm thiểu rủi ro làm hỏng các ứng dụng hiện có có thể dựa vào hành vi phân giải ý định kém an toàn hiện tại.
Mặc dù tác động ban đầu trong Android 16 có thể bị hạn chế, nhưng sáng kiến Ý định an toàn hơn có lộ trình tác động rộng hơn trong các bản phát hành Android trong tương lai. Kế hoạch là cuối cùng sẽ đặt chế độ phân giải ý định nghiêm ngặt làm hành vi mặc định.
Tính năng Ý định an toàn hơn có khả năng tăng cường đáng kể tính bảo mật của hệ sinh thái Android bằng cách khiến các ứng dụng độc hại khó khai thác lỗ hổng bảo mật trong cơ chế phân giải ý định hơn.
Tuy nhiên, quá trình chuyển đổi sang chế độ chọn không tham gia và thực thi bắt buộc phải được quản lý cẩn thận để giải quyết các vấn đề tiềm ẩn về khả năng tương thích với các ứng dụng hiện có.
Triển khai
Nhà phát triển cần bật rõ ràng tính năng so khớp ý định nghiêm ngặt hơn bằng cách sử dụng thuộc tính intentMatchingFlags trong tệp kê khai ứng dụng.
Dưới đây là ví dụ về trường hợp tính năng này được chọn sử dụng cho toàn bộ ứng dụng, nhưng bị tắt/chọn không tham gia trên một broadcast receiver:
<application android:intentMatchingFlags="enforceIntentFilter">
<receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
Thông tin khác về các cờ được hỗ trợ:
| Tên cờ | Mô tả |
|---|---|
| enforceIntentFilter | Thực thi việc so khớp nghiêm ngặt hơn đối với ý định đến |
| không có | Tắt tất cả quy tắc so khớp đặc biệt cho ý định đến. Khi chỉ định nhiều cờ, các giá trị xung đột sẽ được giải quyết bằng cách ưu tiên cờ "none" |
| allowNullAction | Nới lỏng các quy tắc so khớp để cho phép các ý định không có hành động so khớp. Cờ này được dùng cùng với "enforceIntentFilter" để đạt được một hành vi cụ thể |
Kiểm thử và gỡ lỗi
Khi biện pháp thực thi có hiệu lực, các ứng dụng sẽ hoạt động đúng cách nếu phương thức gọi ý định đã điền đúng ý định.
Tuy nhiên, các ý định bị chặn sẽ kích hoạt thông điệp nhật ký cảnh báo như
"Intent does not match component's intent filter:" và "Access blocked:"
bằng thẻ "PackageManager."
Điều này cho thấy một vấn đề tiềm ẩn có thể ảnh hưởng đến ứng dụng và cần được
chú ý.
Bộ lọc Logcat:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
Lọc lệnh gọi hệ thống GPU
Để tăng cường bảo mật cho nền tảng GPU Mali, các IOCTL của GPU Mali đã ngừng hoạt động hoặc chỉ dành cho việc phát triển GPU đã bị chặn trong các bản dựng chính thức. Ngoài ra, IOCTL dùng để lập hồ sơ GPU đã bị hạn chế đối với quy trình shell hoặc ứng dụng có thể gỡ lỗi. Hãy tham khảo thông tin cập nhật về SAC để biết thêm thông tin chi tiết về chính sách cấp nền tảng.
Thay đổi này áp dụng cho các thiết bị Pixel sử dụng GPU Mali (Pixel 6-9). Arm
đã cung cấp thông tin phân loại chính thức về IOCTL của họ trong
Documentation/ioctl-categories.rst của bản phát hành r54p2. Danh sách này sẽ tiếp tục được duy trì trong các bản phát hành trình điều khiển trong tương lai.
Thay đổi này không ảnh hưởng đến các API đồ hoạ được hỗ trợ (bao gồm cả Vulkan và OpenGL) và dự kiến sẽ không ảnh hưởng đến nhà phát triển hoặc ứng dụng hiện có. Các công cụ lập hồ sơ GPU như Streamline Performance Analyzer và Android GPU Inspector sẽ không bị ảnh hưởng.
Thử nghiệm
Nếu bạn thấy một thông báo từ chối SELinux tương tự như sau, thì có thể ứng dụng của bạn đã chịu ảnh hưởng của thay đổi này:
06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc: denied { ioctl }
for path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts
Nếu ứng dụng của bạn cần sử dụng IOCTL bị chặn, vui lòng báo cáo lỗi và chỉ định cho android-partner-security@google.com.
Câu hỏi thường gặp
Thay đổi về chính sách này có áp dụng cho tất cả nhà sản xuất thiết bị gốc (OEM) không? Thay đổi này sẽ là chọn tham gia, nhưng áp dụng cho mọi OEM muốn sử dụng phương thức tăng cường bảo mật này. Bạn có thể xem hướng dẫn triển khai thay đổi này trong tài liệu triển khai.
Có bắt buộc phải thay đổi toàn bộ mã nguồn OEM để triển khai tính năng này không, hay tính năng này được cung cấp theo mặc định trong bản phát hành AOSP mới? Thay đổi ở cấp nền tảng sẽ đi kèm với bản phát hành AOSP mới theo mặc định. Nhà cung cấp có thể chọn tham gia thay đổi này trong toàn bộ mã nguồn của họ nếu muốn.
SoC có chịu trách nhiệm cập nhật danh sách IOCTL không? Ví dụ: nếu thiết bị của tôi sử dụng GPU ARM Mali, thì tôi có cần liên hệ với ARM để thực hiện bất kỳ thay đổi nào không? Mỗi SoC phải cập nhật danh sách IOCTL cho từng thiết bị khi phát hành trình điều khiển. Ví dụ: ARM sẽ cập nhật danh sách IOCTL đã xuất bản khi có bản cập nhật trình điều khiển. Tuy nhiên, OEM phải đảm bảo rằng họ kết hợp các bản cập nhật trong SEPolicy và thêm mọi IOCTL tuỳ chỉnh đã chọn vào danh sách nếu cần.
Thay đổi này có tự động áp dụng cho tất cả thiết bị Pixel trên thị trường không, hay người dùng cần thực hiện việc cần làm để bật/tắt chế độ nào đó để áp dụng thay đổi này? Thay đổi này áp dụng cho tất cả thiết bị Pixel đang có mặt trên thị trường và sử dụng GPU Mali (Pixel 6 – 9). Người dùng không cần làm gì để áp dụng thay đổi này.
Việc sử dụng chính sách này có ảnh hưởng đến hiệu suất của trình điều khiển hạt nhân không? Chính sách này đã được thử nghiệm trên GPU Mali bằng GFXBench và không ghi nhận được thay đổi nào có thể đo lường đối với hiệu suất GPU.
Có cần phải điều chỉnh danh sách IOCTL cho phù hợp với không gian người dùng hiện tại và phiên bản trình điều khiển hạt nhân không? Có, danh sách IOCTL được phép phải được đồng bộ hoá với IOCTL mà cả trình điều khiển không gian người dùng và trình điều khiển hạt nhân đều hỗ trợ. Nếu IOCTL trong không gian người dùng hoặc trình điều khiển hạt nhân được cập nhật, thì danh sách IOCTL của SEPolicy phải được cập nhật cho phù hợp.
ARM đã phân loại IOCTL là "bị hạn chế" / "thiết bị đo lường", nhưng chúng tôi muốn sử dụng một số IOCTL trong các trường hợp sử dụng thực tế và/hoặc từ chối các IOCTL khác. Từng OEM/SoC chịu trách nhiệm quyết định cách phân loại IOCTL mà họ sử dụng, dựa trên cấu hình của thư viện Mali không gian người dùng. Bạn có thể sử dụng danh sách của ARM để quyết định những vấn đề này, nhưng trường hợp sử dụng của mỗi OEM/SoC có thể khác nhau.
Quyền riêng tư
Android 16 (cấp độ API 36) bao gồm các thay đổi sau đây về quyền riêng tư.
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ị trong mạng LAN.
Việc này giúp các ứng dụng dễ dàng kết nối với thiết bị cục bộ nhưng cũng kéo theo những vấn đề về quyền riêng tư, chẳng hạn như việc tạo vân tay của người dùng và đóng vai trò là phương tiện gián tiếp để xác định vị trí.
Dự án Biện pháp bảo vệ mạng cục bộ nhằm mục đích bảo vệ quyền riêng tư của người dùng bằng cách hạn chế quyền truy cập vào mạng cục bộ thông qua một quyền khi bắt đầu chạy mới.
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à 26Q2. Nhà phát triển bắt buộc phải làm theo 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 trường hợp phụ thuộc vào quyền truy cập ngầm vào mạng cục bộ bằng cách làm theo hướng dẫn sau đây, đồng thời chuẩn bị cho trường hợp 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 sử dụng là giúp nhà phát triển ứng dụng hiểu được phần nào trong ứng dụng của họ phụ thuộc vào quyền truy cập ngầm vào mạng cục bộ, nhờ đó họ có thể chuẩn bị bảo vệ quyền truy cập cho 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ác cổng 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ừ mộ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 phổ biến:
| 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 kết nối TCP đến | có |
| Gửi một gói UDP đơn hướng, đa hướng, truyền phát | có |
| Nhận một gói UDP unicast, multicast, broadcast đến | có |
Những quy định hạn chế này được triển khai sâu trong bộ phần cứng và phần mềm mạng, do đó, chúng áp dụng cho tất cả API mạng. Điều này bao gồm các cổng kết nối được tạo trong mã gốc hoặc mã được quản lý, các thư viện mạng như Cronet và OkHttp, cũng như mọi API được triển khai trên các thư viện đó. Để phân giải các dịch vụ trên mạng cục bộ (tức là những dịch vụ có hậu tố .local), bạn cần có quyền truy cập mạng cục bộ.
Các trường hợp ngoại lệ đối với những quy tắc nêu 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 cần quyền truy cập vào 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 vào mạng cục bộ (chúng tôi sẽ cung cấp 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 áp 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 một bản dựng có 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 thao tác trên mạng cục bộ bên ngoài quy trình của ứ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 NEARBY_WIFI_DEVICES.
- Đảm bảo ứng dụng khai báo quyền
NEARBY_WIFI_DEVICEStrong 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.
Giờ đâ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 tình huống của bạn sẽ hoạt động như trước khi chọn sử dụng ứng dụng.
Sau khi biện pháp bảo vệ mạng cục bộ bắt đầu được thực thi, 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 đến từ mạng LAN |
|---|---|---|---|
| Đã cấp | Works | Works | Works |
| Chưa đượ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ề cho socket gọi bất cứ khi nào socket đó gọi hàm gửi hoặc biến thể gửi đến một đị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 mạng cục bộ
Mạng cục bộ trong dự án này là một mạng IP sử dụng giao diện mạng có khả năng truyền phát, chẳng hạn như Wi-Fi hoặc Ethernet, nhưng không bao gồm kết nối di động (WWAN) hoặc kết nối VPN.
Sau đây là những mạng được coi là mạng cục bộ:
IPv4:
- 169.254.0.0/16 // Link Local
- 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ộ
- Tuyến đường được kết nối trực tiếp
- Mạng Stub như Thread
- Nhiều mạng con (Chưa xác định)
Ngoài ra, cả địa chỉ đa truyền (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ộ.
Ảnh thuộc sở hữu của ứng dụng
Khi một ứng dụng nhắm đến SDK 36 trở lên yêu cầu quyền truy cập vào ảnh và video trên các thiết bị chạy Android 16 trở lên, những người dùng chọn giới hạn quyền truy cập vào nội dung nghe nhìn đã chọn sẽ thấy mọi ảnh do ứng dụng sở hữu được chọn trước trong công cụ chọn ảnh. Người dùng có thể bỏ chọn bất kỳ mục nào trong số các mục được chọn trước này. Thao tác này sẽ thu hồi quyền truy cập của ứng dụng vào những ảnh và video đó.