Android 8.1 (API cấp 27) giới thiệu nhiều tính năng các tính năng và chức năng mới cho người dùng và nhà phát triển. Tài liệu này nêu bật những điểm mới dành cho nhà phát triển.
Android Oreo (phiên bản Go)
Android Go là sáng kiến của chúng tôi nhằm tối ưu hoá trải nghiệm Android cho hàng tỷ người dùng trực tuyến trên khắp thế giới. Kể từ Android 8.1, chúng tôi đang nỗ lực để biến Android trở thành một nền tảng tuyệt vời cho các thiết bị cấp thấp. Các tính năng trong cấu hình Android Oreo (phiên bản Go) bao gồm:
- Tối ưu hoá bộ nhớ. Cải thiện mức sử dụng bộ nhớ trên toàn bộ nền tảng để đảm bảo giúp ứng dụng có thể chạy hiệu quả trên thiết bị có RAM 1GB trở xuống.
- Tùy chọn nhắm mục tiêu linh hoạt. Hằng số tính năng phần cứng mới cho phép bạn nhắm mục tiêu phân phối ứng dụng đến các thiết bị thông thường hoặc có dung lượng RAM thấp thông qua Google Play.
- Google Play. Mặc dù tất cả ứng dụng đều có trên các thiết bị chạy Android Oreo (phiên bản Go), nhưng Google Play sẽ hiển thị những ứng dụng được nhà phát triển tối ưu hoá riêng để mang đến trải nghiệm tuyệt vời cho hàng tỷ người dùng thông qua các nguyên tắc tạo ứng dụng cho hàng tỷ người dùng.
Chúng tôi đã cập nhật bản dựng cho hàng tỷ nguyên tắc bằng hướng dẫn bổ sung về cách tối ưu hoá ứng dụng cho các thiết bị chạy Android Oreo (phiên bản Go). Đối với hầu hết các nhà phát triển, việc tối ưu hoá APK hiện có hoặc sử dụng của Google Play Tính năng đa APK để nhắm mục tiêu một phiên bản APK của bạn đến các thiết bị có dung lượng RAM thấp là cách tốt nhất để chuẩn bị cho thiết bị đang chạy Android Oreo (phiên bản Go). Hãy nhớ rằng việc tạo ứng dụng nhẹ nhàng và hiệu quả hơn mang lại lợi ích cho toàn bộ đối tượng của bạn, bất kể thiết bị nào.
Neural Networks API
Neural Networks API cung cấp tính toán tăng tốc và suy luận cho máy trên thiết bị các khung học tập như TensorFlow Lite – Thư viện học máy đa nền tảng của Google dành cho thiết bị di động: cũng như Caffe2 và các công ty khác. Truy cập vào TensorFlow Lite nguồn mở repo để tải xuống và tài liệu. TensorFlow Lite kết hợp với Neural Networks API để chạy các mô hình như MobileNets, Inception phiên bản 3, và Trả lời thông minh một cách hiệu quả trên thiết bị di động.
Bản cập nhật khung tự động điền
Android 8.1 (API cấp 27) cung cấp một số điểm cải tiến cho Khung tự động điền mà bạn có thể đưa vào ứng dụng của mình.
BaseAdapter
lớp này hiện bao gồm setAutofillOptions()
, phương thức này cho phép bạn cung cấp các biểu diễn dạng chuỗi của các giá trị trong một
bộ chuyển đổi. Thông tin này rất hữu ích cho spinner
những chế độ kiểm soát tự động tạo các giá trị trong bộ chuyển đổi. Ví dụ:
bạn có thể sử dụng phương thức setAutofillOptions()
để cung cấp một chuỗi
đại diện cho danh sách năm mà người dùng có thể chọn như một phần của
ngày hết hạn thẻ tín dụng. Dịch vụ tự động điền có thể sử dụng bản trình bày chuỗi để điền chính xác vào các thành phần hiển thị yêu cầu dữ liệu.
Ngoài ra, lớp AutofillManager
bao gồm phương thức notifyViewVisibilityChanged(View, int, boolean)
mà bạn có thể gọi để thông báo cho khung về những thay đổi về chế độ hiển thị của thành phần hiển thị trong cấu trúc ảo. Ngoài ra, phương thức này còn có phương thức nạp chồng cho các cấu trúc không phải ảo. Tuy nhiên, các cấu trúc không ảo thường không yêu cầu bạn thông báo rõ ràng cho khung vì phương thức này đã được lớp View
gọi.
Android 8.1 cũng giúp Dịch vụ tự động điền có thêm khả năng tuỳ chỉnh giao diện người dùng lưu
thành phần tương tác bằng cách thêm tính năng hỗ trợ cho CustomDescription
and
Validator
trong SaveInfo
.
Nội dung mô tả tuỳ chỉnh rất hữu ích để giúp dịch vụ tự động điền làm rõ nội dung đang được lưu; ví dụ: khi màn hình chứa thẻ tín dụng, màn hình có thể hiển thị biểu trưng của ngân hàng phát hành thẻ tín dụng, bốn số cuối của số thẻ tín dụng và ngày hết hạn của thẻ. Để tìm hiểu thêm, hãy xem
CustomDescription
.
Validator
các đối tượng được dùng để tránh hiển thị giao diện người dùng lưu thông tin tự động điền khi Trình xác thực
không được đáp ứng. Để tìm hiểu thêm, hãy xem
Lớp xác thực cùng với các lớp con của nó,
LuhnChecksumValidator và RegexValidator.
Thông báo
Android 8.1 có các thay đổi sau đây đối với thông báo:
- Giờ đây, các ứng dụng chỉ có thể phát âm thanh cảnh báo cho thông báo một lần mỗi giây. Âm thanh cảnh báo vượt quá mức này không được đưa vào hàng đợi và sẽ bị mất. Thay đổi này không ảnh hưởng đến các khía cạnh khác của thông báo hành vi và thông báo vẫn được đăng như dự kiến.
-
NotificationListenerService
vàConditionProviderService
không được hỗ trợ trên các thiết bị chạy Android có dung lượng RAM thấp, trả vềtrue
khiActivityManager.isLowRamDevice()
được gọi.
Cập nhật EditText
Kể từ API cấp 27, phương thức EditText.getText()
sẽ trả về Editable
; trước đây, phương thức này trả về CharSequence
. Thay đổi này tương thích ngược vì Editable
triển khai CharSequence
.
Giao diện Editable
cung cấp thêm
của Google. Ví dụ: vì Editable
cũng
triển khai giao diện Spannable
, bạn có thể áp dụng mã đánh dấu cho
nội dung trong một thực thể của EditText
.
Các thao tác Duyệt web an toàn có lập trình
Bằng cách sử dụng
WebView
triển khai Safe Browsing API, ứng dụng của bạn có thể
phát hiện thời điểm một thực thể của WebView
cố gắng di chuyển
vào một URL mà Google đã phân loại là mối đe doạ đã biết. Theo mặc định,
WebView
hiển thị một quảng cáo xen kẽ cảnh báo người dùng về mối đe doạ đã biết.
Màn hình này cho phép người dùng tải URL bằng mọi cách hoặc quay lại
trang trước đó sao cho an toàn.
Trong Android 8.1, bạn có thể lập trình để xác định ứng dụng phản hồi một mối đe doạ đã biết:
- Bạn có thể kiểm soát việc ứng dụng của mình có báo cáo các mối đe doạ đã biết đến chế độ An toàn hay không Duyệt web.
- Bạn có thể yêu cầu ứng dụng tự động thực hiện một hành động cụ thể (chẳng hạn như quay lại trạng thái an toàn) mỗi khi gặp một URL mà tính năng Duyệt web an toàn phân loại là mối đe doạ đã biết.
Lưu ý: Để bảo vệ tối ưu khỏi các mối đe doạ đã biết, hãy đợi cho đến khi bạn khởi chạy tính năng Duyệt web an toàn trước khi gọi phương thức loadUrl()
của đối tượng WebView
.
Các đoạn mã sau đây cho thấy cách bạn có thể hướng dẫn các thực thể của ứng dụng
WebView
để luôn quay lại an toàn sau khi gặp
mối đe doạ đã biết:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /manifest
MyWebActivity.java
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
MyWebViewClient.java
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
Công cụ trích xuất hình thu nhỏ video
Lớp MediaMetadataRetriever
có một phương thức mới, getScaledFrameAtTime()
, tìm một khung gần một vị trí thời gian nhất định và trả về một bitmap có cùng tỷ lệ khung hình với khung nguồn, nhưng được điều chỉnh theo tỷ lệ để vừa với một hình chữ nhật có chiều rộng và chiều cao nhất định. Điều này rất hữu ích trong việc tạo hình thu nhỏ từ video.
Bạn nên sử dụng phương thức này thay vì getFrameAtTime()
vì có thể gây lãng phí bộ nhớ
vì nó trả về một bitmap có cùng độ phân giải với video nguồn. Để
ví dụ: khung hình từ video 4K sẽ là bitmap 16 MB, lớn hơn nhiều so với
cần có một hình thu nhỏ.
API bộ nhớ dùng chung
Android 8.1 (API cấp 27) ra mắt một tính năng mới
SharedMemory
API. Với lớp học này, bạn có thể tạo, lập bản đồ và quản lý
SharedMemory
thực thể. Bạn đặt tính năng bảo vệ bộ nhớ trên đối tượng SharedMemory
để đọc và/hoặc ghi. Vì đối tượng SharedMemory
có thể phân phối, nên bạn có thể dễ dàng truyền đối tượng đó đến một quy trình khác thông qua AIDL.
API SharedMemory
tương tác với cơ sở ASharedMemory
trong NDK.
ASharedMemory
cấp quyền truy cập vào chỉ số mô tả tệp, sau đó có thể được liên kết để đọc và ghi. Đây là một cách tuyệt vời để chia sẻ lượng lớn dữ liệu giữa các ứng dụng hoặc giữa nhiều quy trình trong một ứng dụng.
API WallpaperColors
Android 8.1 (API cấp 27) cho phép hình nền động cung cấp thông tin về màu sắc cho giao diện người dùng của hệ thống. Bạn thực hiện việc này bằng cách tạo một WallpaperColors
đối tượng đó từ bitmap, một đối tượng có thể vẽ hoặc sử dụng 3 màu được chọn thủ công.
Bạn cũng có thể truy xuất thông tin màu này.
Cách tạo một WallpaperColors
, hãy thực hiện một trong các thao tác sau:
- Để tạo đối tượng
WallpaperColors
bằng 3 màu, hãy tạo một thực thể của lớpWallpaperColors
bằng cách truyền màu chính, màu phụ và màu thứ ba. Chính color không được rỗng. - Cách tạo một
WallpaperColors
đối tượng từ một bitmap, hãy gọifromBitmap()
bằng cách truyền nguồn bitmap dưới dạng thông số. - Cách tạo một
WallpaperColors
đối tượng của một đối tượng có thể vẽ, hãy gọifromDrawable()
bằng cách truyền nguồn có thể vẽ dưới dạng tham số.
Để truy xuất thông tin chi tiết về màu chính, phụ hoặc màu thứ ba từ hình nền, hãy gọi các phương thức sau:
getPrimaryColor()
trả về màu sắc đại diện nhất về mặt hình ảnh của hình nền.getSecondaryColor()
trả về màu nổi bật thứ hai của hình nền.- Phương thức
getTertiaryColor()
trả về màu sắc nổi bật thứ ba của hình nền.
Để thông báo cho hệ thống về mọi thay đổi đáng kể về màu sắc trong hình nền động,
gọi notifyColorsChanged()
. Phương thức này kích hoạt vòng đời onComputeColors()
sự kiện mà bạn có cơ hội cung cấp WallpaperColors
mới
.
Để thêm trình nghe cho các thay đổi về màu sắc, bạn có thể gọi phương thức addOnColorsChangedListener()
. Bạn cũng có thể gọi phương thức getWallpaperColors()
để truy xuất màu chính của hình nền.
Cập nhật vân tay
Lớp FingerprintManager
đã giới thiệu các mã lỗi sau:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– Người dùng đã thử quá nhiều lần để mở khoá thiết bị của họ bằng trình đọc vân tay. -
FINGERPRINT_ERROR_VENDOR
– Vân tay dành riêng cho nhà cung cấp đã xảy ra lỗi trình đọc.
Tin cập nhật về mật mã học
Android 8.1 đã thực hiện một số thay đổi về mật mã:
- Các thuật toán mới đã được triển khai trong Conscrypt. Bạn nên sử dụng phương thức triển khai
Conscrypt thay vì phương thức triển khai
Bouncy Castle hiện có. Các thuật toán mới bao gồm:
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
không còn hoạt động đối với các thuật toán sử dụng GCM. Thay vào đó, hãy sử dụnggetParameterSpec(GCMParameterSpec.class)
.- Nhiều lớp Conscrypt nội bộ liên kết với TLS đã được tái cấu trúc. Vì
các nhà phát triển đôi khi truy cập vào các lớp này một cách phản chiếu, nên các lớp đệm đã được giữ nguyên để
hỗ trợ việc sử dụng trước đó, nhưng một số chi tiết đã thay đổi. Ví dụ: ổ cắm
trước đây thuộc kiểu
OpenSSLSocketImpl
, nhưng bây giờ chúng thuộc kiểuConscryptFileDescriptorSocket
hoặcConscryptEngineSocket
, cả hai đều mở rộngOpenSSLSocketImpl
. - Các phương thức
SSLSession
từng gửiIllegalArgumentException
khi được truyền tham chiếu rỗng, giờ đây sẽ gửiNullPointerException
. - RSA
KeyFactory
không còn cho phép tạo khoá nữa từ các mảng byte lớn hơn khoá đã mã hoá. Cuộc gọi đếngeneratePrivate()
vàgeneratePublic()
mang lạiKeySpec
trong đó cấu trúc chính không lấp đầy toàn bộ vùng đệm sẽ dẫn đếnInvalidKeySpecException
. - Khi một ổ cắm đọc bị gián đoạn do ổ cắm đang đóng, Conscrypt sẽ trả về -1 từ ổ cắm đọc. Chế độ đọc hiện sẽ gửi
SocketException
. - Tập hợp chứng chỉ CA gốc đã được thay đổi, chủ yếu là xoá một số lượng lớn các chứng chỉ đã lỗi thời, nhưng cũng xoá các chứng chỉ gốc cho WoSign và StartCom. Để biết thêm thông tin về quyết định này, vui lòng xem Bài đăng trên blog về bảo mật, Cuối cùng xoá bỏ niềm tin trong Chứng chỉ WoSign và StartCom.