Giới thiệu một số tính năng mới trong Android O (Phần III)
Tiếp theo phần trước, phần này chúng ta sẽ tìm hiểu về những thay đổi của Android O so với các phiên bản trước. Những thay đổi hành vi này áp dụng cho tất cả các ứng dụng Khi họ chạy trên nền tảng Android O, bất kể cấp API họ đang target. Tất cả nhà phát triển nên xem lại những thay đổi này và ...
Tiếp theo phần trước, phần này chúng ta sẽ tìm hiểu về những thay đổi của Android O so với các phiên bản trước.
Những thay đổi hành vi này áp dụng cho tất cả các ứng dụng Khi họ chạy trên nền tảng Android O, bất kể cấp API họ đang target. Tất cả nhà phát triển nên xem lại những thay đổi này và sửa đổi ứng dụng của họ để hỗ trợ chúng đúng cách, nếu có thể áp dụng cho ứng dụng.
Giới hạn tác vụ nền
Là một trong những thay đổi mà Android O giới thiệu để cải thiện tuổi thọ pin, khi ứng dụng của bạn vào trạng thái cached, và không có component vào đang hoạt động, hệ thống sẽ giải phóng bất kỳ wakelocks nào mà ứng dụng giữ.
Ngoài ra, để cải thiện hiệu suất thiết bị, hệ thống sẽ hạn chế các hành vi nhất định bởi các ứng dụng không chạy ở foreground. Đặc biệt:
- Các ứng dụng đang chạy ẩn có giới hạn về mức độ tự do mà chúng có thể truy cập các dịch vụ nền.
- Ứng dụng không thể sử dụng Manifest của chúng để đăng ký cho hầu hết các broadcast tiềm ẩn (tức là các broadcast không được nhắm mục tiêu cụ thể tại ứng dụng). Theo mặc định, các hạn chế này chỉ áp dụng cho các ứng dụng nhắm mục tiêu O. Tuy nhiên, người dùng có thể bật các hạn chế này cho bất kỳ ứng dụng nào từ màn hình Cài đặt , ngay cả khi ứng dụng không nhắm mục tiêu O.
Android O cũng bao gồm các thay đổi sau đây đối với các phương pháp cụ thể:
- Phương thức startService() hiện đưa ra một IllegalStateException nếu ứng dụng nhắm mục tiêu Android O cố gắng sử dụng phương thức đó trong trường hợp không được phép tạo các dịch vụ nền.
- Phương thức Context.startForegroundService() bắt đầu một dịch vụ foreground. Hệ thống cho phép các ứng dụng gọi Context.startForegroundService() ngay cả khi ứng dụng đang ẩn. Tuy nhiên, ứng dụng phải gọi phương thức startForeground() của dịch vụ đó trong vòng năm giây sau khi dịch vụ được tạo. Để biết thêm thông tin, xem Giới hạn tác vụ nền
Giới hạn request location chạy nền
Để bảo vệ pin, trải nghiệm người dùng và sức khỏe của hệ thống, ứng dụng nền sẽ nhận được cập nhật vị trí ít khi sử dụng trên thiết bị chạy Android O. Thay đổi hành vi này ảnh hưởng đến tất cả các ứng dụng nhận cập nhật vị trí, bao gồm các dịch vụ của Google Play.
Những thay đổi này ảnh hưởng đến các API sau đây:
-
Fused Location Provider (FLP)
-
Geofencing
-
GNSS Measurements
-
Location Manager
-
Wi-Fi Manager Để đảm bảo rằng ứng dụng của bạn chạy như mong đợi, hãy hoàn tất các bước sau:
-
Xem lại logic của ứng dụng và đảm bảo rằng bạn đang sử dụng các API vị trí mới nhất.
-
Kiểm tra rằng ứng dụng của bạn thể hiện hành vi mà bạn mong đợi cho từng trường hợp sử dụng.
-
Xem xét việc sử dụng Fused Location Provider (FLP) hoặc Geofencing để xử lý các trường hợp sử dụng tùy thuộc vào vị trí hiện tại của người dùng. Để biết thêm thông tin về những thay đổi này, hãy xem Giới hạn request location chạy nền.
Lối tắt ứng dụng
Android O bao gồm các thay đổi sau cho lối tắt ứng dụng:
- Broadcast com.android.launcher.action.INSTALL_SHORTCUT không còn có bất kỳ ảnh hưởng nào đối với ứng dụng của bạn, bởi vì bây giờ nó là broadcast riêng tư và tiềm ẩn. Thay vào đó, bạn nên tạo lối tắt ứng dụng bằng cách sử dụng phương thức requestPinShortcut() từ lớp ShortcutManager .
- Intent ACTION_CREATE_SHORTCUT bây giờ có thể tạo lối tắt ứng dụng mà bạn quản lý bằng cách sử dụng lớp ShortcutManager . Intent này cũng có thể tạo các lối tắt launcher cũ mà không tương tác với ShortcutManager . Trước đây, intent này chỉ có thể tạo ra các lối tắt launcher cũ.
- Các lối tắt được tạo bằng cách sử dụng requestPinShortcut() và các lối tắt được tạo trong một Activity xử lý Intent ACTION_CREATE_SHORTCUT bây giờ đã là các lối tắt chính thức. Kết quả là các ứng dụng bây giờ có thể cập nhật chúng bằng các phương thức trong ShortcutManager .
- Các lối tắt cũ giữ lại chức năng của chúng từ các phiên bản Android trước nhưng bạn phải chuyển chúng sang các lối tắt ứng dụng bằng tay trong ứng dụng của bạn. Để tìm hiểu thêm về thay đổi cho lối tắt ứng dụng, hãy xem hướng dẫn của Pinning Shortcuts and Widgets .
Locale và quốc tế hóa
Android 7.0 (API mức 24) đã giới thiệu khái niệm về việc có thể chỉ định một Locale loại mặc định, nhưng một số API tiếp tục sử dụng phương thức Locale.getDefault() chung chung, không có đối số, trong khi họ nên sử dụng đối số mặc định Category.DISPLAY. Trong Android O, các phương thức sau hiện sử dụng Locale.getDefault(Category.DISPLAY) thay vì Locale.getDefault() :
Currency.getDisplayName() Currency.getSymbol() Locale.getDisplayScript()
Locale.getDisplayScript(Locale) cũng quay lại Locale.getDefault() khi giá trị displayScript được chỉ định cho đối số Locale không có sẵn.
Các thay đổi bổ sung về địa phương và quốc tế liên quan như sau:
- Gọi Currency.getDisplayName(null) ném một NullPointerException , khớp với hành vi được ghi lại.
- Phân tích cú pháp tên múi giờ đã thay đổi. Trước đây, thiết bị Android sử dụng giá trị đồng hồ hệ thống lấy mẫu khi khởi động để lưu trữ tên vùng thời gian sử dụng để phân tích cú pháp ngày tháng. Kết quả là việc phân tách cú pháp có thể bị ảnh hưởng tiêu cực nếu đồng hồ hệ thống sai khi khởi động hoặc trong các trường hợp hiếm hoi khác. Bây giờ, trong các trường hợp phổ biến, logic phân tích sử dụng ICU và giá trị đồng hồ hệ thống hiện tại khi phân tích tên múi giờ. Thay đổi này cung cấp kết quả chính xác hơn, có thể khác với phiên bản Android sớm hơn khi ứng dụng của bạn sử dụng các lớp như SimpleDateFormat .
- Android O cập nhật phiên bản của ICU lên phiên bản 58.
Cửa sổ cảnh báo
Nếu ứng dụng sử dụng quyền SYSTEM_ALERT_WINDOW và sử dụng một trong các loại cửa sổ sau để cố gắng hiển thị cửa sổ cảnh báo trên các ứng dụng và cửa sổ hệ thống khác:
TYPE_PHONE TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT TYPE_SYSTEM_OVERLAY TYPE_SYSTEM_ERROR
... sau đó các cửa sổ này luôn xuất hiện bên dưới các cửa sổ sử dụng loại cửa sổ TYPE_APPLICATION_OVERLAY . Nếu ứng dụng nhắm mục tiêu Android O, ứng dụng sử dụng loại cửa sổ TYPE_APPLICATION_OVERLAY để hiển thị cửa sổ cảnh báo.
Để biết thêm thông tin, xem các loại cửa sổ thông thường cho phần cửa sổ cảnh báo bên trong các thay đổi về hành vi đối với Ứng dụng nhắm mục tiêu Android O.
Nhập và điều hướng
Với sự xuất hiện của các ứng dụng Android trên Chrome OS và các yếu tố hình thức lớn khác, chẳng hạn như máy tính bảng, chúng ta thấy sự hồi sinh của việc sử dụng điều hướng bàn phím trong các ứng dụng Android. Trong Android O, Google đã định hướng lại bằng cách sử dụng bàn phím làm thiết bị đầu vào điều hướng, dẫn đến một mô hình đáng tin cậy, có thể dự đoán được cho điều hướng dựa trên mũi tên và tab.
Cụ thể, Google đã thực hiện những thay đổi sau đây đối với hành vi tập trung yếu tố:
- Nếu bạn không xác định bất kỳ màu trạng thái focus nào cho một đối tượng View (foreground hoặc background drawable), framework sẽ thiết lập màu highlight mặc định cho View . Focus highlight này là một ripple effect dựa trên theme của Activity. Nếu bạn không muốn đối tượng View sử dụng highlight mặc định này khi nhận được focus, hãy đặt thuộc tính android:defaultFocusHighlightEnabled thành false trong tệp XML có chứa View hoặc pass false vào phương thức setDefaultFocusHighlightEnabled() trong logic UI của ứng dụng của bạn.
- Để kiểm tra xem đầu vào bàn phím ảnh hưởng như thế nào đến việc focus UI, bạn có thể bật tùy chọn Drawing > Show layout bounds trong Developer option. Trong Android O, tùy chọn này sẽ hiển thị biểu tượng "X" trên phần tử hiện đang focus. Ngoài ra, tất cả các phần tử thanh công cụ trong Android O là các nhóm điều hướng bàn phím tự động, giúp người dùng dễ dàng điều hướng vào và ra khỏi từng thanh công cụ một cách tổng thể.
Để tìm hiểu thêm về cách cải tiến hỗ trợ điều hướng bàn phím trong ứng dụng của bạn, hãy đọc Hướng dẫn về Hướng dẫn Bàn phím Hỗ trợ .
Tự động điền biểu mẫu trên web
Giờ đây, Autofill Framework cung cấp chức năng tự động điền tích hợp, các phương thức sau đây liên quan đến các đối tượng WebView đã thay đổi cho các ứng dụng được cài đặt trên các thiết bị chạy Android O:
WebSettings
-
Phương thức *getSaveFormData()* trả về false . Trước đây, phương pháp này trả về true thay vào đó.
-
Gọi *setSaveFormData()* không còn tác dụng nữa.
WebViewDatabase
-
Gọi *clearFormData()* không còn tác dụng nữa.
-
Phương thức *hasFormData()* trả về false . Trước đây, phương pháp này trở lại true khi mẫu chứa dữ liệu.
Khả năng tiếp cận
Các dịch vụ trợ năng giờ đây đã nhận thức được tất cả các ClickableSpan trong các đối tượng TextView trong ứng dụng của bạn.
Để tìm hiểu thêm về làm thế nào để làm cho ứng dụng của bạn dễ truy cập hơn, xem mục Trợ năng.
Kết nối mạng và HTTP(S)
Android O bao gồm các thay đổi về hành vi sau đây đối với kết nối mạng và HTTP(S):
- OPTIONS yêu cầu không có Content-Length: 0 tiêu đề Content-Length: 0 . Trước đây chúng không có tiêu đề Content-Length .
- HttpURLConnection chuẩn hóa URL có chứa các đường dẫn trống bằng cách thêm dấu gạch chéo sau tên máy chủ lưu trữ hoặc tên quyền hạn bằng dấu gạch chéo. Ví dụ: nó chuyển đổi http://example.com thành http://example.com/ .
- Bộ chọn proxy tùy chỉnh được đặt thông qua ProxySelector.setDefault () chỉ nhắm mục tiêu địa chỉ (lược đồ, máy chủ và cổng) của một URL được yêu cầu. Do đó, lựa chọn proxy chỉ có thể dựa trên các giá trị đó. URL được chuyển đến một bộ chọn proxy tùy chỉnh không bao gồm đường dẫn URL, thông số truy vấn hoặc mẩu URL yêu cầu.
- Các URI không thể chứa label rỗng. Trước đây, nền tảng hỗ trợ giải pháp để chấp nhận các label rỗng trong các tên máy chủ, đó là việc sử dụng các URI bất hợp pháp. Cách giải quyết này là để tương thích với phiên bản libcore cũ hơn. Các nhà phát triển sử dụng API không chính xác sẽ thấy một thông báo của ADB: "Ví dụ URI ..com có "URI example..com has empty labels in the hostname. This is malformed and will not be accepted in future Android releases.". Android O gỡ bỏ cách giải quyết này; Hệ thống trả về null cho các URI không đúng định dạng.
- Thực thi HttpsURLConnection của Android O không thực hiện giao thức TLS / SSL không an toàn.
- Xử lý đường hầm Các kết nối HTTP(S) đã thay đổi như sau:
-
Khi đường hầm kết nối HTTPS qua kết nối, hệ thống sẽ đặt một cách chính xác số cổng (: 443) vào dòng Host khi gửi thông tin này đến một máy chủ trung gian. Trước đây, số cổng chỉ xuất hiện trong đường CONNECT.
-
Hệ thống không còn gửi tiêu đề người dùng đại lý và ủy quyền ủy quyền từ yêu cầu đường hầm đến máy chủ proxy. Hệ thống không còn gửi tiêu đề ủy quyền proxy trên Http (đường hầm) đường hầm URLConnection đến proxy khi thiết lập đường hầm. Thay vào đó, hệ thống tạo ra tiêu đề ủy quyền proxy và gửi nó tới proxy khi proxy gửi HTTP 407 để đáp ứng yêu cầu ban đầu. Tương tự như vậy, hệ thống không còn sao chép tiêu đề user-agent từ yêu cầu đường hầm đến yêu cầu proxy thiết lập đường hầm. Thay vào đó, thư viện tạo tiêu đề user-agent cho yêu cầu đó.
- Phương thức send(java.net.DatagramPacket) ném một SocketException nếu phương thức connect() đã thực hiện trước đó không thành công.
-
*DatagramSocket.connect ()* thiết lập một pendingSocketException nếu có lỗi nội bộ. Trước khi Android O, một cuộc gọi recv() tiếp theo đã ném một SocketException mặc dù một cuộc gọi send() sẽ thành công. Đối với tính nhất quán, cả hai cuộc gọi bây giờ ném một SocketException.
- InetAddress.isReachable () cố gắng ICMP trước khi rơi trở lại giao thức TCP Echo.
-
Một số máy chủ chặn cổng 7 (TCP Echo), chẳng hạn như google.com, bây giờ có thể trở nên có thể truy cập nếu họ chấp nhận giao thức ICMP Echo.
-
Đối với máy chủ thực sự không thể truy cập, sự thay đổi này có nghĩa là gấp đôi thời gian đã bỏ ra trước khi cuộc gọi trở lại.
Bluetooth
Android O làm cho những thay đổi sau đây về độ dài của dữ liệu mà phương thức ScanRecord.getBytes() lấy ra:
- Phương thức getBytes() không có giả định về số byte nhận được. Do đó, các ứng dụng không nên dựa vào bất kỳ số byte tối thiểu hoặc tối đa nào được trả về. Thay vào đó, họ nên đánh giá chiều dài của mảng kết quả.
- Các thiết bị tương thích Bluetooth 5 có thể trả về chiều dài dữ liệu vượt quá mức tối đa trước đó ~ 60 byte.
- Nếu một thiết bị từ xa không cung cấp phản hồi quét, có thể trả lại ít hơn 60 byte.
Kết nối liền mạch
Android O thực hiện một số cải tiến cho Cài đặt Wi-Fi để giúp bạn chọn mạng Wi-Fi dễ dàng hơn cung cấp trải nghiệm người dùng tốt nhất. Những thay đổi cụ thể bao gồm:
- Cải tiến độ ổn định và độ tin cậy.
- Một giao diện người dùng dễ đọc hơn, trực quan hơn.
- Trình đơn Tuỳ chọn Wi-Fi đơn, hợp nhất.
- Trên các thiết bị tương thích, tự động kích hoạt Wi-Fi khi mạng lưu có chất lượng cao gần đó.
Bảo mật
Android O bao gồm các thay đổi liên quan đến bảo mật sau:
- Nền tảng không còn hỗ trợ SSLv3.
- Khi thiết lập một kết nối HTTPS đến một máy chủ không chính xác thực hiện đàm phán phiên bản giao thức TLS, HttpsURLConnection không còn cố gắng giải quyết vấn đề quay lại các phiên bản giao thức TLS trước đó và thử lại.
- Android O áp dụng bộ lọc Secure Computing (SECCOMP) cho tất cả các ứng dụng. Danh sách các syscalls cho phép được giới hạn cho những người tiếp xúc thông qua bionic. Mặc dù có một số syscalls khác được cung cấp cho tính tương thích ngược, chúng tôi khuyên bạn nên chống lại việc sử dụng chúng.
- Các đối tượng WebView của ứng dụng của bạn bây giờ chạy ở chế độ đa xử lý. Nội dung Web được xử lý trong một quá trình tách biệt, riêng biệt từ quy trình của ứng dụng chứa nó để tăng cường bảo mật.
- Bạn không còn có thể giả định rằng APK nằm trong thư mục có tên kết thúc bằng -1 hoặc -2. Ứng dụng nên sử dụng sourceDir để lấy thư mục, và không dựa vào định dạng thư mục trực tiếp.
- Để biết thông tin về các cải tiến bảo mật liên quan đến việc sử dụng các thư viện native, hãy xem Thư viện Native . Để biết thêm các nguyên tắc về làm cho ứng dụng của bạn an toàn hơn, xem Bảo mật dành cho Nhà phát triển Android .
Riêng tư
Android O thực hiện các thay đổi liên quan đến bảo mật đối với nền tảng này.
- Nền tảng bây giờ xử lý các định danh khác nhau.
-
Đối với các ứng dụng đã được cài đặt trước OTA cho phiên bản Android O (cấp độ API 26), giá trị ANDROID_ID vẫn giữ nguyên trừ khi không được cài đặt và sau đó cài đặt lại sau OTA. Để bảo vệ các giá trị trên các lượt gỡ cài đặt sau OTA, các nhà phát triển có thể liên kết các giá trị cũ và mới bằng cách sử dụng Khóa/Giá trị sao lưu .
-
Đối với các ứng dụng được cài đặt trên thiết bị chạy Android O, giá trị của ANDROID_ID hiện được tính cho mỗi khoá đăng ký ứng dụng cũng như cho mỗi người dùng. Giá trị của ANDROID_ID là duy nhất cho mỗi tổ hợp khóa, người dùng và thiết bị đăng ký ứng dụng. Kết quả là, các ứng dụng có khóa chữ ký khác nhau chạy trên cùng một thiết bị không còn nhìn thấy cùng một ID Android (ngay cả đối với cùng một người dùng).
-
Giá trị ANDROID_ID không thay đổi khi gỡ cài đặt hoặc cài đặt lại gói, miễn là khóa đăng ký giống nhau (và ứng dụng đã không được cài đặt trước một OTA cho một phiên bản của O).
-
Giá trị ANDROID_ID không thay đổi ngay cả khi bản cập nhật hệ thống gây ra khoá ký kết gói thay đổi. Để có một hệ thống tiêu chuẩn đơn giản để kiếm tiền từ ứng dụng, hãy sử dụng Advertising ID. Advertising ID là một ID duy nhất, có thể đặt lại người dùng để quảng cáo do các dịch vụ của Google Play cung cấp.
- Truy vấn thuộc net.hostname hệ thống net.hostname sẽ cho kết quả null.
Ghi lại các trường hợp ngoại lệ không được khai báo
Nếu một ứng dụng cài đặt một Thread.UncaughtExceptionHandler mà không gọi qua Thread.UncaughtExceptionHandler mặc định, hệ thống sẽ không kill ứng dụng khi một exception không được xác định xảy ra. Bắt đầu từ Android O, hệ thống sẽ ghi lại stacktrace trong trường hợp này; Trong các phiên bản trước của nền tảng, hệ thống sẽ không log stacktrace ngoại lệ.
Google khuyên rằng tùy chỉnh Thread.UncaughtExceptionHandler triển khai luôn luôn gọi thông qua để xử lý mặc định; Ứng dụng tuân theo đề xuất này không bị ảnh hưởng bởi sự thay đổi trong Android O.
Số liệu thống kê sử dụng Contacts provider thay đổi
Trong các phiên bản trước của Android, Contacts provider cho phép các nhà phát triển lấy dữ liệu sử dụng cho từng địa chỉ liên hệ. Dữ liệu sử dụng này hiển thị thông tin cho từng địa chỉ email và từng số điện thoại liên quan đến số liên lạc, bao gồm số lần liên lạc được liên lạc và lần cuối cùng liên lạc được liên lạc. Ứng dụng yêu cầu quyền READ_CONTACTS có thể đọc dữ liệu này.
Ứng dụng vẫn có thể đọc dữ liệu này nếu họ yêu cầu cho phép READ_CONTACTS . Bắt đầu trong Android O, các truy vấn cho dữ liệu sử dụng trả về xấp xỉ hơn là giá trị chính xác. Hệ thống Android duy trì các giá trị chính xác nội bộ, do đó, thay đổi này không ảnh hưởng đến API auto-complete.
Thay đổi hành vi này ảnh hưởng đến các tham số truy vấn sau:
TIMES_CONTACTED TIMES_USED LAST_TIME_CONTACTED LAST_TIME_USED
Xử lý Collection
AbstractCollection.removeAll() và AbstractCollection.retainAll() bây giờ luôn luôn ném một NullPointerException ; Trước đây, NullPointerException không bị ném ra khi bộ sưu tập trống. Thay đổi này làm cho hành vi phù hợp với tài liệu.
Android enterprise
Android O thay đổi hành vi của một số API và tính năng cho các ứng dụng doanh nghiệp, bao gồm bộ điều khiển chính sách thiết bị (DPC). Các thay đổi bao gồm:
- Các hành vi mới để giúp các hồ sơ công việc hỗ trợ ứng dụng trên thiết bị được quản lý đầy đủ.
- Thay đổi để xử lý cập nhật hệ thống, xác minh ứng dụng và xác thực để tăng tính toàn vẹn của thiết bị và hệ thống.
- Cải tiến trải nghiệm người dùng cho việc cung cấp, thông báo, màn hình Recent và VPN luôn bật. Để xem tất cả các doanh nghiệp thay đổi trong Android O và tìm hiểu cách chúng có thể ảnh hưởng đến ứng dụng của bạn, hãy đọc Android in Enterprise.
(Còn tiếp) (Lược dịch từ https://developer.android.com/preview/behavior-changes.html)