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 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 trực tuyến trên toàn thế giới. Kể 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 Android Oreo Cấu hình (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. Mới tính năng phần cứng hằng số để cho phép bạn nhắm mục tiêu việc phân phối ứng dụng của mình đến thiết bị có RAM bình thường hoặc có mức RAM thấp thông qua Google Play.
- Google Play.Mặc dù tất cả ứng dụng đều sẽ có trên thiết bị chạy Android Oreo (phiên bản Go), Google Play sẽ giúp các ứng dụng được nhà phát triển tối ưu hoá riêng để cung cấp trải nghiệm tuyệt vời cho hàng tỷ người với toà nhà cho hàng tỷ người nguyên tắc.
Chúng tôi đã cập nhật toà nhà cho hàng tỷ người dùng kèm theo hướng dẫn bổ sung về cách tối ưu hoá ứng dụng của bạn cho các thiết bị đang 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.
Cập nhật khung tự động điền
Android 8.1 (API cấp 27) cung cấp một số cải tiến cho tính năng Tự động điền khung mà bạn có thể kết hợp 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 cách biểu diễn chuỗi
để điền vào các thành phần hiển thị yêu cầu dữ liệu một cách thích hợp.
Ngoài ra, AutofillManager
lớp này 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 khả năng hiển thị của một
trong một cấu trúc ảo. Ngoài ra còn có quá nhiều phương thức cho
cấu trúc ảo. Tuy nhiên, các cấu trúc không phải cấu trúc ảo thường không yêu cầu bạn
thông báo rõ ràng cho khung này vì phương thức này đã được gọi bởi
View
.
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 trong việc giúp dịch vụ tự động điền làm rõ khái niệm
đang được lưu; ví dụ: khi màn hình chứa thẻ tín dụng, thẻ có thể
hiển thị biểu trưng của ngân hàng thẻ tín dụng, bốn số cuối của thẻ tín dụng
và số hết hạn của số đó. Để 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 bao gồm các thay đổi sau đố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à Không hỗ trợConditionProviderService
trên mức RAM thấp Thiết bị chạy Android trả vềtrue
khiActivityManager.isLowRamDevice()
sẽ được gọi.
Cập nhật EditText
Kể từ API cấp 27, phương thức EditText.getText()
trả về một Editable
; trước đây
hàm này trả về một CharSequence
. Thay đổi này
tương thích ngược, do 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ể xác định bằng cách lập trình cách ứ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ể để ứng dụng tự động thực hiện một hành động cụ thể, chẳng hạn như quay lại trang an toàn—mỗi khi gặp một URL mà Duyệt web an toàn được phân loại là mối đe doạ đã biết.
Lưu ý: Để được bảo vệ tối ưu trước những mối đe doạ đã biết, hãy đợi
cho đến khi bạn khởi chạy Duyệt web an toàn trước khi gọi một
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:
<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 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ệ
là tỷ lệ khung hình nguồn, nhưng được điều chỉnh theo tỷ lệ để vừa với hình chữ nhật có chiều rộng và
chiều cao. Đ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ì 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. Cho
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 thiết lập chế độ bảo vệ bộ nhớ
trên
SharedMemory
để đọc và/hoặc ghi, vì
SharedMemory
là Parcelable, bạn có thể dễ dàng truyền đối tượng đó đến một quy trình khác thông qua AIDL.
SharedMemory
API 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 ánh xạ để đọc và ghi. Thật tuyệt vời
một cách để chia sẻ 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 của bạn cung cấp màu sắc
vào 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 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:
- Cách tạo một
WallpaperColors
bằng cách sử dụng 3 màu, hãy tạo một thực thể củaWallpaperColors
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 trung gian từ hình nền, hãy gọi các phương thức sau:
getPrimaryColor()
trả về màu đại diện 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.getTertiaryColor()
phương thức 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,
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 một trình nghe khi thay đổi màu sắc, bạn có thể gọi phương thức addOnColorsChangedListener()
. Bạn có thể
cũng gọi phương thức getWallpaperColors()
để truy xuất các màu chính của hình nền.
Cập nhật vân tay
Lớp FingerprintManager
có
đã 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
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. Conscrypt
việc triển khai được ưu tiên sử dụng hơn Lâu đài Bouncy hiện có
trong quá trình triển khai. 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)
người từ chối tham gia hoạt động lâu hơn 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. Từ
đôi khi, các nhà phát triển truy cập những tính năng này theo cách phản chiếu,
các đoạn đệm được dành để
hỗ trợ 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
. SSLSession
phương thức dùng để gửiIllegalArgumentException
khi truyền tham chiếu rỗng, giờ đây chúng 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 việc đọc ổ cắm bị gián đoạn do ổ cắm đang đóng, Conscrypt đã sử dụng
để trả về -1 từ lần đọc. Chế độ đọc hiện sẽ gửi
SocketException
. - Bộ chứng chỉ CA gốc đã được thay đổi, hầu hết là xoá một số lượng chứng chỉ đã lỗi thời, ngoài ra còn 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, 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.