Android 8.1 (API cấp 27) giới thiệu nhiều tính năng và chức năng mới cho người dùng cũng như nhà phát triển. Tài liệu này nêu bật những tính năng 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 truy cập Internet trên khắp thế giới. Bắt đầu từ Android 8.1, chúng tôi đang biến Android thành một nền tảng tuyệt vời dành cho các thiết bị cấp thấp. Các tính năng trong cấu hình của 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 nền tảng để đảm bảo các ứng dụng có thể chạy hiệu quả trên các 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 thiết bị có RAM bình thường hoặc thiết bị có dung lượng RAM thấp thông qua Google Play.
- Google Play.Mặc dù mọi ứng dụng đều có thể sử dụng trên các thiết bị chạy Android Oreo (phiên bản Go), nhưng Google Play sẽ cung cấp khả năng hiển thị các ứng dụng được nhà phát triển tối ưu hoá riêng để mang lại trải nghiệm chất lượng cao cho hàng tỷ người bằng toà nhà dành cho hàng tỷ nguyên tắc.
Chúng tôi đã cập nhật toà nhà cho hàng tỷ nguyên tắc bằng cách bổ sung hướng dẫn về cách tối ưu hoá ứng dụng của bạn 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á tệp APK hiện có hoặc sử dụng tính năng Nhiều tệp APK của Google Play để nhắm một phiên bản tệp APK tới thiết bị có dung lượng RAM thấp là cách tốt nhất để chuẩn bị cho các thiết bị chạy Android Oreo (phiên bản Go). Hãy nhớ rằng việc làm cho ứng dụng nhẹ hơn và hiệu quả hơn sẽ mang lại lợi ích cho toàn bộ đối tượng, bất kể thiết bị là gì.
Neural Networks API
Neural Networks API cung cấp tính năng tính toán và dự đoán nhanh hơn cho các khung học máy trên thiết bị 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 khung khác. Truy cập vào kho lưu trữ nguồn mở của TensorFlow Lite để tải xuống và đăng tài liệu. TensorFlow Lite hoạt động với Neural Networks API để chạy các mô hình như MobileNets, Inception v3 và Trả lời thông minh một cách hiệu quả trên thiết bị di động của bạn.
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 đối với Khung tự động điền mà bạn có thể đưa vào ứng dụng.
Lớp BaseAdapter
hiện bao gồm phương thức
setAutofillOptions()
, cho phép bạn cung cấp các chuỗi đại diện của các giá trị trong
bộ chuyển đổi. Điều này rất hữu ích đối với các nút điều khiển spinner (hình xoay) giúp tạo giá trị một cách linh động 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 biểu thị danh sách năm mà người dùng có thể chọn làm ngày hết hạn của thẻ tín dụng. Dịch vụ tự động điền có thể sử dụng cách biểu diễn dạng chuỗi để điền vào các thành phần hiển thị cần dữ liệu một cách thích hợp.
Ngoài ra, lớp AutofillManager
còn 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 liên quan đến chế độ hiển thị của một thành phần hiển thị trong cấu trúc ảo. Ngoài ra, còn có tình trạng quá tải phương thức cho các cấu trúc không ả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 mang đến cho Dịch vụ tự động điền thêm khả năng tuỳ chỉnh khả năng lưu giao diện người dùng 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 trong việc 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 thẻ tín dụng, 4 chữ số cuối của số thẻ tín dụng và số hết hạn của thẻ tín dụng đó. Để tìm hiểu thêm, hãy xem lớp
CustomDescription
.
Các đối tượng
Validator
được dùng để tránh hiện giao diện người dùng lưu thông tin tự động điền khi không đáp ứng điều kiện của trình xác thực. Để tìm hiểu thêm, hãy xem lớp
Validator cùng với các lớp con của lớp này,
LuhnChecksumValidator và RegexValidator.
Thông báo
Android 8.1 bao gồm 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 thông báo một lần mỗi giây. Âm thanh cảnh báo vượt quá tốc độ này sẽ không được đưa vào hàng đợi và bị mất. Thay đổi này không ảnh hưởng đến các khía cạnh khác của hành vi thông báo và nội dung 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 và 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ề một Editable
; trước đó phương thức này đã trả về một CharSequence
. Thay đổi này có khả năng tương thích ngược, vì Editable
triển khai CharSequence
.
Giao diện Editable
cung cấp chức năng bổ sung có giá trị. Ví dụ: vì Editable
cũng triển khai giao diện Spannable
, nên 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 hành động trong tính năng Duyệt web an toàn có lập trình
Bằng cách sử dụng
cách triển khai WebView
của 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 chuyển đến một URL mà Google đã phân loại là mối đe doạ đã biết. Theo mặc định, WebView
sẽ 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 cung cấp cho người dùng lựa chọn vẫn tải URL hoặc quay lại trang trước một cách an toàn.
Trong Android 8.1, bạn có thể xác định theo phương thức lập trình cách ứng dụng của mình 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 cho tính năng Duyệt web an toàn hay không.
- Bạn có thể yêu cầu ứng dụng của mình tự động thực hiện một thao tác cụ thể (chẳng hạn như quay lại trang an toàn) mỗi khi ứng dụng gặp một URL mà dịch vụ 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 trước 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 bạn biết cách hướng dẫn các thực thể WebView
của ứng dụng luôn quay lại chế độ an toàn sau khi gặp một mối đe doạ đã biết:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
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!"); } } }); }
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 là getScaledFrameAtTime()
. Phương thức này sẽ tìm một khung hình 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 khi 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ì phương thức này có thể làm lãng phí bộ nhớ vì phương thức này sẽ trả về một bitmap có cùng độ phân giải với video nguồn. Ví dụ: một khung hình từ video 4K sẽ là một bitmap 16 MB, lớn hơn nhiều so với mức cần thiết của một hình thu nhỏ.
API bộ nhớ dùng chung
Android 8.1 (API cấp 27) giới thiệu một API SharedMemory
mới. Lớp này cho phép bạn tạo, liên kết và quản lý một thực thể SharedMemory
ẩn danh. Bạn đặt chế độ bảo vệ bộ nhớ trên đối tượng SharedMemory
để đọc và/hoặc ghi. Do đối tượng SharedMemory
là Parcelable nên bạn có thể dễ dàng truyền đối tượng này sang một quy trình khác thông qua AIDL.
API SharedMemory
sẽ tương tác với chức năng ASharedMemory
trong NDK.
ASharedMemory
cấp quyền truy cập vào chỉ số mô tả tệp mà sau đó có thể được ánh xạ để đọ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 hệ thống. Bạn thực hiện việc này bằng cách tạo một đối tượng WallpaperColors
từ một bitmap, một đối tượng có thể vẽ hoặc bằng cách 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.
Để tạo đối tượng WallpaperColors
, hãy làm theo một trong những cách sau:
- Để tạo một đối tượng
WallpaperColors
bằng cách sử dụ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. Màu chính không được rỗng. - Để tạo đối tượng
WallpaperColors
từ bitmap, hãy gọi phương thứcfromBitmap()
bằng cách truyền nguồn bitmap dưới dạng tham số. - Để tạo đối tượng
WallpaperColors
từ một đối tượng có thể vẽ, hãy gọi phương thứcfromDrawable()
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 trực quan nhất 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 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, hãy gọi phương thức notifyColorsChanged()
. Phương thức này kích hoạt một sự kiện trong vòng đời onComputeColors()
, tại đó bạn có cơ hội cung cấp một đối tượng WallpaperColors
mới.
Để thêm trình nghe để biết 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
đã
đưa ra 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ị bằng trình đọc vân tay. -
FINGERPRINT_ERROR_VENDOR
– Đã xảy ra lỗi trình đọc vân tay của nhà cung cấp.
Nội dung cập nhật về mật mã học
Một số thay đổi về mật mã học đã được thực hiện với Android 8.1:
- Các thuật toán mới đã được triển khai trong Conscrypt. Phương thức triển khai Conscrypt được ưu tiên sử dụng hơn 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 cho các thuật toán dùng GCM nữa. 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ì đôi khi các nhà phát triển truy cập vào các phần này một cách tương tự, nên shim đã được giữ lại để hỗ trợ việc sử dụng trước đó, nhưng một số thông tin chi tiết đã thay đổi. Ví dụ: trước đây ổ cắm thuộc loại
OpenSSLSocketImpl
, nhưng hiện tại thuộc loạiConscryptFileDescriptorSocket
hoặcConscryptEngineSocket
, cả hai đều mở rộng loạiOpenSSLSocketImpl
. - Các phương thức
SSLSession
dùng để gửiIllegalArgumentException
khi được truyền một tham chiếu rỗng, giờ đây các phương thức đó sẽ gửiNullPointerException
. - RSA
KeyFactory
không còn cho phép tạo khoá từ những mảng byte lớn hơn khoá mã hoá. Các lệnh gọi đếngeneratePrivate()
vàgeneratePublic()
cung cấp mộtKeySpec
mà trong đó cấu trúc khoá không lấp đầy toàn bộ vùng đệm sẽ dẫn đến mộtInvalidKeySpecException
. - Khi quá trình đọc ổ cắm bị gián đoạn do ổ cắm bị đóng, Conscrypt dùng để trả về -1 từ quá trình đọc. Thao tác đọc lúc này sẽ gửi
SocketException
. - Nhóm các chứng chỉ CA gốc đã được thay đổi, chủ yếu xoá một số lượng lớn chứng chỉ lỗi thời, nhưng cũng xoá các chứng chỉ gốc của WoSign và StartCom. Để biết thêm thông tin về quyết định này, hãy xem bài đăng trên Blog về bảo mật của Google, Loại bỏ tin cậy cuối cùng trong Chứng chỉ WoSign và StartCom.