Android 9 (API cấp 28) ra mắt một số thay đổi đối với hệ thống Android.
Những thay đổi về hành vi sau đây chỉ áp dụng cho ứng dụng nhắm đến API cấp 28 trở lên. Các ứng dụng đặt targetSdkVersion
thành API cấp 28 trở lên phải sửa đổi ứng dụng để hỗ trợ những hành vi này cho phù hợp (nếu ứng dụng có hỗ trợ).
Đối với những thay đổi ảnh hưởng đến tất cả ứng dụng chạy trên Android 9, bất kể API nào cấp độ mà họ nhắm đến, xem Các thay đổi về hành vi: tất cả ứng dụng.
Dịch vụ trên nền trước
Ứng dụng nhắm đến Android 9 trở lên và sử dụng dịch vụ trên nền trước phải yêu cầu quyền FOREGROUND_SERVICE
. Đây là một quyền thông thường, vì vậy hệ thống sẽ tự động cấp quyền này cho ứng dụng yêu cầu.
Nếu một ứng dụng nhắm đến Android 9 trở lên cố gắng tạo một dịch vụ trên nền trước mà không yêu cầu FOREGROUND_SERVICE
, thì hệ thống sẽ gửi một SecurityException
.
Thay đổi về quyền riêng tư
Nếu ứng dụng của bạn nhắm đến Android 9, bạn nên lưu ý những thay đổi về hành vi sau. Những nội dung cập nhật này đối với thông tin DNS và số sê-ri của thiết bị giúp tăng cường quyền riêng tư của người dùng.
Ngừng sử dụng số sê-ri bản dựng
Trong Android 9, Build.SERIAL
luôn được đặt thành "UNKNOWN"
để bảo vệ quyền riêng tư của người dùng.
Nếu ứng dụng của bạn cần truy cập vào số sê-ri phần cứng của thiết bị, bạn nên
thay vào đó, hãy yêu cầu
READ_PHONE_STATE
quyền, sau đó gọi
getSerial()
.
Bảo mật DNS
Các ứng dụng nhắm đến Android 9 phải tuân thủ các API DNS riêng tư. Cụ thể, ứng dụng phải đảm bảo rằng nếu trình phân giải hệ thống đang thực hiện DNS-over-TLS, máy khách DNS tích hợp sẵn sử dụng DNS đã mã hoá cho cùng một tên máy chủ với hệ thống hoặc bị tắt theo lợi ích của trình phân giải hệ thống.
Các thay đổi về bảo mật của khung
Android 9 có một số thay đổi về hành vi giúp cải thiện tính bảo mật của ứng dụng, nhưng những thay đổi này chỉ có hiệu lực nếu ứng dụng của bạn nhắm đến API cấp 28 trở lên.
TLS mạng được bật theo mặc định
Nếu ứng dụng của bạn nhắm đến Android 9 trở lên, thì phương thức isCleartextTrafficPermitted()
sẽ trả về false
theo mặc định. Nếu ứng dụng của bạn cần bật văn bản thô cho một số miền cụ thể, bạn phải đặt rõ ràng cleartextTrafficPermitted
thành true
cho các miền đó trong Cấu hình bảo mật mạng của ứng dụng.
Các thư mục dữ liệu dựa trên nền tảng web được phân tách theo quy trình
Để cải thiện độ ổn định và tính toàn vẹn của dữ liệu trên Android 9, các ứng dụng không được
chia sẻ một dữ liệu WebView
thư mục trong số
nhiều quy trình. Thông thường,
các thư mục dữ liệu đó sẽ lưu trữ cookie, bộ nhớ đệm HTTP cũng như các
bộ nhớ tạm thời liên quan đến việc duyệt web.
Trong hầu hết trường hợp, ứng dụng của bạn nên dùng các lớp trong
android.webkit
, chẳng hạn như
dưới tên WebView
và
CookieManager
, chỉ trong một
của chúng tôi. Ví dụ: bạn nên di chuyển tất cả
Các đối tượng Activity
sử dụng WebView
vào cùng một quy trình. Bạn có thể thực thi nghiêm ngặt hơn
cơ chế "chỉ một quy trình" quy tắc
bằng cách gọi điện
disableWebView()
inch
các quy trình khác của ứng dụng. Lệnh gọi này ngăn việc WebView
được khởi chạy trong các quy trình khác do nhầm lẫn, ngay cả khi lệnh gọi này được gọi từ một thư viện phụ thuộc.
Nếu ứng dụng của bạn phải sử dụng các thực thể của WebView
trong nhiều quy trình, thì bạn phải chỉ định một hậu tố thư mục dữ liệu duy nhất cho mỗi quy trình bằng cách sử dụng phương thức WebView.setDataDirectorySuffix()
trước khi sử dụng một thực thể nhất định của WebView
trong quy trình đó. Phương thức này đặt dữ liệu web từ mỗi quy trình trong thư mục riêng của quy trình đó trong thư mục dữ liệu của ứng dụng.
Miền SELinux cho mỗi ứng dụng
Các ứng dụng nhắm đến Android 9 trở lên không thể chia sẻ dữ liệu với các ứng dụng khác bằng các quyền Unix có thể truy cập trên toàn thế giới. Thay đổi này giúp cải thiện tính toàn vẹn của Hộp cát ứng dụng Android, đặc biệt là yêu cầu về việc một ứng dụng dữ liệu riêng tư có thể truy cập được chỉ bằng ứng dụng đó.
Để chia sẻ tệp với các ứng dụng khác, hãy sử dụng nhà cung cấp nội dung.
Thay đổi về khả năng kết nối
Tính toán dữ liệu kết nối và đa đường dẫn
Trong những ứng dụng nhắm đến Android 9 trở lên, hệ thống sẽ được tính
lưu lượng truy cập mạng trên mạng
không phải là chế độ mặc định hiện tại, chẳng hạn như lưu lượng truy cập di động khi thiết bị đang bật
Wi-Fi—và cung cấp các phương thức trong
NetworkStatsManager
để truy vấn cho lưu lượng truy cập đó.
Cụ thể,
getMultipathPreference()
hiện sẽ trả về giá trị dựa trên lưu lượng truy cập mạng nêu trên. Kể từ Android 9, phương thức này sẽ trả về true
cho dữ liệu ô, nhưng khi lưu lượng truy cập tích luỹ nhiều hơn một lượng nhất định trong một ngày, phương thức này sẽ bắt đầu trả về false
. Các ứng dụng chạy trên Android 9 phải gọi phương thức và tuân thủ gợi ý này.
ConnectivityManager.NetworkCallback
giờ đây sẽ gửi thông tin về VPN đến các ứng dụng. Thay đổi này giúp các ứng dụng dễ dàng theo dõi các sự kiện kết nối hơn mà không cần phải kết hợp các lệnh gọi đồng bộ và không đồng bộ cũng như sử dụng các API bị hạn chế. Ngoài ra, điều đó có nghĩa là
Tính năng chuyển thông tin hoạt động như mong đợi khi một thiết bị kết nối với nhiều thiết bị
Mạng Wi-Fi hoặc nhiều mạng di động cùng một lúc.
Ngừng sử dụng ứng dụng Apache HTTP
Với Android 6.0, chúng tôi đã ngừng hỗ trợ ứng dụng Apache HTTP. Kể từ Android 9, thư viện đó sẽ bị xoá khỏi bootclasspath và không có sẵn cho ứng dụng theo mặc định.
Để tiếp tục dùng ứng dụng Apache HTTP, các ứng dụng nhắm đến Android 9 trở lên
có thể thêm đoạn mã sau vào AndroidManifest.xml
của mình:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Thay vì sử dụng thư viện Apache trong thời gian chạy, các ứng dụng có thể gói
phiên bản riêng của thư viện org.apache.http
trong APK của họ. Nếu bạn làm như vậy,
bạn phải đóng gói lại thư viện (với một tiện ích như
Jar Jar) để tránh các vấn đề về khả năng tương thích với lớp
bằng các lớp được cung cấp trong thời gian chạy.
Thay đổi về giao diện người dùng
Xem tiêu điểm
Các chế độ xem có khu vực 0 (chiều rộng hoặc chiều cao bằng 0) không còn có thể làm tâm điểm.
Ngoài ra, các hoạt động không còn ngầm chỉ định trọng tâm ban đầu trong chế độ cảm ứng. Thay vào đó, bạn có thể tuỳ ý yêu cầu rõ ràng tiêu điểm ban đầu, nếu mong muốn.
Xử lý giá trị hex RGBA CSS
Ứng dụng nhắm đến Android 9 trở lên phải bật bản nháp Mô-đun màu CSS cấp 4 để xử lý màu CSS 4 và 8 hex chữ số.
Mô-đun màu CSS cấp 4 đã được Chrome hỗ trợ kể từ bản phát hành 52, nhưng WebView hiện đang tắt tính năng này vì các ứng dụng Android hiện có bị phát hiện chứa màu hex 32 bit theo thứ tự Android (ARGB), điều này sẽ gây ra lỗi kết xuất.
Ví dụ: màu #80ff8080
hiện được hiển thị trong WebView dưới dạng màu đỏ nhạt mờ (#ff8080
) cho các ứng dụng nhắm đến API cấp 27 trở xuống. Thành phần dẫn đầu (sẽ được Android diễn giải là thành phần alpha) hiện bị bỏ qua. Nếu một ứng dụng nhắm đến API cấp 28 trở lên, #80ff8080
sẽ được diễn giải là màu xanh lục nhạt trong suốt 50% (#80ff80
).
Quét loại MIME cho tệp: URI
Các phiên bản Android cũ hơn Android 9 có thể suy ra loại MIME từ tệp
. Kể từ Android 9 (API cấp 28), ứng dụng phải sử dụng
chính xác khi tải các URI file:
trong một
WebView.
Việc sử dụng nội dung tệp để suy luận loại MIME có thể là nguồn gây ra lỗi bảo mật và điều này thường không được các trình duyệt hiện đại cho phép.
Nếu tệp có đuôi tệp được nhận dạng, chẳng hạn như .html
,
.txt
, .js
hoặc .css
loại MIME sẽ do tiện ích xác định.
Nếu tệp không có đuôi hoặc có đuôi không được nhận dạng, thì loại MIME sẽ là văn bản thuần tuý.
Ví dụ: một URI như file:///sdcard/test.html
sẽ được hiển thị dưới dạng
HTML, nhưng một URI như file:///sdcard/test
sẽ hiển thị dưới dạng văn bản thuần tuý,
ngay cả khi tệp chứa dữ liệu HTML.
Phần tử cuộn tài liệu
Android 9 xử lý đúng cách trường hợp thư mục gốc của tài liệu là phần tử cuộn. Trên các phiên bản trước, vị trí cuộn được đặt trên phần tử body và phần tử gốc có giá trị cuộn bằng 0. Android 9 cho phép hành vi tuân thủ tiêu chuẩn, trong đó phần tử cuộn là phần tử gốc.
Hơn nữa, việc truy cập trực tiếp vào document.body.scrollTop
, document.body.scrollLeft
, document.documentElement.scrollTop
hoặc document.documentElement.scrollLeft
sẽ có hành vi khác nhau tuỳ thuộc vào SDK mục tiêu. Để truy cập vào các giá trị cuộn khung nhìn, hãy sử dụng document.scrollingElement
(nếu có).
Thông báo của các ứng dụng bị tạm ngưng
Trước Android 9, thông báo của các ứng dụng bị tạm ngưng sẽ bị huỷ. Kể từ Android 9, thông báo của các ứng dụng bị tạm ngưng sẽ bị ẩn cho đến ứng dụng sẽ được tiếp tục.