Các tính năng và API của Android 9

Android 9 (API cấp 28) mang đến các tính năng và chức năng mới tuyệt vờ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.

Để tìm hiểu về các API mới, hãy đọc báo cáo điểm khác biệt về API hoặc truy cập vào Tài liệu tham khảo về API Android. Ngoài ra, hãy nhớ xem Các thay đổi về hành vi của Android 9 để tìm hiểu những khía cạnh mà các thay đổi của nền tảng có thể ảnh hưởng đến ứng dụng của bạn.

Định vị trong nhà bằng Wi-Fi RTT

Các API RTT mới hỗ trợ tính năng định vị trong nhà trong các ứng dụng của bạn.

Android 9 bổ sung tính năng hỗ trợ nền tảng cho giao thức Wi-Fi IEEE 802.11-2016 (còn gọi là Thời gian khứ hồi của Wi-Fi (RTT)) để bạn có thể tận dụng tính năng định vị trong nhà trong các ứng dụng của mình.

Trên các thiết bị chạy Android 9 có hỗ trợ phần cứng, ứng dụng của bạn có thể dùng RTT API để đo khoảng cách đến điểm truy cập (AP) Wi-Fi có hỗ trợ RTT ở gần. Thiết bị phải bật dịch vụ vị trí và bật chế độ quét tìm Wi-Fi (trong phần Cài đặt > Vị trí), đồng thời ứng dụng của bạn phải có quyền ACCESS_FINE_LOCATION. Thiết bị không cần kết nối với các điểm truy cập để sử dụng RTT. Để duy trì quyền riêng tư, chỉ điện thoại mới có thể xác định khoảng cách đến điểm truy cập; các điểm truy cập không có thông tin này.

Nếu thiết bị của bạn đo khoảng cách đến 3 điểm truy cập trở lên, bạn có thể dùng một thuật toán đa phương vị để ước tính vị trí thiết bị phù hợp nhất với những phép đo đó. Kết quả thường chính xác trong vòng từ 1 đến 2 mét.

Với độ chính xác này, bạn có thể tạo ra những trải nghiệm mới, chẳng hạn như chỉ đường trong nhà và các dịch vụ dựa trên vị trí có độ chi tiết cao, chẳng hạn như tính năng điều khiển bằng giọng nói không mơ hồ (ví dụ: "Bật đèn này") và thông tin dựa trên vị trí (chẳng hạn như "Có ưu đãi đặc biệt nào cho sản phẩm này không?").

Hãy xem WiFi RTT API đang được dùng trong ứng dụng minh hoạ Android WifiRttScan.

Để biết thêm thông tin, hãy xem bài viết Vị trí Wi-Fi: đo khoảng cách bằng RTT.

Hỗ trợ vết cắt trên màn hình

Màn hình Tuỳ chọn cho nhà phát triển cho thấy nhiều kích thước vết cắt

Kiểm thử vết cắt trên màn hình bằng trình mô phỏng

Android 9 hỗ trợ các màn hình tràn viền mới nhất có vết cắt trên màn hình cho camera và loa. Lớp DisplayCutout cho phép bạn tìm hiểu vị trí và hình dạng của các khu vực không có chức năng mà nội dung không được hiển thị. Để xác định sự tồn tại và vị trí của các vùng bị cắt này, hãy sử dụng phương thức getDisplayCutout().

Một thuộc tính bố cục cửa sổ mới, layoutInDisplayCutoutMode, cho phép ứng dụng của bạn bố trí nội dung xung quanh các vết cắt trên thiết bị. Bạn có thể đặt thuộc tính này thành một trong các giá trị sau:

Bạn có thể mô phỏng vết cắt trên màn hình trên mọi thiết bị hoặc trình mô phỏng chạy Android 9 theo cách sau:

  1. Bật tuỳ chọn cho nhà phát triển.
  2. Trong màn hình Tuỳ chọn cho nhà phát triển, hãy di chuyển xuống phần Vẽ rồi chọn Mô phỏng màn hình có vết cắt.
  3. Chọn kích thước của phần cắt.

Thông báo

Android 9 giới thiệu một số điểm cải tiến cho thông báo. Tất cả những điểm này đều có sẵn cho các nhà phát triển nhắm đến API cấp 28 trở lên.

Thông báo về tin nhắn

MessagingStyle có ảnh đính kèm.

Thông báo về tin nhắn

MessagingStyle có câu trả lời và cuộc trò chuyện.

Để xem mã mẫu sử dụng thông báo, bao gồm cả các tính năng của Android 9, hãy xem Mẫu People.

Trải nghiệm nhắn tin nâng cao

Kể từ Android 7.0 (API cấp 24), bạn có thể thêm một thao tác để trả lời tin nhắn hoặc nhập văn bản khác ngay trong một thông báo. Android 9 cải thiện tính năng này bằng những điểm cải tiến sau:

  • Hỗ trợ đơn giản cho người tham gia cuộc trò chuyện: Lớp Person được dùng để xác định những người tham gia cuộc trò chuyện, bao gồm cả hình đại diện và URI của họ. Nhiều API khác, chẳng hạn như addMessage(), hiện tận dụng lớp Person thay vì CharSequence. Lớp Person cũng hỗ trợ mẫu thiết kế Trình tạo.

  • Hỗ trợ hình ảnh: Android 9 hiện hiển thị hình ảnh trong Thông báo tin nhắn trên điện thoại. Bạn có thể sử dụng setData() trên thông báo để hiển thị hình ảnh. Đoạn mã sau đây minh hoạ cách tạo một Person và một thông báo chứa hình ảnh.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Lưu câu trả lời dưới dạng bản nháp: Ứng dụng của bạn có thể truy xuất EXTRA_REMOTE_INPUT_DRAFT do hệ thống gửi khi người dùng vô tình đóng thông báo nhắn tin. Bạn có thể dùng tiện ích bổ sung này để điền sẵn vào các trường văn bản trong ứng dụng để người dùng có thể hoàn tất câu trả lời của họ.

  • Xác định xem một cuộc trò chuyện có phải là cuộc trò chuyện nhóm hay không: Bạn có thể dùng setGroupConversation() để xác định một cách có chủ đích xem một cuộc trò chuyện có phải là cuộc trò chuyện nhóm hay không.

  • Đặt thao tác ngữ nghĩa cho một ý định: Phương thức setSemanticAction() cho phép bạn đặt ý nghĩa ngữ nghĩa cho một thao tác, chẳng hạn như "đánh dấu là đã đọc", "xoá", "trả lời", v.v.

  • SmartReply: Android 9 hỗ trợ các câu trả lời đề xuất tương tự có trong ứng dụng nhắn tin của bạn. Sử dụng RemoteInput.setChoices() để cung cấp một mảng các câu trả lời tiêu chuẩn cho người dùng.

Chế độ cài đặt kênh, thông báo truyền tin và chế độ Không làm phiền

Android 8.0 giới thiệu Kênh thông báo, cho phép bạn tạo một kênh mà người dùng có thể tuỳ chỉnh cho từng loại thông báo bạn muốn hiển thị. Android 9 đơn giản hoá chế độ cài đặt kênh thông báo bằng những thay đổi sau:

  • Chặn nhóm kênh: Giờ đây, người dùng có thể chặn toàn bộ nhóm kênh trong phần cài đặt thông báo của một ứng dụng. Bạn có thể dùng phương thức isBlocked() để xác định thời điểm một nhóm bị chặn và do đó, không gửi bất kỳ thông báo nào cho các kênh trong nhóm đó.

    Ngoài ra, ứng dụng của bạn có thể truy vấn các chế độ cài đặt nhóm kênh hiện tại bằng phương thức getNotificationChannelGroup() mới.

  • Các loại ý định truyền tin mới: Hệ thống Android hiện gửi ý định truyền tin khi trạng thái chặn của các kênh thông báo và nhóm kênh thay đổi. Ứng dụng sở hữu kênh hoặc nhóm bị chặn có thể theo dõi các ý định này và phản ứng cho phù hợp. Để biết thêm thông tin về các thao tác và phần bổ sung theo ý định này, hãy tham khảo danh sách hằng số mới nhất trong tài liệu tham khảo NotificationManager. Để biết thông tin về cách phản hồi các ý định truyền tin, hãy tham khảo phần Thông báo truyền tin.

  • NotificationManager.Policy có 3 danh mục ưu tiên mới cho chế độ Không làm phiền:

  • NotificationManager.Policy cũng có 7 hằng số mới của chế độ Không làm phiền mà bạn có thể dùng để ngăn chặn sự gián đoạn về hình ảnh:

Hỗ trợ nhiều camera và cập nhật camera

Trên các thiết bị chạy Android 9, bạn có thể truy cập đồng thời các luồng từ 2 camera thực trở lên. Trên các thiết bị có camera kép phía trước hoặc phía sau, bạn có thể tạo các tính năng cải tiến mà chỉ một camera không thể thực hiện được, chẳng hạn như thu phóng liền mạch, hiệu ứng bokeh và tầm nhìn lập thể. API này cũng cho phép bạn gọi một luồng camera logic hoặc luồng camera kết hợp tự động chuyển đổi giữa hai hoặc nhiều camera.

Những điểm cải tiến khác trong camera bao gồm các tham số bổ sung của Phiên giúp giảm độ trễ trong quá trình chụp ban đầu và tính năng chia sẻ bề mặt cho phép các ứng dụng camera xử lý nhiều trường hợp sử dụng mà không cần dừng và bắt đầu truyền phát trực tiếp bằng camera. Chúng tôi cũng đã thêm các API cho tính năng hỗ trợ đèn flash dựa trên màn hình và quyền truy cập vào dấu thời gian OIS để ổn định hình ảnh ở cấp ứng dụng và các hiệu ứng đặc biệt.

Trong Android 9, API nhiều camera hỗ trợ camera đơn sắc cho các thiết bị có khả năng FULL hoặc LIMITED. Đầu ra đơn sắc đạt được thông qua định dạng YUV_420_888 với Y là thang độ xám, U (Cb) là 128 và V (Cr) là 128.

Android 9 cũng hỗ trợ các camera USB/UVC bên ngoài trên các thiết bị được hỗ trợ.

ImageDecoder cho các đối tượng có thể vẽ và bitmap

Android 9 giới thiệu lớp ImageDecoder, cung cấp một phương pháp hiện đại hoá để giải mã hình ảnh. Hãy dùng lớp này thay vì các API BitmapFactoryBitmapFactory.Options.

ImageDecoder cho phép bạn tạo Drawable hoặc Bitmap từ một vùng đệm byte, một tệp hoặc một URI. Để giải mã một hình ảnh, trước tiên, hãy gọi createSource() bằng nguồn của hình ảnh đã mã hoá. Sau đó, hãy gọi decodeDrawable() hoặc decodeBitmap() bằng cách truyền đối tượng ImageDecoder.Source để tạo Drawable hoặc Bitmap. Để thay đổi chế độ cài đặt mặc định, hãy truyền OnHeaderDecodedListener đến decodeDrawable() hoặc decodeBitmap(). ImageDecoder gọi onHeaderDecoded() với chiều rộng và chiều cao mặc định của hình ảnh, sau khi biết được các giá trị này. Nếu hình ảnh được mã hoá là GIF động hoặc WebP, decodeDrawable() sẽ trả về một Drawable là một thực thể của lớp AnimatedImageDrawable.

Bạn có thể sử dụng nhiều phương thức để đặt các thuộc tính hình ảnh:

  • Để điều chỉnh tỷ lệ hình ảnh được giải mã theo một kích thước chính xác, hãy truyền kích thước mục tiêu vào setTargetSize(). Bạn cũng có thể điều chỉnh tỷ lệ hình ảnh bằng cách sử dụng kích thước mẫu. Truyền kích thước mẫu trực tiếp đến setTargetSampleSize().
  • Để cắt một hình ảnh trong phạm vi của hình ảnh được chia tỷ lệ, hãy gọi setCrop().
  • Để tạo một bitmap có thể thay đổi, hãy truyền true vào setMutableRequired().

ImageDecoder cũng cho phép bạn thêm các hiệu ứng phức tạp và tuỳ chỉnh vào hình ảnh, chẳng hạn như các góc bo tròn hoặc mặt nạ hình tròn. Sử dụng setPostProcessor() với một phiên bản của lớp PostProcessor để thực thi bất kỳ lệnh vẽ nào bạn muốn.

Ảnh động

Android 9 giới thiệu lớp AnimatedImageDrawable để vẽ và hiển thị hình ảnh động GIF và WebP. AnimatedImageDrawable hoạt động tương tự như AnimatedVectorDrawable ở chỗ luồng kết xuất điều khiển ảnh động của AnimatedImageDrawable. Luồng kết xuất cũng sử dụng một luồng worker để giải mã, nhờ đó quá trình giải mã không ảnh hưởng đến các thao tác khác trên luồng kết xuất. Việc triển khai này cho phép ứng dụng của bạn hiển thị một hình ảnh động mà không cần quản lý các bản cập nhật hoặc can thiệp vào các sự kiện khác trên luồng giao diện người dùng của ứng dụng.

Bạn có thể giải mã AnimatedImageDrawable bằng một phiên bản của ImageDecoder. Đoạn mã sau đây cho biết cách sử dụng ImageDecoder để giải mã AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder có một số phương thức cho phép bạn sửa đổi thêm hình ảnh. Ví dụ: bạn có thể dùng phương thức setPostProcessor() để sửa đổi giao diện của hình ảnh, chẳng hạn như áp dụng một mặt nạ hình tròn hoặc các góc bo tròn.

Video HDR VP9, tính năng nén ảnh HEIF và API Đa phương tiện

Android 9 hỗ trợ VP9 Dải động cao (HDR) Cấu hình 2, vì vậy bạn có thể cung cấp các bộ phim hỗ trợ HDR cho người dùng từ YouTube, Play Phim và các nguồn khác trên các thiết bị hỗ trợ HDR.

Android 9 cũng bổ sung khả năng hỗ trợ mã hoá hình ảnh bằng định dạng tệp hình ảnh hiệu quả cao (HEIF hoặc HEIC), giúp cải thiện khả năng nén và giảm mức sử dụng dung lượng lưu trữ cũng như dữ liệu mạng. Các mẫu ảnh tĩnh HEIF được hỗ trợ trong các lớp MediaMuxerMediaExtractor. Với sự hỗ trợ của nền tảng trên các thiết bị Android 9, bạn có thể dễ dàng gửi và sử dụng hình ảnh HEIF từ máy chủ phụ trợ. Sau khi đảm bảo ứng dụng của bạn tương thích với định dạng dữ liệu này để chia sẻ và hiển thị, hãy dùng thử HEIF làm định dạng lưu trữ hình ảnh trong ứng dụng. Bạn có thể chuyển đổi từ JPEG sang HEIC bằng cách sử dụng ImageDecoder hoặc BitmapFactory (lấy một bitmap từ tệp JPEG). Sau đó, bạn có thể dùng HeifWriter để ghi hình ảnh tĩnh HEIF từ các vùng đệm byte YUV hoặc các phiên bản của Surface hoặc Bitmap.

Bạn cũng có thể xem các chỉ số về nội dung nghe nhìn trong các lớp AudioTrack, AudioRecordMediaDrm.

Android 9 giới thiệu các phương thức cho lớp MediaDRM để lấy các chỉ số, cấp độ HDCP, cấp độ bảo mật và số lượng phiên, đồng thời tăng cường khả năng kiểm soát đối với cấp độ bảo mật và các điểm dừng an toàn. Hãy xem báo cáo về sự khác biệt giữa các API để biết thông tin chi tiết.

Trong Android 9, API AAudio bổ sung khả năng hỗ trợ cho một số thuộc tính AAudioStream khác, bao gồm cả mức sử dụng, loại nội dung và chế độ cài đặt sẵn của thiết bị đầu vào. Bằng cách sử dụng các thuộc tính này, bạn có thể tạo các luồng được điều chỉnh cho các ứng dụng VoIP hoặc máy quay video. Bạn cũng có thể đặt mã phiên để liên kết một luồng AAudio với một bản phối phụ có thể bao gồm các hiệu ứng. Dùng API AudioEffect để kiểm soát các hiệu ứng.

Android 9 giới thiệu API AudioEffect để xử lý động. Với lớp này, bạn có thể tạo hiệu ứng âm thanh dựa trên kênh (bao gồm cả cân bằng, nén nhiều dải tần và bộ giới hạn) trên nhiều giai đoạn. Bạn có thể định cấu hình số lượng dải tần và giai đoạn hoạt động, đồng thời có thể kiểm soát hầu hết các thông số trong thời gian thực.

Mức độ nhạy cảm về chi phí dữ liệu trong JobScheduler

Kể từ Android 9, JobScheduler có thể sử dụng các tín hiệu trạng thái mạng do nhà mạng cung cấp để cải thiện việc xử lý các tác vụ liên quan đến mạng.

Các công việc có thể khai báo kích thước dữ liệu ước tính, tìm nạp trước tín hiệu và chỉ định các yêu cầu chi tiết về mạng. Sau đó, JobScheduler sẽ quản lý công việc theo trạng thái mạng. Ví dụ: khi mạng báo hiệu rằng mạng đang bị tắc nghẽn, JobScheduler có thể trì hoãn các yêu cầu mạng lớn. Khi ở trên một mạng không đo lường, JobScheduler có thể chạy các công việc tìm nạp trước để cải thiện trải nghiệm người dùng, chẳng hạn như bằng cách tìm nạp trước tiêu đề.

Khi thêm các công việc, hãy nhớ sử dụng setEstimatedNetworkBytes(), setPrefetch()setRequiredNetwork() khi thích hợp để giúp JobScheduler xử lý công việc đúng cách. Khi công việc của bạn thực thi, hãy nhớ sử dụng đối tượng Network do JobParameters.getNetwork() trả về. Nếu không, bạn sẽ ngầm sử dụng mạng mặc định của thiết bị. Mạng này có thể không đáp ứng các yêu cầu của bạn, dẫn đến việc sử dụng dữ liệu ngoài ý muốn.

Neural Networks API 1.1

Neural Networks API được giới thiệu trong Android 8.1 (API cấp 27) để tăng tốc quá trình học máy trên thiết bị Android. Android 9 mở rộng và cải thiện API, đồng thời bổ sung hỗ trợ cho 9 thao tác mới:

Vấn đề đã biết: Khi truyền tensor ANEURALNETWORKS_TENSOR_QUANT8_ASYMM vào toán tử ANEURALNETWORKS_PAD (có trên Android 9 trở lên), đầu ra từ NNAPI có thể không khớp với đầu ra từ các khung máy học cấp cao hơn, chẳng hạn như TensorFlow Lite. Thay vào đó, bạn chỉ nên truyền ANEURALNETWORKS_TENSOR_FLOAT32 cho đến khi vấn đề được giải quyết.

Ngoài ra, API này cũng giới thiệu một hàm mới, ANeuralNetworksModel_relaxComputationFloat32toFloat16(), cho phép bạn chỉ định có tính toán ANEURALNETWORKS_TENSOR_FLOAT32 với phạm vi và độ chính xác thấp như của định dạng dấu phẩy động IEEE 754 16 bit hay không.

Khung tự động điền

Android 9 có nhiều điểm cải tiến mà các dịch vụ tự động điền có thể triển khai để nâng cao hơn nữa trải nghiệm người dùng khi điền vào biểu mẫu. Để tìm hiểu thêm về cách sử dụng các tính năng tự động điền trong ứng dụng, hãy xem hướng dẫn về Khung tự động điền.

Các điểm cải tiến về bảo mật

Android 9 đi kèm rất nhiều tính năng bảo mật, được tóm tắt trong các phần sau:

Xác nhận bảo vệ của Android

Các thiết bị được hỗ trợ chạy Android 9 trở lên cho phép bạn sử dụng API Xác nhận bảo vệ của Android. Khi sử dụng quy trình này, ứng dụng của bạn sẽ hiển thị lời nhắc cho người dùng, yêu cầu họ phê duyệt một tuyên bố ngắn. Tuyên bố này cho phép ứng dụng khẳng định lại rằng người dùng muốn hoàn tất một giao dịch nhạy cảm, chẳng hạn như thanh toán.

Nếu người dùng chấp nhận tuyên bố nói trên, thì Kho khoá Android sẽ nhận và lưu trữ một chữ ký mã hoá được bảo vệ bằng mã xác thực thông báo dựa trên hàm băm có khoá (HMAC). Sau khi Kho khoá Android xác nhận tính hợp lệ của thông báo, ứng dụng của bạn có thể dùng khoá được tạo từ trustedConfirmationRequired trong môi trường thực thi đáng tin cậy (TEE) để ký thông báo mà người dùng đã chấp nhận. Với độ tin cậy rất cao, chữ ký này cho biết rằng người dùng đã xem và đồng ý với tuyên bố.

Thận trọng: API Xác nhận bảo vệ của Android không cung cấp kênh thông tin bảo mật cho người dùng. Ứng dụng của bạn không được đưa ra bất kỳ đảm bảo nào về tính bảo mật ngoài những đảm bảo mà nền tảng Android cung cấp. Cụ thể, không sử dụng quy trình này để hiển thị thông tin nhạy cảm mà bạn thường sẽ không hiển thị trên thiết bị của người dùng.

Để biết hướng dẫn về cách thêm tính năng hỗ trợ Xác nhận bảo vệ của Android, hãy xem hướng dẫn về Xác nhận bảo vệ của Android.

Hộp thoại xác thực bằng sinh trắc học hợp nhất

Trong Android 9, hệ thống cung cấp hộp thoại xác thực bằng sinh trắc học thay cho ứng dụng của bạn. Chức năng này tạo ra giao diện, cảm giác và vị trí chuẩn hoá cho hộp thoại, giúp người dùng tin tưởng hơn rằng họ đang xác thực bằng một trình kiểm tra thông tin xác thực sinh trắc học đáng tin cậy.

Nếu ứng dụng của bạn dùng FingerprintManager để hiển thị hộp thoại xác thực bằng vân tay cho người dùng, hãy chuyển sang dùng BiometricPrompt. BiometricPrompt dựa vào hệ thống để hiển thị hộp thoại xác thực. Dịch vụ này cũng thay đổi hành vi để thích ứng với loại xác thực sinh trắc học mà người dùng đã chọn.

Mô-đun bảo mật phần cứng

Các thiết bị được hỗ trợ chạy Android 9 trở lên đã cài đặt có thể có StrongBox KeyMint (trước đây là Keymaster), một cách triển khai HAL KeyMint (trước đây là Keymaster) nằm trong một mô-đun bảo mật phần cứng. Mô-đun này có các thành phần sau:

  • CPU riêng.
  • Bộ nhớ bảo mật.
  • Một trình tạo số ngẫu nhiên thực sự.
  • Các cơ chế bổ sung để chống lại hành vi can thiệp vào gói và cài đặt trái phép ứng dụng (không qua cửa hàng ứng dụng).

Khi kiểm tra các khoá được lưu trữ trong StrongBox KeyMint, hệ thống sẽ xác nhận tính toàn vẹn của khoá bằng Môi trường thực thi đáng tin cậy (TEE).

Để tìm hiểu thêm về cách sử dụng StrongBox KeyMint, hãy xem phần Mô-đun bảo mật phần cứng.

Nhập khoá bảo mật vào Kho khoá

Android 9 tăng cường khả năng bảo mật cho quy trình giải mã khoá bằng cách thêm khả năng nhập các khoá đã mã hoá một cách an toàn vào Kho khoá bằng cách sử dụng định dạng khoá được mã hoá ASN.1. Sau đó, KeyMint sẽ giải mã các khoá trong Keystore để nội dung của các khoá không bao giờ xuất hiện dưới dạng văn bản thuần tuý trong bộ nhớ máy chủ của thiết bị.

Tìm hiểu thêm về cách Nhập khoá đã mã hoá một cách an toàn hơn.

Lược đồ chữ ký APK có tính năng xoay vòng khoá

Android 9 bổ sung chế độ hỗ trợ cho Lược đồ chữ ký APK phiên bản 3. Lược đồ này có lựa chọn đưa bản ghi chứng minh việc xoay vòng vào khối ký của từng chứng chỉ ký. Khả năng này cho phép ứng dụng của bạn được ký bằng một chứng chỉ ký mới bằng cách liên kết các chứng chỉ ký trước đây của tệp APK với chứng chỉ mà tệp APK hiện được ký.

Tìm hiểu thêm về cách xoay vòng khoá bằng apksigner.

Lựa chọn chỉ cho phép giải mã khoá trên các thiết bị đã mở khoá

Android 9 giới thiệu cờ unlockedDeviceRequired. Lựa chọn này xác định xem Kho khoá có yêu cầu mở khoá màn hình trước khi cho phép giải mã mọi dữ liệu đang truyền hoặc được lưu trữ bằng khoá đã chỉ định hay không. Những loại khoá này rất phù hợp để mã hoá dữ liệu nhạy cảm nhằm lưu trữ trên đĩa, chẳng hạn như dữ liệu về sức khoẻ hoặc dữ liệu doanh nghiệp. Cờ này giúp người dùng yên tâm hơn rằng dữ liệu không thể giải mã khi thiết bị bị khoá nếu điện thoại của họ bị mất hoặc bị đánh cắp.

Để giữ cho khoá an toàn khỏi bị giải mã trong khi thiết bị bị khoá, hãy bật cờ bằng cách truyền true đến phương thức setUnlockedDeviceRequired(). Sau khi hoàn tất bước này, khi màn hình của người dùng bị khoá, mọi nỗ lực giải mã hoặc ký dữ liệu bằng khoá này đều sẽ thất bại. Để truy cập vào một thiết bị đã khoá, bạn cần có mã PIN, mật khẩu, vân tay hoặc một yếu tố tin cậy nào đó khác.

Hỗ trợ mã hoá cũ

Các thiết bị Android 9 sử dụng Keymaster 4 hỗ trợ Thuật toán mã hoá dữ liệu ba lần (Triple DES). Nếu ứng dụng của bạn tương tác với các hệ thống cũ yêu cầu Triple DES, hãy sử dụng loại mật mã này khi mã hoá thông tin đăng nhập nhạy cảm.

Để tìm hiểu thêm về cách tăng cường bảo mật cho ứng dụng của bạn, hãy xem bài viết Bảo mật cho nhà phát triển Android.

Ngừng cung cấp WPS

Thiết lập bảo vệ Wi-Fi (WPS) không còn được dùng vì lý do bảo mật.

Bản sao lưu trên Android

Android 9 bổ sung chức năng mới và các lựa chọn cho nhà phát triển liên quan đến việc sao lưu và khôi phục. Thông tin chi tiết về những thay đổi này sẽ xuất hiện trong các phần sau.

Bản sao lưu được mã hoá phía máy khách

Android 9 hỗ trợ mã hoá bản sao lưu Android bằng một mật khẩu ứng dụng khách. Chế độ hỗ trợ này sẽ tự động bật khi đáp ứng các điều kiện sau:

Khi biện pháp bảo vệ quyền riêng tư này được bật, bạn cần có mã PIN, hình mở khoá hoặc mật khẩu của thiết bị để khôi phục dữ liệu từ bản sao lưu do thiết bị của người dùng tạo. Để tìm hiểu thêm về công nghệ đằng sau tính năng này, hãy xem sách trắng về Dịch vụ kho khoá Google Cloud.

Xác định các điều kiện thiết bị cần có để sao lưu

Nếu dữ liệu ứng dụng của bạn có chứa thông tin hoặc lựa chọn ưu tiên nhạy cảm, thì Android 9 cho phép bạn xác định các điều kiện của thiết bị mà theo đó dữ liệu của ứng dụng được đưa vào bản sao lưu của người dùng, chẳng hạn như khi tính năng mã hoá phía máy khách được bật hoặc đang diễn ra quá trình chuyển dữ liệu cục bộ giữa các thiết bị.

Để tìm hiểu thêm về cách sao lưu dữ liệu trên thiết bị Android, hãy xem bài viết Tổng quan về tính năng sao lưu dữ liệu.

Hỗ trợ tiếp cận

Android 9 giới thiệu các điểm cải tiến cho khung hỗ trợ tiếp cận, giúp bạn dễ dàng mang đến trải nghiệm tốt hơn nữa cho người dùng ứng dụng của bạn.

Ngữ nghĩa điều hướng

Các thuộc tính được thêm vào Android 9 giúp bạn dễ dàng xác định cách các dịch vụ hỗ trợ tiếp cận (đặc biệt là trình đọc màn hình) di chuyển từ phần này sang phần khác của màn hình. Các thuộc tính này có thể giúp người dùng khiếm thị nhanh chóng di chuyển qua văn bản trong giao diện người dùng của ứng dụng và cho phép họ lựa chọn.

Ví dụ: trong một ứng dụng mua sắm, trình đọc màn hình có thể giúp người dùng di chuyển trực tiếp từ một danh mục ưu đãi sang danh mục tiếp theo mà không cần trình đọc màn hình phải đọc tất cả các mục trong một danh mục trước khi chuyển sang danh mục tiếp theo.

Tiêu đề của ngăn hỗ trợ tiếp cận

Trong Android 8.1 (API cấp 27) trở xuống, các dịch vụ hỗ trợ tiếp cận không phải lúc nào cũng xác định được thời điểm một ngăn cụ thể trên màn hình được cập nhật, chẳng hạn như khi một hoạt động thay thế một mảnh bằng một mảnh khác. Các ngăn bao gồm các phần tử giao diện người dùng được nhóm một cách hợp lý và có liên quan về mặt hình ảnh, thường bao gồm một mảnh.

Trong Android 9, bạn có thể cung cấp tiêu đề ngăn hỗ trợ tiếp cận hoặc tiêu đề có thể nhận dạng riêng lẻ cho các ngăn này. Nếu một ngăn có tiêu đề ngăn hỗ trợ tiếp cận, thì các dịch vụ hỗ trợ tiếp cận sẽ nhận được thông tin chi tiết hơn khi ngăn thay đổi. Khả năng này cho phép các dịch vụ cung cấp thêm thông tin chi tiết cho người dùng về những thay đổi trong giao diện người dùng.

Để chỉ định tiêu đề của một ngăn, hãy sử dụng thuộc tính android:accessibilityPaneTitle. Bạn cũng có thể cập nhật tiêu đề của một ngăn giao diện người dùng được thay thế tại thời gian chạy bằng cách sử dụng setAccessibilityPaneTitle(). Ví dụ: bạn có thể cung cấp tiêu đề cho vùng nội dung của đối tượng Fragment.

Điều hướng dựa trên tiêu đề

Nếu ứng dụng của bạn hiển thị nội dung dạng văn bản có tiêu đề logic, hãy đặt thuộc tính android:accessibilityHeading thành true cho các thực thể View đại diện cho những tiêu đề đó. Bằng cách thêm các tiêu đề này, bạn cho phép các dịch vụ hỗ trợ tiếp cận giúp người dùng điều hướng trực tiếp từ tiêu đề này sang tiêu đề tiếp theo. Mọi dịch vụ hỗ trợ tiếp cận đều có thể sử dụng khả năng này để cải thiện trải nghiệm điều hướng giao diện người dùng của người dùng.

Điều hướng và đầu ra theo nhóm

Theo truyền thống, trình đọc màn hình đã sử dụng thuộc tính android:focusable để xác định thời điểm chúng nên đọc ViewGroup hoặc một tập hợp các đối tượng View dưới dạng một đơn vị. Bằng cách đó, người dùng có thể hiểu rằng các khung hiển thị có liên quan với nhau một cách hợp lý.

Trong Android 8.1 trở xuống, bạn cần đánh dấu từng đối tượng View trong ViewGroup là không thể lấy tiêu điểm và chính ViewGroup là có thể lấy tiêu điểm. Cách sắp xếp này khiến một số trường hợp View được đánh dấu là có thể lấy tiêu điểm theo cách khiến việc điều hướng bằng bàn phím trở nên rườm rà hơn.

Kể từ Android 9, bạn có thể sử dụng thuộc tính android:screenReaderFocusable thay cho thuộc tính android:focusable trong những trường hợp việc làm cho đối tượng View có thể lấy tiêu điểm sẽ gây ra hậu quả không mong muốn. Trình đọc màn hình đặt tiêu điểm vào tất cả các phần tử đã đặt android:screenReaderFocusable hoặc android:focusable thành true.

Thao tác thuận tiện

Android 9 bổ sung tính năng hỗ trợ thực hiện các thao tác thuận tiện thay cho người dùng:

Tương tác với chú thích
Các tính năng được thêm vào trong khung hỗ trợ tiếp cận cho phép bạn truy cập vào chú giải công cụ trong giao diện người dùng của một ứng dụng. Hãy sử dụng getTooltipText() để đọc văn bản của phần chú thích, đồng thời sử dụng ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP để hướng dẫn các thực thể của View hiển thị hoặc ẩn phần chú thích của chúng.
Đã thêm các thao tác chung
Android 9 hỗ trợ 2 thao tác bổ sung trên thiết bị trong lớp AccessibilityService. Dịch vụ của bạn có thể giúp người dùng khoá thiết bị và chụp ảnh màn hình bằng các thao tác GLOBAL_ACTION_LOCK_SCREENGLOBAL_ACTION_TAKE_SCREENSHOT tương ứng.

Thông tin chi tiết về thay đổi cửa sổ

Android 9 giúp bạn dễ dàng theo dõi các bản cập nhật cho cửa sổ của một ứng dụng khi ứng dụng vẽ lại nhiều cửa sổ cùng lúc. Khi sự kiện TYPE_WINDOWS_CHANGED xảy ra, hãy sử dụng API getWindowChanges() để xác định cách các cửa sổ thay đổi. Trong một lần cập nhật nhiều cửa sổ, mỗi cửa sổ tạo ra một nhóm sự kiện riêng. Phương thức getSource() trả về khung hiển thị gốc của cửa sổ liên kết với mỗi sự kiện.

Nếu một ứng dụng đã xác định tiêu đề của ngăn hỗ trợ tiếp cận cho các đối tượng View, thì dịch vụ của bạn có thể nhận ra khi giao diện người dùng của ứng dụng được cập nhật. Khi sự kiện TYPE_WINDOW_STATE_CHANGED xảy ra, hãy sử dụng các loại do getContentChangeTypes() trả về để xác định cách cửa sổ đã thay đổi. Ví dụ: khung có thể phát hiện khi một ngăn có tiêu đề mới hoặc khi một ngăn đã biến mất.

Góc xoay

Để loại bỏ trường hợp xoay ngoài ý muốn, chúng tôi đã thêm một chế độ ghim hướng hiện tại ngay cả khi vị trí thiết bị thay đổi. Người dùng có thể kích hoạt chế độ xoay theo cách thủ công khi cần bằng cách nhấn một nút trên thanh hệ thống.

Trong hầu hết các trường hợp, tác động về khả năng tương thích đối với các ứng dụng là rất nhỏ. Tuy nhiên, nếu ứng dụng của bạn có bất kỳ hành vi xoay tuỳ chỉnh nào hoặc sử dụng bất kỳ chế độ cài đặt hướng màn hình bất thường nào, thì bạn có thể gặp phải các vấn đề mà trước đây bạn không nhận thấy, khi lựa chọn ưu tiên xoay của người dùng luôn được đặt thành hướng dọc. Bạn nên xem xét hành vi xoay màn hình trong tất cả các hoạt động chính của ứng dụng và đảm bảo rằng tất cả chế độ cài đặt hướng màn hình vẫn mang lại trải nghiệm tối ưu.

Để biết thêm thông tin, hãy xem các thay đổi về hành vi có liên quan.

Thiết bị di động xoay có chế độ xoay mới cho phép người dùng kích hoạt chế độ xoay theo cách thủ công

Một chế độ xoay mới cho phép người dùng kích hoạt chế độ xoay theo cách thủ công khi cần bằng cách sử dụng một nút trên thanh hệ thống.

Văn bản

Android 9 mang đến những tính năng liên quan đến văn bản sau cho nền tảng:

  • Văn bản được tính toán trước: Lớp PrecomputedText giúp cải thiện hiệu suất kết xuất văn bản bằng cách cho phép bạn tính toán và lưu thông tin cần thiết vào bộ nhớ đệm trước. Thư viện này cũng cho phép ứng dụng của bạn thực hiện bố cục văn bản bên ngoài luồng chính.

  • Kính lúp: Lớp Magnifier là một tiện ích nền tảng cung cấp API kính lúp, cho phép mang đến trải nghiệm nhất quán về tính năng kính lúp trên tất cả các ứng dụng.

  • Smart Linkify: Android 9 tăng cường lớp TextClassifier, tận dụng công nghệ học máy để xác định một số thực thể trong văn bản đã chọn và đề xuất các hành động. Ví dụ: TextClassifier có thể cho phép ứng dụng của bạn phát hiện thấy người dùng đã chọn một số điện thoại. Sau đó, ứng dụng của bạn có thể đề xuất người dùng thực hiện cuộc gọi điện thoại bằng số đó. Các tính năng trong TextClassifier thay thế chức năng của lớp Linkify.

  • Bố cục văn bản: Một số phương thức và thuộc tính tiện lợi giúp bạn dễ dàng triển khai thiết kế giao diện người dùng. Để biết thông tin chi tiết, hãy xem tài liệu tham khảo về TextView.

ART chuyển đổi trước thời hạn các tệp DEX

Trên các thiết bị chạy Android 9 trở lên, trình biên dịch trước khi thực thi (AOT) của Android Runtime (ART) sẽ tối ưu hoá thêm các tệp định dạng Dalvik Executable (DEX) đã nén bằng cách chuyển đổi các tệp DEX trong một gói ứng dụng thành một biểu thức nhỏ gọn hơn. Thay đổi này giúp ứng dụng của bạn khởi động nhanh hơn và tiêu thụ ít dung lượng ổ đĩa cũng như RAM hơn.

Việc cải thiện này đặc biệt có lợi cho các thiết bị tầm thấp có tốc độ I/O ổ đĩa chậm hơn.

Theo dõi hệ thống trên thiết bị

Android 9 cho phép bạn ghi lại dấu vết hệ thống trên thiết bị, sau đó chia sẻ báo cáo về các bản ghi này với nhóm phát triển. Báo cáo này hỗ trợ nhiều định dạng, bao gồm cả HTML.

Bằng cách thu thập các dấu vết này, bạn có thể ghi lại dữ liệu về thời gian liên quan đến các quy trình và luồng của ứng dụng, đồng thời xem các loại trạng thái thiết bị quan trọng khác trên toàn cầu.

Để tìm hiểu thêm về công cụ này, hãy xem phần Thực hiện hoạt động theo dõi hệ thống trên thiết bị.