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

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

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