Tính năng và API của Android 8.1

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ó, LuhnChecksumValidatorRegexValidator.

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 khi ActivityManager.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:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</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 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ủa WallpaperColors 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ọi fromBitmap() 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ọi fromDrawable() 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:

Để 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ụng getParameterSpec(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ểu ConscryptFileDescriptorSocket hoặc ConscryptEngineSocket, cả hai đều mở rộng OpenSSLSocketImpl.
  • SSLSession phương thức dùng để gửi IllegalArgumentException khi truyền tham chiếu rỗng, giờ đây chúng gửi NullPointerException.
  • 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 đến generatePrivate()generatePublic() mang lại KeySpec trong đó cấu trúc chính không lấp đầy toàn bộ vùng đệm sẽ dẫn đến InvalidKeySpecException.
  • 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.