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 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.
Để 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 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 về những 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
![API RTT mới hỗ trợ vị trí trong nhà trong ứng dụng của bạn.](https://developer.android.com/static/images/about/versions/pie/rtt-nav.png?authuser=6&hl=vi)
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 trọn vòng của Wi-Fi (RTT)) để cho phép bạn tận dụng tính năng định vị trong nhà trong ứng dụng của mình.
Trên những 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 API RTT để đo lường khoảng cách đến các điểm truy cập (AP) Wi-Fi có thể dùng tính năng RTT ở gần. Thiết bị phải bật dịch vụ vị trí và bật tính năng 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 tin nhắn theo thời gian thực (RTT).
Để đảm bảo 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 lường khoảng cách đến 3 điểm truy cập trở lên, bạn có thể sử dụng thuật toán nhân hệ số để ướ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 1 đến 2 mét.
Với độ chính xác này, bạn có thể tạo ra các trải nghiệm mới, như chỉ đường trong toà nhà và các dịch vụ chi tiết dựa trên vị trí, chẳng hạn như điều khiển bằng giọng nói riêng biệt (ví dụ: "Bật đèn này") và thông tin dựa trên vị trí (chẳng hạn như "Sản phẩm này có ưu đãi đặc biệt không?").
Xem API Wi-Fi RTT đang được sử 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: phạm vi có 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 hiển thị nhiều kích thước vết cắt](https://developer.android.com/static/images/about/versions/pie/emulator-devoptions-cutout_2x.png?authuser=6&hl=vi)
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 máy ảnh và loa. Lớp DisplayCutout
giúp bạn tìm ra vị trí và hình dạng của các khu vực không hoạt động mà không nên hiển thị nội dung. Để xác định sự tồn tại và vị trí của các vùng cắt này, hãy sử dụng phương thức getDisplayCutout()
.
Thuộc tính bố cục cửa sổ mới, layoutInDisplayCutoutMode
, cho phép ứng dụng bố trí nội dung xung quanh các vết cắt của thiết bị. Bạn có thể đặt thuộc tính này thành một trong các giá trị sau:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
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 như sau:
- Bật tuỳ chọn cho nhà phát triển.
- Trong màn hình Developer options (Tuỳ chọn cho nhà phát triển), hãy di chuyển xuống phần Drawing (Bản vẽ) rồi chọn Simulate a display with a Cutout (Mô phỏng màn hình có phần cắt).
- Chọn kích thước của vết cắt.
Thông báo
Android 9 giới thiệu một số tính năng nâng cao cho thông báo, tất cả đều dành cho các nhà phát triển nhắm đến API cấp 28 trở lên.
![Thông báo tin nhắn](https://developer.android.com/static/images/about/versions/pie/p-messaging.jpg?authuser=6&hl=vi)
MessagingStyle đính kèm ảnh.
![Thông báo tin nhắn](https://developer.android.com/static/images/about/versions/pie/p-replies.jpg?authuser=6&hl=vi)
MessagingStyle với tin nhắn trả lời và cuộc trò chuyện.
Để biết 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 Mọi người.
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 trực tiếp từ thông báo. Android 9 cải thiện tính năng này với các tính năng nâng cao sau:
Hỗ trợ đơn giản cho những người tham gia cuộc trò chuyện: Lớp
Person
dùng để xác định những người tham gia vào một 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ớpPerson
thay vìCharSequence
. LớpPerson
cũng hỗ trợ mẫu thiết kế Builder.Hỗ trợ hình ảnh: Android 9 hiện hiển thị hình ảnh trong Thông báo nhắn tin trên điện thoại. Bạn có thể 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ạoPerson
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 một thông báo tin nhắn. Bạn có thể sử dụng dữ liệu bổ sung này để điền sẵn 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.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ể sử dụng
setGroupConversation()
để chủ định xác định một cuộc trò chuyện là cuộc trò chuyện nhóm hay không phải cuộc trò chuyện nhóm.Đặt thao tác ngữ nghĩa cho một ý định: Phương thức
setSemanticAction()
cho phép bạn cung cấp ý 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.Trả lời thông minh: 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. Hãy sử dụng
RemoteInput.setChoices()
để cung cấp một loạt các câu trả lời chuẩn cho người dùng.
Cài đặt kênh, thông báo phát đi và chế độ Không làm phiền
Android 8.0 đã ra mắt Kênh thông báo, cho phép bạn tạo kênh mà người dùng có thể tuỳ chỉnh đối với từng loại thông báo mà bạn muốn hiển thị. Android 9 đơn giản hoá chế độ cài đặt kênh thông báo nhờ 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ể sử dụng phương thức
isBlocked()
để xác định thời điểm một nhóm bị chặn và do đó, sẽ 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 chế độ cài đặt nhóm kênh hiện tại bằng phương thức
getNotificationChannelGroup()
mới.Các kiểu ý định truyền tin mới: Hệ thống Android hiện sẽ gửi ý định truyền tin khi trạng thái chặn của 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 những ý định này và phản ứng tương ứng. Để biết thêm thông tin về các thao tác theo ý định và dữ liệu bổ sung này, hãy tham khảo danh sách hằng số đã cập nhật trong tài liệu tham khảo
NotificationManager
. Để biết thông tin về cách phản ứng với ý định truyền tin, hãy tham khảo phần Thông báo truyền tin.NotificationManager.Policy
có ba danh mục ưu tiên Không làm phiền mới:PRIORITY_CATEGORY_ALARMS
ưu tiên chuông báo.PRIORITY_CATEGORY_MEDIA
ưu tiên âm thanh từ các nguồn nội dung nghe nhìn, chẳng hạn như nội dung nghe nhìn và chỉ đường bằng giọng nói.PRIORITY_CATEGORY_SYSTEM
ưu tiên âm thanh hệ thống.
NotificationManager.Policy
cũng có 7 hằng số Do-Not-Disturb mới mà bạn có thể dùng để loại bỏ tình trạng gián đoạn hình ảnh:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
ngăn thông báo khởi chạy hoạt động toàn màn hình.SUPPRESSED_EFFECT_LIGHTS
chặn đèn thông báo.SUPPRESSED_EFFECT_PEEK
ngăn thông báo trượt nhanh vào chế độ xem ("hiển thị nhanh").SUPPRESSED_EFFECT_STATUS_BAR
ngăn thông báo xuất hiện trong thanh trạng thái trên các thiết bị hỗ trợ thanh trạng thái.SUPPRESSED_EFFECT_BADGE
chặn huy hiệu trên các thiết bị hỗ trợ huy hiệu. Để biết thêm thông tin, hãy tham khảo bài viết Sửa đổi huy hiệu thông báo.SUPPRESSED_EFFECT_AMBIENT
chặn thông báo trên các thiết bị hỗ trợ màn hình chờ theo môi trường xung quanh.SUPPRESSED_EFFECT_NOTIFICATION_LIST
ngăn thông báo xuất hiện trong chế độ xem danh sách trên các thiết bị hỗ trợ chế độ xem danh sách, chẳng hạn như ngăn thông báo hoặc màn hình khoá.
Hỗ trợ nhiều camera và cập nhật máy ảnh
Trên các thiết bị chạy Android 9, bạn có thể truy cập đồng thời vào các luồng dữ liệu từ 2 máy ảnh thực trở lên. Trên các thiết bị có máy ảnh mặt trước hoặc máy ảnh mặt sau kép, bạn có thể tạo ra các tính năng sáng tạo mà chỉ một máy ảnh duy nhất có thể làm được, chẳng hạn như tính năng thu phóng liền mạch, bokeh và chế độ nhìn nổi. API này cũng cho phép bạn gọi một luồng camera logic hoặc 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 về máy ảnh bao gồm Tham số phiên bổ sung 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 ứng dụng máy ảnh xử lý nhiều trường hợp sử dụng mà không cần dừng và bắt đầu truyền trực tuyến máy ảnh. Chúng tôi cũng thêm API để hỗ trợ flash dựa trên màn hình và truy cập vào dấu thời gian OIS để ổn định hình ảnh ở cấp ứng dụng cũng như các hiệu ứng đặc biệt.
Trong Android 9, API nhiều máy ảnh hỗ trợ máy ảnh đơn sắc cho các thiết bị có tính năng FULL
hoặc LIMITED
.
Đầu ra đơn sắc đạt được thông qua định dạng YUV_420_888
, trong đó Y là thang màu xám, U (Cb) là 128 và V (Cr) là 128.
Android 9 cũng cho phép hỗ trợ máy ảnh USB/UVC bên ngoài trên các thiết bị được hỗ trợ.
ImageDecoder cho đối tượng có thể vẽ và bitmap
Android 9 giới thiệu lớp ImageDecoder
, cung cấp 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 BitmapFactory
và BitmapFactory.Options
.
ImageDecoder
cho phép bạn tạo
Drawable
hoặc
Bitmap
từ vùng đệm byte, tệp hoặc URI. Để giải mã hình ảnh, trước tiên, hãy gọi createSource()
với 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 hình ảnh.
Nếu hình ảnh mã hoá là ảnh GIF hoặc WebP động, thì decodeDrawable()
sẽ trả về Drawable
. Đây là một thực thể của lớp AnimatedImageDrawable
.
Bạn có thể sử dụng nhiều phương pháp để đặt thuộc tính hình ảnh:
- Để điều chỉnh tỷ lệ hình ảnh đã giải mã thành kích thước chính xác, hãy chuyển các 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 trực tiếp kích thước mẫu đếnsetTargetSampleSize()
. - Để cắt một hình ảnh trong phạm vi của hình ảnh được điều chỉnh theo tỷ lệ, hãy gọi
setCrop()
. - Để tạo một bitmap có thể thay đổi, hãy truyền
true
vàosetMutableRequired()
.
ImageDecoder
cũng cho phép bạn thêm các hiệu ứng tuỳ chỉnh và phức tạp vào một hình ảnh, chẳng hạn như góc bo tròn hoặc mặt nạ hình tròn. Sử dụng setPostProcessor()
với một thực thể 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 các ả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. Cách triển khai này cho phép ứng dụng của bạn hiển thị hình ảnh động mà không cần quản lý nội dung 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 cách sử dụng một thực thể 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 nạ hình tròn hoặc các góc bo tròn.
Video HDR VP9, nén hình ảnh HEIF và API nội dung nghe nhìn
Android 9 cung cấp tính năng hỗ trợ tích hợp sẵn cho Cấu hình 2 của VP9 Dải động cao (HDR) Cấu hình 2. Nhờ đó, bạn có thể cung cấp các bộ phim có hỗ trợ HDR cho người dùng từ YouTube, Play Phim và các nguồn khác trên thiết bị có hỗ trợ HDR.
Android 9 cũng hỗ trợ thêm tính năng 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 độ nén, giảm không gian lưu trữ cũng như mức sử dụng dữ liệu mạng. Các mẫu hình ảnh tĩnh HEIF được hỗ trợ trong các lớp MediaMuxer
và MediaExtractor
. Với sự hỗ trợ 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 qua máy chủ phụ trợ. Sau khi bạn đảm bảo rằng ứng dụng của mình 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 jpeg sang heic bằng cách sử dụng ImageDecoder
hoặc BitmapFactory
(lấy bitmap từ tệp JPEG). Sau đó, bạn có thể sử dụng HeifWriter
để ghi hình ảnh tĩnh HEIF từ vùng đệm byte YUV hoặc các thực thể của Surface
hoặc Bitmap
.
Các chỉ số về nội dung nghe nhìn cũng có trong các lớp AudioTrack
, AudioRecord
, và MediaDrm
.
Android 9 giới thiệu các phương thức cho lớp MediaDRM
để lấy chỉ số, mức HDCP, mức độ bảo mật và số phiên, cũng như để tăng cường kiểm soát mức độ bảo mật và điểm dừng bảo mật. Xem báo cáo Điểm khác biệt về API để biết thông tin chi tiết.
Trong Android 9, API AAudio hỗ trợ thêm một số thuộc tính AAudioStream, bao gồm cả mức sử dụng, loại nội dung và giá trị đặt trước đầ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 VoIP hoặc ứng dụng máy quay video. Bạn cũng có thể đặt mã phiên để liên kết luồng AAudio với một bản phối phụ có thể bao gồm các hiệu ứng. Sử 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 băng tần và giới hạn) trong nhiều giai đoạn. Số lượng băng tần và giai đoạn hoạt động có thể được định cấu hình và hầu hết các tham số có thể được điều khiển theo 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 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 công việc 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 tín hiệu là bị nghẽn, JobScheduler
có thể trì hoãn các yêu cầu mạng lớn. Khi sử dụng mạng không đo lượng dữ liệu, 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 dòng tiêu đề.
Khi thêm công việc, hãy nhớ sử dụng setEstimatedNetworkBytes()
, setPrefetch()
và setRequiredNetwork()
khi thích hợp để giúpJobScheduler
xử lý công việc đúng cách. Khi công việc của bạn được 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ị và mạng này có thể không đáp ứng 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 ra mắt trong Android 8.1 (API cấp 27) để tăng tốc độ học máy trên thiết bị Android. Android 9 mở rộng và cải thiện API, bổ sung khả năng hỗ trợ cho 9 thao tác mới:
- Phép toán trên các phần tử tương ứng:
- Toán tử mảng:
Vấn đề đã biết: Khi truyền các tensor ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
đến toán tử ANEURALNETWORKS_PAD
có sẵn trên Android 9 trở lên, kết quả đầ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 xem có nên 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 giới thiệu nhiều điểm cải tiến mà dịch vụ tự động điền có thể triển khai để nâng cao trải nghiệm người dùng hơn nữa 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 tính năng nâng cao về bảo mật
Android 9 giới thiệu một số 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 có thể sử dụng API Xác nhận bảo vệ của Android. Khi sử dụng quy trình công việc này, ứng dụng sẽ hiển thị lời nhắc với người dùng, yêu cầu họ phê duyệt một tuyên bố ngắn. Câu lệnh 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, Kho khoá Android sẽ nhận và lưu trữ chữ ký mật mã được bảo vệ bằng mã xác thực thông điệp khoá băm (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ể sử 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ợ cho API Xác nhận bảo vệ của Android, hãy xem hướng dẫn 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
Trên Android 9, hệ thống cung cấp hộp thoại xác thực bằng sinh trắc học thay mặt cho ứng dụng của bạn. Chức năng này tạo ra giao diện và vị trí chuẩn hoá cho hộp thoại, giúp người dùng yên tâm hơn rằng họ đang xác thực với 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 vân tay cho người dùng, hãy chuyển sang sử dụng BiometricPrompt
. BiometricPrompt
dựa vào hệ thống để hiển thị hộp thoại xác thực. API này cũng thay đổi hành vi để điều chỉnh cho phù hợp với hình thức xác thực bằng 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ó thể có StrongBox Keymaster. Đây là cách triển khai HAL Keymaster nằm trong 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 Keymaster, hệ thống chứng thực tính toàn vẹn của một khoá với 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 Keymaster, hãy xem bài viết Mô-đun bảo mật phần cứng.
Nhập khoá bảo mật vào Kho khoá
Android 9 cung cấp khả năng bảo mật bổ sung cho quy trình giải mã khoá bằng cách bổ sung khả năng nhập khoá đã mã hoá một cách an toàn vào Kho khoá bằng định dạng khoá được mã hoá ASN.1. Sau đó, Keymaster sẽ giải mã các khoá trong Kho khoá để 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 với tính năng xoay vòng khoá
Android 9 bổ sung tính năng hỗ trợ Lược đồ chữ ký APK v3. Giao thức này có tuỳ chọn đưa bản ghi proof-of-rotation vào khối ký của nó cho mỗi 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ỉ hiện đang được ký.
Tìm hiểu thêm về cách xoay các phím bằng apksigner
.
Tuỳ chọn cho phép chỉ giải mã khoá trên các thiết bị đã mở khoá
Android 9 ra mắt cờ unlockedDeviceRequired
. Tuỳ chọn này xác định xem Kho khoá có yêu cầu mở khoá màn hình hay không trước khi cho phép giải mã bất kỳ dữ liệu nào đang diễn ra hoặc được lưu trữ bằng khoá đã chỉ định. Các loại khoá này phù hợp để mã hoá dữ liệu nhạy cảm để lưu trữ trên ổ đĩa, chẳng hạn như dữ liệu sức khoẻ hoặc dữ liệu doanh nghiệp. Cờ này giúp người dùng đảm bảo cao hơn rằng dữ liệu không thể giải mã trong khi thiết bị bị khoá nếu điện thoại của họ bị mất hoặc bị đánh cắp.
Để bảo vệ khoá khỏi việc giải mã trong khi thiết bị bị khoá, hãy bật cờ bằng cách chuyển true
vào 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 thao tác giải mã hoặc ký dữ liệu bằng khoá này đều không thành công. Thiết bị bị khoá yêu cầu nhập mã PIN, mật khẩu, vân tay hoặc một yếu tố đáng tin cậy khác thì mới có thể truy cập được.
Hỗ trợ lớp mã hoá cũ
Các thiết bị Android 9 đi kèm Keymaster 4 sẽ hỗ trợ Thuật toán mã hoá dữ liệu ba ( 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 DES ba lần, hãy sử dụng loại thuật toán mật mã này khi mã hoá thông tin xác thực 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, hãy xem bài viết Bảo mật cho nhà phát triển Android.
WPS không dùng nữa
Vì các lý do bảo mật, tính năng Thiết lập được bảo vệ bằng Wi-Fi (WPS) không còn được dùng nữa.
Bản sao lưu trên Android
Android 9 bổ sung chức năng mới và tuỳ 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 tính năng mã hoá phía máy khách
Android 9 bổ sung tính năng hỗ trợ mã hoá các bản sao lưu của Android bằng mã bí mật phía máy khách. Tính năng hỗ trợ này được bật tự động khi đáp ứng các điều kiện sau:
- Người dùng đã bật tính năng sao lưu bằng Android 9 trở lên.
- Người dùng đã đặt phương thức khoá màn hình cho thiết bị mà yêu cầu phải nhập mã PIN, hình mở khoá hoặc mật khẩu thì mới mở khoá được.
Khi bật biện pháp bảo vệ quyền riêng tư này, hệ thống sẽ yêu cầu 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ừ các bản sao lưu do thiết bị của người dùng thực hiện. Để tìm hiểu thêm về công nghệ sử dụng tính năng này, vui lòng xem sách trắng về Dịch vụ Google Cloud Key Vault.
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 bao gồm thông tin nhạy cảm hoặc lựa chọn ưu tiên, 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 sẽ đượ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 quá trình chuyển cục bộ từ thiết bị này sang thiết bị khác đang diễn ra.
Để tìm hiểu thêm về cách sao lưu dữ liệu trên các 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 tính năng nâng cao cho khung hỗ trợ tiếp cận giúp bạn dễ dàng cung cấp trải nghiệm tốt hơn nữa cho người dùng ứng dụng.
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ừ danh mục ưu đãi này sang danh mục ưu đãi tiếp theo mà trình đọc màn hình không 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 cập nhật một ngăn cụ thể trên màn hình, chẳng hạn như thời điểm 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ử trên giao diện người dùng có liên quan đến hình ảnh, được nhóm logic và thường tạo thành một mảnh.
Trên Android 9, bạn có thể cung cấp tiêu đề của 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 đề của 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 cho người dùng thông tin chi tiết hơn 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 ngăn giao diện người dùng đã được thay thế trong 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 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ể của View
đại diện cho các 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 di chuyển trực tiếp từ tiêu đề này đến 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 thao tác trên giao diện người dùng của người dùng.
Điều hướng và đầu ra nhóm
Trước đây, trình đọc màn hình thường sử dụng thuộc tính android:focusable
để xác định thời điểm 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ị duy nhất. Bằng cách đó, người dùng có thể hiểu rằng các chế độ xem có liên quan với nhau về mặt logic.
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àm tâm điểm và chính ViewGroup
đó là có thể làm tâm điểm. Sự sắp xếp này khiến một số thực thể của View
được đánh dấu là có thể làm tâm đ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à.
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 trường hợp việc lấy đối tượng View
làm tiêu điểm sẽ gây ra những hậu quả không mong muốn. Trình đọc màn hình tập trung vào tất cả các phần tử đã đặt android:screenReaderFocusable
hoặc android:focusable
thành true
.
Thao tác tiện lợi
Android 9 bổ sung tính năng hỗ trợ việc thay mặt người dùng thực hiện các thao tác thuận tiện sau đây:
- Hoạt động tương tác với chú giải công cụ
- Các tính năng đã thêm trong khung hỗ trợ tiếp cận cho phép bạn truy cập vào phần chú thích trong giao diện người dùng của ứ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ụngACTION_SHOW_TOOLTIP
vàACTION_HIDE_TOOLTIP
để hướng dẫn các thực thể củaView
hiện hoặc ẩn chú giải công cụ. - Các thao tác chung đã thêm
- Android 9 hỗ trợ thêm hai thao tác khác 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 thao tácGLOBAL_ACTION_LOCK_SCREEN
vàGLOBAL_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 bản cập nhật cho các cửa sổ của một ứng dụng khi một ứ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ề chế độ xem 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 thời điểm một ngăn có tiêu đề mới hoặc thời điểm một ngăn đã biến mất.
Chế độ xoay
Để loại bỏ việc 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í của thiết bị thay đổi. Người dùng có thể kích hoạt tính năng 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 đến 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 không biết, khi lựa chọn ưu tiên xoay của người dùng luôn được đặt thành dọc. Bạn nên xem xét hành vi xoay 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 đang mang lại trải nghiệm tối ưu.
Để biết thêm thông tin chi tiết, hãy xem các thay đổi về hành vi liên quan.
![Thiết bị di động xoay hiển thị chế độ xoay mới cho phép người dùng kích hoạt tính năng xoay theo cách thủ công](https://developer.android.com/static/images/about/versions/pie/rotate-changes.gif?authuser=6&hl=vi)
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 các tính năng liên quan đến văn bản sau đây:
Văn bản được tính toán trước: Lớp
PrecomputedText
cải thiện hiệu suất hiển thị văn bản bằng cách cho phép bạn tính toán và lưu thông tin bắt buộc 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 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 trải nghiệm tính năng phóng to nhất quán trên tất cả ứng dụng.Smart Linkify: Android 9 cải thiện lớp
TextClassifier
, trong đó 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 phát hiện xem người dùng đã chọn số điện thoại hay chưa. Sau đó, ứng dụng của bạn có thể đề xuất người dùng gọi điện thoại bằng số đó. Các tính năng trongTextClassifier
sẽ thay thế chức năng của lớpLinkify
.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 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 thời gian chạy Android (ART) sẽ tối ưu hoá các tệp định dạng có thể thực thi Dalvik (DEX) bằng cách chuyển đổi các tệp DEX trong gói ứng dụng thành một bản trình bày nhỏ gọn hơn. Thay đổi này giúp ứng dụng khởi động nhanh hơn và tốn ít dung lượng ổ đĩa cũng như RAM hơn.
Điểm cải tiến này đặc biệt mang lại lợi ích cho các thiết bị cấp thấp có tốc độ I/O của ổ đĩ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 từ thiết bị của mình, 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ể thu thập dữ liệu 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 bài viết Thực hiện theo dõi hệ thống trên thiết bị.