Thay đổi về hành vi: ứng dụng nhắm đến API cấp 28 trở lên

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 WebViewCookieManager, 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 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.