Thay đổi về hành vi: ứng dụng nhắm đến API cấp 29 trở lên

Android 10 có các thay đổi mới về hành vi của hệ thống có thể ảnh hưởng đến ứng dụng của bạn. Những thay đổi nêu trên trang này chỉ áp dụng cho những ứng dụng đang nhắm đến API 29 trở lên. Nếu ứng dụng của bạn đặt targetSdkVersion thành "29" trở lên, bạn nên sửa đổi ứng dụng để hỗ trợ những hành vi này cho phù hợp (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách thay đổi về hành vi ảnh hưởng đến tất cả ứng dụng chạy trên Android 10.

Lưu ý: Ngoài những thay đổi nêu trên trang này, Android 10 đưa ra một số lượng lớn các thay đổi và hạn chế dựa trên quyền riêng tư, bao gồm như sau:

  • Bộ nhớ có giới hạn
  • Quyền truy cập vào số sê-ri của thiết bị USB
  • Khả năng bật, tắt và định cấu hình Wi-Fi
  • Quyền truy cập thông tin vị trí cho API kết nối

Những thay đổi này ảnh hưởng đến các ứng dụng nhắm đến API cấp 29 trở lên, nâng cao quyền riêng tư của người dùng. Để tìm hiểu thêm về cách hỗ trợ những thay đổi này, hãy xem trang Các thay đổi về quyền riêng tư.

Nội dung cập nhật về các hạn chế đối với giao diện không phải SDK

Để giúp đảm bảo độ ổn định và khả năng tương thích của ứng dụng, nền tảng này đã bắt đầu hạn chế giao diện không phải SDK ứng dụng của bạn có thể dùng trong Android 9 (API cấp 28). Android 10 có các danh sách đã cập nhật giao diện không phải SDK bị hạn chế dựa trên khả năng cộng tác với nhà phát triển Android và thử nghiệm nội bộ mới nhất. Mục tiêu của chúng tôi là đảm bảo rằng có sẵn các giải pháp thay thế trước khi chúng tôi hạn chế giao diện không phải SDK.

Nếu bạn không nhắm đến Android 10 (API cấp 29), thì một số thay đổi này có thể không ảnh hưởng ngay đến bạn. Tuy nhiên, mặc dù hiện tại bạn có thể sử dụng một số giao diện không phải SDK (tuỳ thuộc vào cấp độ API mục tiêu của ứng dụng), nhưng việc sử dụng phương thức hoặc trường không phải SDK luôn có nguy cơ cao làm hỏng ứng dụng.

Nếu không chắc ứng dụng của mình có sử dụng giao diện không phải SDK hay không, bạn có thể kiểm thử ứng dụng để tìm hiểu. Nếu ứng dụng của bạn dựa vào giao diện không phải SDK, thì bạn nên bắt đầu lập kế hoạch di chuyển sang SDK làm giải pháp thay thế. Tuy nhiên, chúng tôi hiểu rằng vẫn có một số trường hợp sử dụng hợp lệ cho việc ứng dụng sử dụng giao diện không phải SDK. Nếu bạn không thể tìm thấy giải pháp thay thế sang việc sử dụng giao diện không phải SDK cho một tính năng trong ứng dụng, bạn nên yêu cầu API công khai mới.

Để tìm hiểu thêm, hãy xem bài viết Thông tin cập nhật về những hạn chế đối với giao diện không phải SDK trên Android 10 và xem Quy định hạn chế đối với giao diện không phải SDK.

Kỷ niệm được chia sẻ

Ashmem đã thay đổi định dạng của bản đồ dalvik trong /proc/<pid>/maps, ảnh hưởng đến những ứng dụng trực tiếp phân tích cú pháp tệp bản đồ. Nhà phát triển ứng dụng nên thử nghiệm định dạng /proc/<pid>/maps trên các thiết bị chạy Android 10 trở lên và phân tích cú pháp cho phù hợp nếu ứng dụng phụ thuộc vào định dạng bản đồ dalvik.

Ứng dụng nhắm đến Android 10 không thể trực tiếp sử dụng ashmem (/dev/ashmem) và phải truy cập vào bộ nhớ dùng chung thông qua NDK Lớp ASharedMemory. Ngoài ra, các ứng dụng không thể tạo I đoạn Tuỳ chỉnh trực tiếp cho các chỉ số mô tả tệp ashmem hiện có và thay vào đó, phải sử dụng lớp ASharedMemory của NDK hoặc Android Java Các API để tạo vùng bộ nhớ dùng chung. Thay đổi này giúp tăng cường bảo mật và độ mạnh mẽ khi làm việc với bộ nhớ dùng chung, cải thiện hiệu suất và độ bảo mật của Android nói chung.

Xoá quyền thực thi đối với thư mục gốc của ứng dụng

Việc thực thi các tệp trong thư mục gốc của ứng dụng có thể ghi là Vi phạm W^X. Ứng dụng chỉ nên tải mã nhị phân được nhúng trong tệp APK của ứng dụng.

Các ứng dụng không đáng tin cậy nhắm đến Android 10 không thể gọi execve() trực tiếp trên các tệp trong thư mục gốc của ứng dụng.

Ngoài ra, những ứng dụng nhắm đến Android 10 không thể sửa đổi trong bộ nhớ mã thực thi từ các tệp đã mở bằng dlopen() và dự kiến những thay đổi đó sẽ được ghi vào ổ đĩa, vì thư viện không thể có được ánh xạ PROT_EXEC thông qua chỉ số mô tả tệp có thể ghi. Điều này bao gồm bất kỳ tệp đối tượng được chia sẻ (.so) có vị trí chuyển vị trí văn bản.

Android Runtime chỉ chấp nhận các tệp OAT do hệ thống tạo

Android Runtime (ART) không còn gọi dex2oat qua ứng dụng nữa của chúng tôi. Thay đổi này có nghĩa là ART sẽ chỉ chấp nhận các tệp OAT mà do hệ thống tạo ra.

Thực thi tính chính xác của AOT trong ART

Trước đây, quá trình biên dịch trước (AOT) do Android Runtime (ART) thực hiện có thể gây ra sự cố thời gian chạy nếu môi trường đường dẫn lớp không giống nhau tại thời điểm biên dịch và thời gian chạy. Android 10 trở lên luôn yêu cầu các ngữ cảnh môi trường này phải giống nhau, dẫn đến các thay đổi sau đây về hành vi:

  • Trình tải lớp tuỳ chỉnh – tức là trình tải lớp do ứng dụng viết, không giống như lớp trình tải từ gói dalvik.system không được biên dịch AOT. Điều này là do ART không thể biết về cách triển khai tra cứu lớp tuỳ chỉnh trong thời gian chạy.
  • Tệp dex phụ – tức là các tệp dex được tải theo cách thủ công bởi các ứng dụng không nằm trong APK chính—được biên dịch AOT ở chế độ nền. Đó là vì lần sử dụng đầu tiên quá trình biên dịch có thể quá tốn kém, dẫn đến độ trễ không mong muốn trước khi thực thi chính sách. Xin lưu ý rằng đối với ứng dụng, áp dụng các phần phân tách và bỏ phần phụ thuộc bạn nên sử dụng tệp dex.
  • Thư viện chia sẻ trong Android (mục nhập <library> và <uses-library> trong tệp kê khai Android) được triển khai bằng cách sử dụng hệ thống phân cấp trình tải lớp khác với hệ thống phân cấp được sử dụng trong các phiên bản trước của nền tảng.

Các thay đổi về quyền đối với ý định toàn màn hình

Những ứng dụng nhắm đến Android 10 trở lên và dùng thông báo bằng toàn màn hình ý định phải yêu cầu thời gian USE_FULL_SCREEN_INTENT quyền trong tệp kê khai của ứng dụng. Đây là điều bình thường quyền truy cập, để hệ thống tự động cấp quyền truy cập đó cho ứng dụng yêu cầu.

Nếu một ứng dụng nhắm đến Android 10 trở lên cố gắng tạo có ý định toàn màn hình mà không yêu cầu thì hệ thống sẽ bỏ qua ý định toàn màn hình và cho ra những kết quả sau: thông điệp nhật ký:

Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

Hỗ trợ thiết bị có thể gập lại

Android 10 có các thay đổi hỗ trợ thiết bị có thể gập lại và thiết bị màn hình lớn.

Khi một ứng dụng chạy trên Android 10, các phương thức onResume()onPause() sẽ hoạt động theo cách khác nhau. Khi nhiều ứng dụng xuất hiện cùng lúc trong nhiều cửa sổ hoặc chế độ nhiều màn hình, tất cả các hoạt động hàng đầu có thể làm tâm điểm trong ngăn xếp hiển thị ở trạng thái đã tiếp tục, nhưng chỉ một trong số đó, "đã tiếp tục ở trên cùng" hoạt động, thực sự có trọng tâm. Khi chạy trên các phiên bản trước Android 10, chỉ có một một hoạt động trong hệ thống có thể được tiếp tục tại một thời điểm, tất cả các hoạt động khác hiển thị các hoạt động bị tạm dừng.

Đừng nhầm lẫn "tập trung" với trạng thái "đã tiếp tục ở trên cùng" của bạn. Hệ thống chỉ định mức độ ưu tiên cho các hoạt động dựa trên thứ tự z để tạo mức độ ưu tiên cao hơn cho các hoạt động mà người dùng tương tác gần đây nhất. Một hoạt động có thể được tiếp tục ở trên cùng nhưng không có tiêu điểm (ví dụ: nếu ngăn thông báo được mở rộng).

Trong Android 10 (API cấp 29) trở lên, bạn có thể đăng ký Lệnh gọi lại onTopResumedActivityChanged() để được thông báo khi hoạt động của bạn nhận hoặc mất hoạt động được tiếp tục trên cùng vị trí. Trạng thái này tương đương với trạng thái đã tiếp tục trước Android 10 và có thể hữu ích làm gợi ý nếu ứng dụng của bạn đang sử dụng các tài nguyên độc quyền hoặc singleton có thể cần đến được chia sẻ với các ứng dụng khác.

Hành vi của resizeableActivity thuộc tính tệp kê khai cũng đã thay đổi. Nếu một ứng dụng đặt resizeableActivity=false trong Android 10 (API cấp 29) trở lên, thì ứng dụng đó có thể được đặt ở chế độ tương thích khi kích thước màn hình hiện có thay đổi hoặc nếu ứng dụng di chuyển từ màn hình này sang màn hình khác.

Ứng dụng có thể sử dụng android:minAspectRatio được ra mắt trong Android 10, để biểu thị màn hình nhiều tỷ lệ mà ứng dụng của bạn hỗ trợ.

Kể từ phiên bản 3.5, công cụ trình mô phỏng của Android Studio bao gồm 7,3 inch và 8 inch thiết bị ảo để kiểm thử mã với màn hình lớn hơn.

Để biết thêm thông tin, hãy xem nội dung Thiết kế ứng dụng cho thiết bị có thể gập lại.