Tổng quan về các tính năng và API

Android 11 mang đến cho nhà phát triển các tính năng và API mới tuyệt vời. Các phần dưới đây giúp bạn tìm hiểu các tính năng cho ứng dụng cũng như làm quen với các API liên quan.

Để biết danh sách chi tiết về các API mới, đã được sửa đổi, cũng như đã bị xoá, hãy đọc báo cáo điểm khác biệt về API. Để biết thông tin chi tiết về các API mới, vui lòng truy cập tài liệu tham khảo về API cho Android (các API mới được trình bày nổi bật). Ngoài ra, để tìm hiểu những thay đổi của nền tảng có thể tác động đến ứng dụng của bạn, hãy nhớ tham khảo các thay đổi về hành vi của Android 11 đối với ứng dụng nhắm đến Android Rtất cả ứng dụng, cũng như các thay đổi về quyền riêng tư.

Trải nghiệm mới

Điều khiển thiết bị

Android 11 bao gồm một API ControlsProviderService mới mà bạn có thể sử dụng để hiển thị các chế độ điều khiển cho các thiết bị bên ngoài đã kết nối. Các chế độ điều khiển này xuất hiện trong phần Điều khiển thiết bị trong trình đơn nguồn của Android. Để biết thêm thông tin, hãy xem phần Điều khiển thiết bị bên ngoài.

Điều khiển nội dung nghe nhìn

Android 11 cập nhật cách hiển thị các nút điều khiển nội dung nghe nhìn. Các nút điều khiển nội dung nghe nhìn sẽ xuất hiện gần phần cài đặt nhanh. Phiên hoạt động trên nhiều ứng dụng được sắp xếp trong một băng chuyền có thể vuốt, bao gồm các luồng phát trên điện thoại, các luồng từ xa (chẳng hạn như các phiên phát được phát hiện trên thiết bị bên ngoài hoặc phiên truyền) và các phiên trước đó, có thể tiếp tục theo thứ tự phát gần đây nhất.

Người dùng có thể khởi động lại các phiên trước đó từ băng chuyền mà không cần khởi động ứng dụng. Khi quá trình phát bắt đầu, người dùng tương tác với các nút điều khiển nội dung nghe nhìn theo cách thông thường.

Để biết thêm thông tin, hãy xem phần các chế độ điều khiển nội dung nghe nhìn.

Màn hình

Hỗ trợ tốt hơn cho màn hình dạng thác nước

Android 11 cung cấp một số API để hỗ trợ màn hình dạng thác nước, cho thấy những màn hình bao quanh cạnh thiết bị. Các màn hình này được coi là một biến thể của màn hình có phần cắt màn hình. Các phương thức DisplayCutout.getSafeInset…() hiện tại sẽ trả về phần lồng ghép an toàn để tránh các khu vực thác nước cũng như phần cắt. Để hiển thị nội dung ứng dụng trong khu vực thác nước, hãy làm như sau:

  • Gọi DisplayCutout.getWaterfallInsets() để nhận kích thước chính xác của phần lồng ghép thác nước.

  • Đặt thuộc tính bố cục cửa sổ layoutInDisplayCutoutMode thành LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS để cho phép cửa sổ mở rộng vào các khu vực cắt và thác nước ở tất cả các cạnh của màn hình. Bạn phải đảm bảo rằng không có nội dung thiết yếu nào nằm trong vùng cắt hoặc thác nước.

Cảm biến góc bản lề và thiết bị có thể gập lại

Android 11 cho phép các ứng dụng chạy trên thiết bị có cấu hình màn hình dựa trên bản lề xác định góc bản lề bằng cách cung cấp một cảm biến mới với TYPE_HINGE_ANGLE và một SensorEvent mới có thể theo dõi góc bản lề và cung cấp kết quả đo lường theo độ giữa hai phần không thể tách rời của thiết bị. Bạn có thể sử dụng các phép đo thô này để tạo ảnh động chi tiết khi người dùng thao tác với thiết bị.

Xem phần Thiết bị có thể gập lại.

Cuộc trò chuyện

Cải tiến cuộc trò chuyện

Android 11 cải tiến một số điểm về cách xử lý cuộc trò chuyện. Cuộc trò chuyện là hoạt động giao tiếp hai chiều theo thời gian thực giữa hai hoặc nhiều người. Những cuộc trò chuyện này được làm nổi bật đặc biệt và người dùng có một số lựa chọn mới để tương tác với chúng.

Để biết thêm thông tin về cuộc trò chuyện và cách ứng dụng của bạn có thể hỗ trợ cuộc trò chuyện, hãy xem phần Người dùng và cuộc trò chuyện.

Bong bóng trò chuyện

Bong bóng trò chuyện (Bubbles) hiện được cung cấp cho nhà phát triển để giúp hiển thị các cuộc trò chuyện trên hệ thống. Bong bóng trò chuyện là một tính năng thử nghiệm trong Android 10, được bật thông qua tuỳ chọn cho nhà phát triển. Trong Android 11, tính năng này không còn cần thiết nữa.

Nếu một ứng dụng nhắm đến Android 11 (API cấp 30) trở lên, thì thông báo của ứng dụng đó sẽ không xuất hiện dưới dạng bong bóng trò chuyện, trừ phi ứng dụng đó đáp ứng các yêu cầu mới về cuộc trò chuyện. Cụ thể, thông báo phải được liên kết với một lối tắt.

Trước Android 11, nếu muốn thông báo được tạo bong bóng trò chuyện, bạn cần chỉ định rõ ràng rằng thông báo được thiết lập để luôn chạy ở chế độ giao diện người dùng tài liệu. Kể từ Android 11, bạn không cần phải đặt chế độ cài đặt đó một cách rõ ràng nữa; nếu thông báo được tạo bong bóng trò chuyện, nền tảng sẽ tự động đặt thông báo luôn chạy ở chế độ giao diện người dùng tài liệu.

Có một số điểm cải tiến về hiệu suất của bong bóng trò chuyện và người dùng có thể linh hoạt hơn trong việc bật và tắt bong bóng trò chuyện từ mỗi ứng dụng. Đối với những nhà phát triển đã triển khai tính năng hỗ trợ thử nghiệm, có một số thay đổi đối với các API trong Android 11:

Chỉ báo trực quan về mạng 5G

Để biết thông tin về cách hiển thị chỉ báo 5G trên thiết bị của người dùng, hãy xem phần Thông báo cho người dùng khi họ đang sử dụng 5G.

Quyền riêng tư

Android 11 đưa ra một số lượng lớn các thay đổi và hạn chế để nâng cao quyền riêng tư của người dùng. Để tìm hiểu thêm, hãy xem trang Quyền riêng tư.

Bảo mật

Tin cập nhật về tính năng xác thực bằng sinh trắc học

Để giúp bạn kiểm soát mức độ bảo mật cho dữ liệu của ứng dụng, Android 11 cung cấp một số điểm cải tiến cho tính năng xác thực sinh trắc học. Những thay đổi này cũng xuất hiện trong thư viện Jetpack Biometric.

Loại xác thực

Android 11 giới thiệu giao diện BiometricManager.Authenticators mà bạn có thể dùng để khai báo các loại xác thực mà ứng dụng của bạn hỗ trợ.

Xác định loại xác thực đã được sử dụng

Sau khi người dùng xác thực, bạn có thể kiểm tra xem người dùng được xác thực bằng thông tin đăng nhập thiết bị hay thông tin xác thực sinh trắc học bằng cách gọi getAuthenticationType().

Hỗ trợ bổ sung cho khoá xác thực mỗi lần sử dụng

Android 11 hỗ trợ thêm tính năng xác thực bằng khoá xác thực cho mỗi lần sử dụng.

Các phương thức ngừng hoạt động

Android 11 sẽ ngừng sử dụng các phương thức sau:

  • Phương thức setDeviceCredentialAllowed().
  • Phương thức setUserAuthenticationValidityDurationSeconds().
  • Phiên bản nạp chồng của canAuthenticate() không nhận đối số nào.

Chia sẻ an toàn các tập dữ liệu lớn

Trong một số trường hợp, chẳng hạn như các trường hợp liên quan đến việc học máy hoặc phát nội dung nghe nhìn, ứng dụng của bạn có thể muốn sử dụng cùng một tập dữ liệu lớn với một ứng dụng khác. Trong các phiên bản Android trước, ứng dụng của bạn và một ứng dụng khác cần tải một bản sao riêng biệt của cùng một tập dữ liệu xuống.

Để giúp giảm tình trạng dư thừa dữ liệu, cả trên mạng lẫn ổ đĩa, Android 11 cho phép lưu các tập dữ liệu lớn này vào bộ nhớ đệm trên thiết bị bằng cách sử dụng blob dữ liệu dùng chung. Để tìm hiểu thêm về cách chia sẻ tập dữ liệu, hãy xem hướng dẫn chuyên sâu về cách chia sẻ tập dữ liệu lớn.

Thực hiện mã hoá dựa trên tệp sau khi khởi động lại OTA mà không cần thông tin đăng nhập của người dùng

Sau khi thiết bị hoàn tất bản cập nhật OTA và khởi động lại, các khoá Thông tin đăng nhập được mã hoá (CE) được đặt trong bộ nhớ được bảo vệ bằng thông tin đăng nhập sẽ có sẵn ngay lập tức cho các thao tác Mã hoá dựa trên tệp (FBE). Điều này có nghĩa là sau khi cập nhật qua mạng không dây, ứng dụng của bạn có thể tiếp tục các hoạt động yêu cầu khoá CE trước khi người dùng nhập mã PIN, hình mở khoá hoặc mật khẩu.

Hiệu suất và chất lượng

Gỡ lỗi qua Wi-Fi

Android 11 hỗ trợ tính năng triển khai và gỡ lỗi ứng dụng không dây qua máy trạm thông qua Cầu gỡ lỗi Android (adb). Ví dụ: bạn có thể triển khai ứng dụng có thể gỡ lỗi cho nhiều thiết bị từ xa mà không cần kết nối vật lý với thiết bị qua USB hay gặp phải các vấn đề phổ biến khi kết nối USB (chẳng hạn như lỗi cài đặt trình điều khiển). Để biết thêm thông tin, hãy xem phần nội dung Chạy ứng dụng trên thiết bị phần cứng.

Cài đặt APK tăng dần qua ADB

Quá trình cài đặt các tệp APK có kích thước lớn (trên 2 GB) trên một thiết bị có thể mất nhiều thời gian, ngay cả khi bạn chỉ thực hiện một thay đổi nhỏ đối với ứng dụng. Quá trình cài đặt APK gia tăng ADB (Cầu gỡ lỗi Android) sẽ đẩy nhanh quá trình này bằng cách cài đặt đủ tệp APK để chạy ứng dụng trong khi truyền trực tuyến dữ liệu còn lại ở chế độ nền. adb install sẽ tự động sử dụng tính năng này nếu thiết bị hỗ trợ tính năng này và bạn đã cài đặt Bộ công cụ nền tảng SDK mới nhất. Nếu không được hỗ trợ, hệ thống sẽ tự động sử dụng phương thức cài đặt mặc định.

Sử dụng lệnh adb sau để sử dụng tính năng này. Nếu thiết bị không hỗ trợ cài đặt gia tăng, lệnh này sẽ không thành công và xuất nội dung giải thích chi tiết.

adb install --incremental

Trước khi chạy quá trình cài đặt APK gia tăng ADB, bạn phải ký APK và tạo tệp APK Signature Scheme v4. Bạn phải đặt tệp chữ ký v4 bên cạnh tệp APK để tính năng này hoạt động.

Phát hiện lỗi bằng trình phân bổ bộ nhớ gốc

GWP-ASan là tính năng trình phân bổ bộ nhớ gốc giúp tìm lỗi use-after-free và heap-buffer-overflow. Bạn có thể bật tính năng này trên toàn cục hoặc cho các quy trình con cụ thể của ứng dụng. Để tìm hiểu thêm, hãy xem Hướng dẫn về GWP-Asan.

Neural Networks API 1.3

Android 11 mở rộng và cải thiện Neural Networks API (NNAPI).

Toán tử mới

NNAPI 1.3 giới thiệu một loại toán hạng mới, TENSOR_QUANT8_ASYMM_SIGNED, để hỗ trợ lược đồ lượng tử hoá mới của TensorFlow Lite.

Ngoài ra, NNAPI 1.3 còn giới thiệu các toán tử mới sau:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

Các chế độ kiểm soát mới cho công nghệ học máy

NNAPI 1.3 giới thiệu các chế độ điều khiển mới giúp công nghệ học máy hoạt động trơn tru:

NDK Thermal API

Khi trở nên quá nóng, thiết bị có thể điều tiết CPU và/hoặc GPU, gây ảnh hưởng không mong muốn đến ứng dụng. Các ứng dụng hoặc trò chơi tích hợp đồ hoạ phức tạp, tác vụ tính toán nặng hoặc hoạt động mạng được duy trì liên tục có nhiều khả năng gặp phải vấn đề hơn.

Sử dụng API Nhiệt NDK trong Android 11 để theo dõi sự thay đổi nhiệt độ trên thiết bị, sau đó hành động để duy trì mức sử dụng điện năng thấp hơn cũng như nhiệt độ thiết bị mát hơn. API này tương tự như API nhiệt Java; bạn có thể sử dụng API này để nhận thông báo về mọi thay đổi về trạng thái nhiệt hoặc để thăm dò trực tiếp trạng thái hiện tại.

Văn bản và phương thức nhập

Cải thiện quá trình chuyển đổi IME

Android 11 giới thiệu các API mới để cải thiện hiệu ứng chuyển đổi cho trình chỉnh sửa phương thức nhập (IME), chẳng hạn như bàn phím ảo. Các API này giúp bạn dễ dàng điều chỉnh nội dung ứng dụng đồng bộ với giao diện và sự biến mất của IME cũng như với các phần tử khác như thanh trạng thái và thanh điều hướng.

Để hiển thị IME trong khi bất kỳ EditText nào có tiêu điểm, hãy gọi view.getInsetsController().show(Type.ime()). (Bạn có thể gọi phương thức này trên bất kỳ thành phần hiển thị nào trong cùng hệ phân cấp với EditText được lấy tiêu điểm, bạn không nhất thiết phải gọi phương thức này trên EditText.) Để ẩn IME, hãy gọi view.getInsetsController().hide(Type.ime()). Bạn có thể kiểm tra xem IME có hiển thị hay không bằng cách gọi view.getRootWindowInsets().isVisible(Type.ime()).

Để đồng bộ hoá các thành phần hiển thị của ứng dụng với sự xuất hiện và biến mất của IME, hãy đặt trình nghe trên một thành phần hiển thị bằng cách cung cấp WindowInsetsAnimation.Callback cho View.setWindowInsetsAnimationCallback(). (Bạn có thể đặt trình nghe này trên bất kỳ khung hiển thị nào, không nhất thiết phải là EditText.) IME gọi phương thức onPrepare() của trình nghe, sau đó gọi onStart() khi bắt đầu chuyển đổi. Sau đó, phương thức này sẽ gọi onProgress() tại mỗi tiến trình trong quá trình chuyển đổi. Khi quá trình chuyển đổi hoàn tất, IME sẽ gọi onEnd(). Tại bất kỳ thời điểm nào trong quá trình chuyển đổi, bạn có thể tìm hiểu tiến trình chuyển đổi đã đạt được bằng cách gọi WindowInsetsAnimation.getFraction().

Để biết ví dụ về cách sử dụng các API này, hãy xem mẫu mã WindowInsetsAnimation mới.

Kiểm soát ảnh động IME

Bạn cũng có thể kiểm soát ảnh động IME hoặc ảnh động của một thanh hệ thống khác như thanh điều hướng. Để thực hiện việc này, trước tiên, hãy gọi setOnApplyWindowInsetsListener() để đặt trình nghe mới cho các thay đổi về phần lồng ghép cửa sổ:

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

Để di chuyển IME hoặc thanh hệ thống khác, hãy gọi phương thức controlWindowInsetsAnimation() của bộ điều khiển:

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

Nội dung cập nhật cho thư viện ICU

Android 11 cập nhật gói android.icu để sử dụng phiên bản 66 của thư viện ICU, so với phiên bản 63 trong Android 10. Phiên bản thư viện mới bao gồm dữ liệu ngôn ngữ CLDR đã cập nhật và một số điểm cải tiến để hỗ trợ quốc tế hoá trong Android.

Những thay đổi đáng chú ý trong các phiên bản thư viện mới bao gồm:

  • Nhiều API định dạng hiện hỗ trợ một loại đối tượng trả về mới mở rộng FormattedValue.
  • API LocaleMatcher được nâng cao bằng một lớp trình tạo, hỗ trợ loại java.util.Locale và một lớp kết quả có dữ liệu bổ sung về một kết quả trùng khớp.
  • Unicode 13 hiện đã được hỗ trợ.

Nội dung nghe nhìn

Phân bổ vùng đệm MediaCodec

Android 11 bao gồm một API MediaCodec mới giúp ứng dụng có thêm quyền kiểm soát khi phân bổ vùng đệm đầu vào và đầu ra. Việc này cho phép ứng dụng quản lý bộ nhớ hiệu quả hơn.

Các lớp mới:
Các phương thức mới:

Ngoài ra, hành vi của 2 phương thức trong MediaCodec.Callback() đã thay đổi:

onInputBufferAvailable()
Thay vì gọi MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer() bằng chỉ mục, nếu được định cấu hình để sử dụng API mô hình khối, ứng dụng nên sử dụng MediaCodec.getQueueRequest bằng chỉ mục, đính kèm LinearBlock/HardwareBuffer vào khe.
onOutputBufferAvailable()
Thay vì gọi MediaCodec.getOutputBuffer() bằng chỉ mục, ứng dụng có thể sử dụng MediaCodec.getOutputFrame() bằng chỉ mục để lấy đối tượng OutputFrame có thêm thông tin và vùng đệm LinearBlock/HardwareBuffer.

Giải mã có độ trễ thấp trong MediaCodec

Android 11 cải thiện MediaCodec để hỗ trợ giải mã có độ trễ thấp cho các trò chơi và các ứng dụng theo thời gian thực khác. Bạn có thể kiểm tra xem bộ mã hoá và giải mã có hỗ trợ giải mã độ trễ thấp hay không bằng cách truyền FEATURE_LowLatency đến MediaCodecInfo.CodecCapabilities.isFeatureSupported().

Để bật hoặc tắt tính năng giải mã có độ trễ thấp, hãy làm theo một trong những cách sau:

Hàm AAudio mới AAudioStream_release()

Hàm AAudioStream_close() sẽ phát hành và đóng luồng âm thanh cùng một lúc. Điều này có thể nguy hiểm. Nếu một quy trình khác cố gắng truy cập vào luồng sau khi bị đóng, thì quy trình đó sẽ gặp sự cố.

Hàm mới AAudioStream_release() sẽ phát hành luồng nhưng không đóng luồng đó. Thao tác này sẽ giải phóng tài nguyên và để luồng ở trạng thái đã biết. Đối tượng này sẽ tồn tại cho đến khi bạn gọi AAudioStream_close().

MediaParser API

MediaParser là một API cấp thấp mới để trích xuất nội dung nghe nhìn. Bộ công cụ này linh hoạt hơn MediaExtractor và cung cấp thêm quyền kiểm soát đối với chức năng trích xuất nội dung nghe nhìn.

Ghi âm từ thiết bị USB

Khi một ứng dụng không có quyền RECORD_AUDIO dùng UsbManager để yêu cầu quyền truy cập trực tiếp vào thiết bị âm thanh USB có chức năng ghi âm (chẳng hạn như tai nghe USB), một thông báo cảnh báo mới sẽ xuất hiện yêu cầu người dùng xác nhận quyền sử dụng thiết bị. Hệ thống sẽ bỏ qua mọi tuỳ chọn "luôn sử dụng", do đó, người dùng phải xác nhận cảnh báo và cấp quyền mỗi khi ứng dụng yêu cầu quyền truy cập.

Để tránh hành vi này, ứng dụng nên yêu cầu quyền RECORD_AUDIO.

Quyền truy cập đồng thời vào micrô

Android 11 thêm các phương thức mới vào API AudioRecord, MediaRecorderAAudioStream. Các phương thức này bật và tắt khả năng chụp đồng thời bất kể trường hợp sử dụng đã chọn. Xem phần Chia sẻ đầu vào âm thanh.

Nút chuyển đầu ra

Android 11 triển khai hành vi mới cho các ứng dụng sử dụng API truyền và mediarouter.

Ngoài việc truy cập vào các tuỳ chọn truyền từ trong một ứng dụng, các tuỳ chọn chuyển đổi cũng xuất hiện trong trình phát nội dung nghe nhìn của hệ thống. Điều này giúp người dùng có một hành trình liền mạch khi di chuyển giữa các thiết bị khi họ thay đổi bối cảnh xem và nghe, chẳng hạn như xem video trong nhà bếp so với trên điện thoại, hoặc nghe âm thanh trong nhà hoặc trên ô tô. Xem nút chuyển đầu ra.

Khả năng kết nối

Các tính năng nâng cao của Wi-Fi Passpoint

Để biết thông tin về các chức năng của Passpoint được thêm vào Android 11, hãy xem phần Passpoint.

Mở rộng API Đề xuất Wi-Fi

Android 11 mở rộng API Đề xuất Wi-Fi để tăng khả năng quản lý mạng của ứng dụng, bao gồm:

  • Các ứng dụng quản lý kết nối có thể quản lý mạng của riêng mình bằng cách cho phép các yêu cầu ngắt kết nối.
  • Mạng Passpoint được tích hợp vào API Đề xuất và có thể được đề xuất cho người dùng.
  • API Analytics cho phép bạn nhận thông tin về chất lượng của mạng.

Thông tin cập nhật về CallScreeningService

Kể từ Android 11, CallScreeningService có thể yêu cầu thông tin về trạng thái xác minh STIR/SHAKEN (xác minh) cho các lệnh gọi đến. Thông tin này được cung cấp trong chi tiết cuộc gọi cho các cuộc gọi đến.

Nếu CallScreeningService có quyền READ_CONTACTS, ứng dụng sẽ được thông báo khi có cuộc gọi đến hoặc cuộc gọi đi đến một số trong danh bạ của người dùng.

Để biết thêm thông tin, hãy xem phần Ngăn chặn giả mạo tên nhận dạng người gọi.

Nội dung cập nhật về Open Mobile API

Để biết thông tin về tính năng hỗ trợ OMAPI trên Android 11 trở lên, hãy xem phần Hỗ trợ trình đọc API di động mở.

VPN hiệu suất cao

Các ứng dụng nhắm đến API cấp 30 trở lên hoặc đang chạy trên các thiết bị chạy API cấp 29 trở lên có thể áp dụng IKEv2/IPsec cho cả VPN do người dùng định cấu hình và VPN dựa trên ứng dụng.

Các VPN chạy gốc trên hệ điều hành, đơn giản hoá mã cần thiết để thiết lập kết nối VPN IKEv2/IPsec trong ứng dụng.

Kiểm soát quyền truy cập mạng theo từng quy trình

Để biết thông tin về cách bật quyền truy cập mạng trên cơ sở mỗi quy trình, hãy xem phần Quản lý mức sử dụng mạng.

Cho phép nhiều cấu hình Passpoint đã cài đặt có cùng FQDN

Kể từ Android 11, bạn có thể sử dụng PasspointConfiguration.getUniqueId() để lấy giá trị nhận dạng duy nhất cho đối tượng PasspointConfiguration. Điều này cho phép người dùng ứng dụng cài đặt nhiều hồ sơ có cùng tên miền đủ điều kiện (FQDN).

Chức năng này hữu ích khi nhà mạng triển khai nhiều tổ hợp Mã quốc gia cho nhà cung cấp dịch vụ di động (MCC) và Mã mạng di động (MNC) trên mạng của họ, nhưng chỉ có một FQDN. Trên Android 11 trở lên, bạn có thể cài đặt nhiều hồ sơ có cùng FQDN khớp với mạng làm nhà cung cấp Home khi người dùng cài đặt SIM có MCC hoặc MNC.

Hỗ trợ ăng-ten GNSS

Android 11 giới thiệu lớp GnssAntennaInfo, cho phép ứng dụng của bạn tận dụng nhiều hơn tính năng định vị chính xác đến từng cm mà Hệ thống định vị vệ tinh toàn cầu (GNSS) có thể cung cấp.

Tìm hiểu thêm trong hướng dẫn về thông tin hiệu chỉnh ăng-ten.

Đồ hoạ

Trình giải mã hình ảnh NDK

API ImageDecoder của NDK cung cấp API tiêu chuẩn cho các ứng dụng Android C/C++ để giải mã hình ảnh trực tiếp. Nhà phát triển ứng dụng không cần sử dụng API khung (thông qua JNI) hoặc gói thư viện giải mã hình ảnh của bên thứ ba nữa. Để biết thêm thông tin, hãy xem Hướng dẫn cho nhà phát triển về bộ giải mã hình ảnh.

API tốc độ khung hình

Android 11 cung cấp một API cho phép ứng dụng thông báo cho hệ thống về tốc độ khung hình dự kiến để giảm hiện tượng giật trên các thiết bị hỗ trợ nhiều tốc độ làm mới. Để biết thông tin về cách sử dụng API này, hãy xem Hướng dẫn về tốc độ khung hình.

Yêu cầu và kiểm tra tính năng hỗ trợ độ trễ thấp

Một số màn hình có thể thực hiện xử lý hậu kỳ đồ hoạ, chẳng hạn như một số màn hình ngoài và TV. Quá trình xử lý hậu kỳ này giúp cải thiện đồ hoạ nhưng có thể làm tăng độ trễ. Các màn hình mới hơn hỗ trợ HDMI 2.1 có chế độ tự động giảm độ trễ (ALLM, còn gọi là chế độ trò chơi), giúp giảm thiểu độ trễ bằng cách tắt quy trình xử lý hậu kỳ này. Để biết thêm thông tin chi tiết về ALLM, hãy tham khảo quy cách HDMI 2.1.

Một cửa sổ có thể yêu cầu sử dụng chế độ độ trễ thấp tự động (nếu có). ALLM đặc biệt hữu ích cho các ứng dụng như trò chơi và hội nghị truyền hình, trong đó độ trễ thấp quan trọng hơn việc có đồ hoạ tốt nhất có thể.

Để bật hoặc tắt tính năng xử lý hậu kỳ tối thiểu, hãy gọi Window.setPreferMinimalPostProcessing() hoặc đặt thuộc tính preferMinimalPostProcessing của cửa sổ thành true. Không phải màn hình nào cũng hỗ trợ tính năng xử lý hậu kỳ tối thiểu; để tìm hiểu xem một màn hình cụ thể có hỗ trợ tính năng này hay không, hãy gọi phương thức mới Display.isMinimalPostProcessingSupported().

Chèn lớp gỡ lỗi đồ hoạ hiệu quả

Giờ đây, các ứng dụng có thể tải các lớp đồ hoạ bên ngoài (GLES, Vulkan) vào mã xử lý ứng dụng gốc để hiển thị chức năng tương tự như một ứng dụng có thể gỡ lỗi, nhưng không gây ra hao tổn hiệu suất. Tính năng này đặc biệt quan trọng khi phân tích tài nguyên ứng dụng bằng các công cụ như GAPID. Để phân tích tài nguyên cho ứng dụng, hãy thêm phần tử siêu dữ liệu sau đây vào tệp kê khai của ứng dụng thay vì đặt ứng dụng ở chế độ có thể gỡ lỗi:

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

Hình ảnh và camera

Tắt tiếng thông báo và chế độ rung trong khi quay

Kể từ Android 11, khi đang sử dụng máy ảnh, ứng dụng của bạn chỉ có thể tắt chế độ rung, cả âm thanh và chế độ rung hoặc không tắt chế độ nào bằng cách sử dụng setCameraAudioRestriction().

Hỗ trợ máy ảnh mở rộng trong Trình mô phỏng Android

Để biết thông tin về tính năng hỗ trợ mở rộng cho máy ảnh trong trình mô phỏng bắt đầu từ Android 11, hãy xem phần Hỗ trợ máy ảnh.

Hỗ trợ sử dụng đồng thời nhiều máy ảnh

Android 11 thêm các API để truy vấn tính năng hỗ trợ sử dụng nhiều máy ảnh cùng một lúc, bao gồm cả máy ảnh mặt trước và máy ảnh mặt sau.

Để kiểm tra khả năng hỗ trợ trên thiết bị mà ứng dụng của bạn đang chạy, hãy sử dụng các phương thức sau:

  • getConcurrentCameraIds() trả về một Set gồm các tổ hợp mã máy ảnh có thể truyền trực tuyến đồng thời với các tổ hợp luồng được đảm bảo khi được định cấu hình theo cùng một quy trình ứng dụng.
  • isConcurrentSessionConfigurationSupported() truy vấn xem các thiết bị máy ảnh có thể đồng thời hỗ trợ các cấu hình phiên tương ứng hay không.

Hỗ trợ tốt hơn cho hình ảnh HEIF có nhiều khung hình

Kể từ Android 11, nếu bạn gọi ImageDecoder.decodeDrawable() và truyền một hình ảnh HEIF chứa một trình tự khung hình (chẳng hạn như ảnh động hoặc ảnh chụp liên tiếp), thì phương thức này sẽ trả về một AnimatedImageDrawable chứa toàn bộ trình tự hình ảnh. Trên các phiên bản Android trước, phương thức này chỉ trả về một BitmapDrawable của một khung hình duy nhất.

Nếu đồ hoạ HEIF chứa nhiều khung hình không theo trình tự, bạn có thể truy xuất từng khung hình bằng cách gọi MediaMetadataRetriever.getImageAtIndex().

Hỗ trợ tiếp cận

Thông tin cập nhật dành cho nhà phát triển dịch vụ hỗ trợ tiếp cận

Nếu tạo một dịch vụ hỗ trợ tiếp cận tuỳ chỉnh, bạn có thể sử dụng các tính năng sau trong Android 11:

  • Phần giải thích dành cho người dùng về một dịch vụ hỗ trợ tiếp cận hiện cho phép HTML và hình ảnh ngoài văn bản thuần tuý. Tính linh hoạt này giúp bạn dễ dàng giải thích cho người dùng cuối về chức năng của dịch vụ và cách dịch vụ có thể giúp họ.
  • Để xử lý nội dung mô tả trạng thái của một phần tử trên giao diện người dùng có ý nghĩa ngữ nghĩa hơn contentDescription, hãy gọi phương thức getStateDescription().
  • Để yêu cầu các sự kiện chạm bỏ qua trình khám phá thao tác chạm của hệ thống, hãy gọi setTouchExplorationPassthroughRegion(). Tương tự, để yêu cầu các cử chỉ bỏ qua trình phát hiện cử chỉ của hệ thống, hãy gọi setGestureDetectionPassthroughRegion().
  • Bạn có thể yêu cầu các thao tác IME, chẳng hạn như "enter" (enter) và "next" (tiếp theo), cũng như ảnh chụp màn hình của các cửa sổ không bật cờ FLAG_SECURE.

Các tính năng khác

Lý do thoát khỏi quy trình ứng dụng

Android 11 giới thiệu phương thức ActivityManager.getHistoricalProcessExitReasons(), phương thức này báo cáo lý do chấm dứt quy trình gần đây. Ứng dụng có thể sử dụng phương thức này để thu thập thông tin chẩn đoán sự cố, chẳng hạn như liệu việc chấm dứt quy trình có phải là do lỗi ANR, sự cố về bộ nhớ hay lý do khác hay không. Ngoài ra, bạn có thể sử dụng phương thức setProcessStateSummary() mới để lưu trữ thông tin trạng thái tuỳ chỉnh để phân tích sau.

Phương thức getHistoricalProcessExitReasons() trả về các thực thể của lớp ApplicationExitInfo. Lớp này chứa thông tin liên quan đến việc một quy trình ứng dụng bị chấm dứt. Bằng cách gọi getReason() trên một thực thể của lớp này, bạn có thể xác định lý do quá trình của ứng dụng bị chấm dứt. Ví dụ: giá trị trả về của REASON_CRASH cho biết một ngoại lệ chưa được xử lý đã xảy ra trong ứng dụng của bạn. Nếu cần đảm bảo tính duy nhất cho các sự kiện thoát, ứng dụng của bạn có thể duy trì một giá trị nhận dạng dành riêng cho ứng dụng, chẳng hạn như giá trị băm dựa trên dấu thời gian của phương thức getTimestamp().

Tài nguyên khác

Để biết thêm thông tin, hãy đọc bài viết về các công cụ mới của Android 11 giúp ứng dụng bảo mật và ổn định hơn trên Medium.

Trình tải tài nguyên

Android 11 giới thiệu một API mới cho phép các ứng dụng mở rộng linh hoạt cách tìm kiếm và tải tài nguyên. Các lớp API mới ResourcesLoaderResourcesProvider chủ yếu chịu trách nhiệm cung cấp chức năng mới. Cùng nhau, các thành phần này cung cấp khả năng cung cấp tài nguyên và thành phần bổ sung hoặc sửa đổi giá trị của tài nguyên và thành phần hiện có.

Đối tượng ResourcesLoader là các vùng chứa cung cấp đối tượng ResourcesProvider cho thực thể Resources của ứng dụng. Đổi lại, các đối tượng ResourcesProvider cung cấp các phương thức để tải dữ liệu tài nguyên từ các tệp APK và bảng tài nguyên.

Một trường hợp sử dụng chính của API này là tải thành phần tuỳ chỉnh. Bạn có thể sử dụng loadFromDirectory() để tạo ResourcesProvider giúp chuyển hướng độ phân giải của tài nguyên và thành phần dựa trên tệp, khiến tệp này tìm kiếm một thư mục cụ thể thay vì APK ứng dụng. Bạn có thể truy cập vào những tài sản này thông qua nhóm phương thức open() từ lớp API AssetManager, giống như các tài sản đi kèm trong tệp APK.

Lược đồ chữ ký APK phiên bản 4

Android 11 bổ sung tính năng hỗ trợ cho Lược đồ chữ ký APK v4. Giao thức này tạo ra một loại chữ ký mới trong một tệp riêng biệt (apk-name.apk.idsig) nhưng tương tự như phiên bản 2 và v3. Không có thay đổi nào đối với APK. Lược đồ này hỗ trợ cài đặt APK gia tăng ADB, giúp tăng tốc quá trình cài đặt APK.

Bộ lọc ý định động

Để nhận ý định, ứng dụng phải khai báo tại thời điểm biên dịch những loại dữ liệu mà ứng dụng có thể nhận được bằng cách xác định bộ lọc ý định trong tệp kê khai ứng dụng. Trên Android 10 trở xuống, ứng dụng không có cách nào để thay đổi bộ lọc ý định trong thời gian chạy. Đây là một vấn đề đối với các ứng dụng ảo hoá (chẳng hạn như máy ảo và máy tính từ xa) vì các ứng dụng đó không có cách nào để biết chính xác người dùng sẽ cài đặt phần mềm nào bên trong.

Android 11 giới thiệu các nhóm MIME, một phần tử tệp kê khai mới cho phép ứng dụng khai báo tập hợp các loại MIME động trong bộ lọc ý định và sửa đổi tập hợp đó theo phương thức lập trình trong thời gian chạy. Để sử dụng một nhóm MIME, hãy đưa một phần tử dữ liệu vào tệp kê khai ứng dụng của bạn bằng thuộc tính android:mimeGroup mới:

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

Giá trị của thuộc tính android:mimeGroup là một mã nhận dạng chuỗi tuỳ ý xác định nhóm MIME trong thời gian chạy. Bạn có thể truy cập và cập nhật nội dung của một nhóm MIME bằng cách truyền mã nhận dạng của nhóm đó đến các phương thức mới sau trong lớp API PackageManager:

Khi bạn thêm một loại MIME vào một nhóm MIME theo phương thức lập trình, loại MIME đó sẽ hoạt động giống hệt như một loại MIME tĩnh được khai báo rõ ràng trong tệp kê khai.

Các tính năng nâng cao của tính năng Tự động điền

Android 11 giới thiệu các điểm cải tiến cho dịch vụ tự động điền.

Giá trị nhận dạng gợi ý trong AssistStructure.ViewNode

Dịch vụ tự động điền thường hữu ích khi tính toán hàm băm chữ ký cho một thành phần hiển thị dựa trên các thuộc tính của thành phần hiển thị đó. View hint (Gợi ý khung hiển thị) là một thuộc tính đặc biệt hiệu quả nên đưa vào khi tính toán hàm băm chữ ký, nhưng chuỗi gợi ý có thể thay đổi theo ngôn ngữ của điện thoại. Để giải quyết vấn đề này, Android 11 mở rộng AssistStructure.ViewNode bằng phương thức getHintIdEntry() mới. Phương thức này trả về giá trị nhận dạng tài nguyên cho văn bản gợi ý của khung hiển thị. Phương thức này cung cấp một giá trị độc lập với ngôn ngữ mà bạn có thể dùng để tính toán hàm băm chữ ký.

Tập dữ liệu hiển thị sự kiện

Để giúp các dịch vụ tự động điền cải thiện nội dung đề xuất, Android 11 đưa ra cách xác định trường hợp dịch vụ tự động điền đưa ra tập dữ liệu nhưng người dùng không chọn bất kỳ tập dữ liệu nào trong số đó. Trong Android 11, FillEventHistory báo cáo một loại sự kiện TYPE_DATASETS_SHOWN mới. FillEventHistory ghi lại một sự kiện thuộc loại này bất cứ khi nào dịch vụ tự động điền trình bày một hoặc nhiều tập dữ liệu cho người dùng. Dịch vụ tự động điền có thể sử dụng các sự kiện này cùng với sự kiện TYPE_DATASET_SELECTED hiện có để xác định xem người dùng có chọn bất kỳ tuỳ chọn tự động điền nào được cung cấp hay không.

Tích hợp IME

Giờ đây, bàn phím và các IME khác có thể hiển thị các đề xuất tự động điền cùng dòng, trong một dải đề xuất hoặc giao diện tương tự, thay vì trong trình đơn thả xuống. Để bảo vệ thông tin nhạy cảm như mật khẩu và số thẻ tín dụng, các đề xuất sẽ hiển thị cho người dùng nhưng IME không biết cho đến khi người dùng chọn một mục. Để biết thông tin về cách IME và trình quản lý mật khẩu có thể hỗ trợ tính năng này, hãy xem phần Tích hợp tính năng tự động điền với bàn phím.

Chia sẻ dữ liệu bằng dịch vụ ghi lại nội dung

Kể từ Android 11, ứng dụng của bạn có thể chia sẻ dữ liệu với dịch vụ quay video của thiết bị. Khả năng này giúp thiết bị dễ dàng phân phối thông tin thông minh theo bối cảnh, chẳng hạn như hiển thị tên của một bài hát đang phát trong môi trường của người dùng.

Để cung cấp dữ liệu từ ứng dụng cho dịch vụ quay video, hãy gọi phương thức shareData() trên một thực thể của ContentCaptureManager. Nếu hệ thống chấp nhận yêu cầu chia sẻ dữ liệu, ứng dụng của bạn sẽ nhận được một chỉ số mô tả tệp chỉ có thể ghi để chia sẻ với dịch vụ chụp nội dung.