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 sau đây về hành vi chỉ áp dụng cho các ứng dụng nhắm đến
API cấp 28 trở lên. Ứng dụng đặt targetSdkVersion
thành API cấp 28 hoặc
cao hơn phải sửa đổi
ứng dụng của họ để hỗ trợ những hành vi này đúng cách, nếu phù hợp.
Đố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 các dịch vụ trên nền trước phải yêu cầu
FOREGROUND_SERVICE
quyền. Đây là một quyền thông thường,
để hệ thống tự động cấp huy hiệu đó 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 dịch vụ trên nền trước mà không
đang yêu cầu FOREGROUND_SERVICE
,
hệ thống sẽ gửi ra một SecurityException
.
Các 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 giữ lại những điều sau thay đổi về hành vi. Những bản cập nhật này đối với thông tin về DNS và sê-ri của thiết bị nâng cao quyền riêng tư của người dùng.
Ngừng sử dụng số sê-ri của bản dựng
Trong Android 9, Build.SERIAL
là
luôn được đặt thành "UNKNOWN"
để bảo vệ người dùng quyền riêng tư.
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
sau đó gọi
getSerial()
.
Bảo mật DNS
Ứng dụng nhắm đến Android 9 phải tôn trọng 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 cung cấp một số thay đổi về hành vi nhằm cải thiện tính bảo mật của ứng dụng. Tuy nhiên, những thay đổi này chỉ có hiệu lực khi ứng dụng đó nhắm đến cấp độ API 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,
isCleartextTrafficPermitted()
theo mặc định, phương thức này sẽ trả về false
. 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 cleartextTrafficPermitted
thành true
một cách rõ ràng
cho những miền đó trong phần Bảo mật mạng của ứng dụng
Cấu hình.
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 khởi động WebView
trong các quá trình khác đó do nhầm lẫn, ngay cả khi nó được gọi từ một phần phụ thuộc
thư viện của bạn.
Nếu ứng dụng của bạn phải sử dụng các bản sao của
WebView
trong nhiều quá trình,
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
WebView.setDataDirectorySuffix()
trước khi sử dụng bản sao đã cho của WebView
trong quy trình đó. Phương thức này
đặt dữ liệu web từ mỗi quy trình vào thư mục riêng trong dữ liệu của ứng dụng
thư mục.
Miền SELinux cho mỗi ứng dụng
Những ứ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 quyền truy cập Unix có thể truy cập được 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 dùng 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. Bắt đầu bằng
Trên Android 9, phương thức này trả về true
cho dữ liệu di động, nhưng khi nhiều hơn một lượng dữ liệu nhất định
lưu lượng truy cập tích luỹ trong một ngày, lưu lượng truy cập sẽ bắt đầu trả về false
. Ứng dụng đang chạy trên
Android 9 phải gọi phương thức và tuân theo 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 bạn
dễ dàng
giúp ứng dụng theo dõi các sự kiện kết nối mà không cần phải kết hợp lệnh đồng bộ và
lệnh gọi không đồng bộ và sử dụng 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.
Các 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 CSS RGBA
Ứ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 kết xuất trong
WebView mờ đục
màu đỏ nhạt (#ff8080
) đối với ứng dụng nhắm đến API cấp 27 trở xuống. Người dẫn đầu
thành phần (sẽ được Android diễn giải là thành phần alpha) được
hiện bị bỏ qua. Nếu một ứng dụng nhắm đến API cấp 28 trở lên, thì #80ff8080
tỷ lệ màu xanh lục nhạt trong suốt (#80ff80
) là 50%.
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à nguyên nhâ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 là tệp không nhận dạng được, thì loại MIME sẽ là tệp 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. Trong các phiên bản trước, vị trí cuộn được đặt trên phần tử nội dung 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à gốc .
Ngoài ra, 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ẽ hoạt động khác nhau tuỳ thuộc vào SDK mục tiêu. Để truy cập, hãy cuộn khung nhìn
các giá trị khác, 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 từ các ứng dụng bị tạm ngưng đã 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.