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 hệ thống có thể ảnh hưởng đến ứng dụng của bạn. Các thay đổi được liệt kê trên trang này chỉ áp dụng cho những ứng dụng 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 điều chỉnh ứ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 các 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 được liệt kê trên trang này, Android 10 còn giới thiệu nhiều thay đổi và hạn chế dựa trên quyền riêng tư, bao gồm cả những thay đổi sau:

  • Bộ nhớ có giới hạn
  • Quyền truy cập vào số sê-ri của thiết bị USB
  • Có thể bật, tắt và định cấu hình Wi-Fi
  • Quyền truy cập thông tin vị trí cho các 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) giúp tăng cường 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

Để đảm bảo tính ổ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ế những giao diện không phải SDK mà ứng dụng của bạn có thể sử dụng trong Android 9 (API cấp 28). Android 10 cung cấp danh sách mới cập nhật về các 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à kiểm thử nội bộ mới nhất. Mục tiêu của chúng tôi là đảm bảo rằng các phương án thay thế công khai có sẵn 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ể sẽ không ảnh hưởng ngay. 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 không tìm được giải pháp thay thế cho việc sử dụng giao diện không phải SDK cho một tính năng trong ứng dụng, thì bạn nên yêu cầu một 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 trong Android 10Các hạn chế đối với giao diện không phải SDK.

Bộ nhớ dùng chung

Ashmem đã thay đổi định dạng của các bản đồ dalvik trong /proc/<pid>/maps, ảnh hưởng đến những ứng dụng phân tích cú pháp trực tiếp tệp bản đồ. Nhà phát triển ứng dụng nên kiểm thử định dạng /proc/<pid>/maps trên những 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.

Các ứng dụng nhắm đến Android 10 không thể trực tiếp sử dụng ashmem (/dev/ashmem) mà thay vào đó phải truy cập vào bộ nhớ dùng chung thông qua lớp ASharedMemory của NDK. Ngoài ra, các ứng dụng không thể thực hiện IOCTL trực tiếp cho các bộ mô tả tệp ashmem hiện có mà thay vào đó phải sử dụng lớp ASharedMemory của NDK hoặc API Java Android để tạo các vùng nhớ dùng chung. Thay đổi này giúp tăng cường độ bảo mật và độ ổn định 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ó thể ghi của ứng dụng bị coi là một lỗi vi phạm W^X. Các ứ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 trực tiếp execve() 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 mã thực thi trong bộ nhớ của những tệp đã mở bằng dlopen() và mong muốn những thay đổi đó được ghi vào đĩa, vì thư viện không thể được ánh xạ PROT_EXEC thông qua một bộ mô tả tệp có thể ghi. Điều này bao gồm tất cả tệp đối tượng được chia sẻ (.so) có hình thức chuyển vị trí văn bản.

Thời gian chạy Android chỉ chấp nhận các tệp OAT do hệ thống tạo

Thời gian chạy Android (ART) không còn gọi dex2oat từ quy trình ứng dụng nữa. Thay đổi này có nghĩa là ART sẽ chỉ chấp nhận các tệp OAT mà hệ thống đã tạo.

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 classpath không giống nhau tại thời gian 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 những 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 các ứng dụng viết, không giống như trình tải lớp từ gói dalvik.system) không được biên dịch trước thời hạn. Điều này là do ART không thể biết về quá trình triển khai tra cứu lớp tuỳ chỉnh trong thời gian chạy.
  • Các tệp dex thứ cấp (tức là các tệp dex do ứng dụng tải theo cách thủ công không có trong APK chính) được biên dịch AOT ở chế độ nền. Điều này là do quá trình biên dịch khi sử dụng lần đầu có thể tốn quá nhiều tài nguyên, dẫn đến độ trễ không mong muốn trước khi thực thi. Xin lưu ý rằng đối với các ứng dụng, bạn nên áp dụng các tệp chia nhỏ và chuyển từ tệp dex thứ cấp.
  • Các thư viện dùng chung trong Android (các mục <library> và <uses-library> trong tệp kê khai Android) được triển khai bằng cách sử dụng một hệ thống phân cấp trình tải lớp khác với hệ thống được 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à sử dụng thông báo có ý định toàn màn hình phải yêu cầu quyền USE_FULL_SCREEN_INTENT trong tệp kê khai của ứng dụng. Đây là một quyền thông thường, vì vậy hệ thống sẽ tự động cấp quyền này 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 một thông báo có ý định toàn màn hình mà không yêu cầu quyền cần thiết, thì hệ thống sẽ bỏ qua ý định toàn màn hình và xuất thông báo nhật ký sau đây:

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ó những thay đổi hỗ trợ thiết bị có thể gập lại và thiết bị có 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. Khi nhiều ứng dụng xuất hiện cùng lúc ở chế độ nhiều cửa sổ hoặc nhiều màn hình, tất cả các hoạt động hàng đầu có thể lấy tiêu điểm trong các ngăn xếp hiển thị đều ở trạng thái tiếp tục, nhưng thực tế chỉ có một hoạt động trong số đó (hoạt động "được tiếp tục ở trên cùng") có tiêu điểm. Khi chạy trên các phiên bản trước Android 10, chỉ một hoạt động duy nhất 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 hiển thị khác đều bị tạm dừng.

Đừng nhầm lẫn "tiêu điểm" với hoạt động "đã tiếp tục ở trên cùng". Hệ thống chỉ định mức độ ưu tiên cho các hoạt động dựa trên thứ tự z để ư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 bóng 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() để nhận thông báo khi hoạt động của bạn nhận được hoặc mất đi vị trí tiếp tục ở trên cùng. Đây là trạng thái tương đương với trạng thái tiếp tục trước Android 10 và có thể hữu ích như một 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 tài nguyên singleton có thể cần được chia sẻ với các ứng dụng khác.

Hành vi của thuộc tính tệp kê khai resizeableActivity cũng đã thay đổi. Nếu đặt resizeableActivity=false trong Android 10 (API cấp 29) trở lên, ứ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.

Các ứng dụng có thể dùng thuộc tính android:minAspectRatio (ra mắt trong Android 10) để cho biết tỷ lệ khung hình 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 có các thiết bị ảo 7,3 inch và 8 inch để kiểm thử mã của bạn trên màn hình lớn hơn.

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