Quyền khi bắt đầu chạy

Trong Android 6.0 trở lên, mô hình quản lý quyền cho ứng dụng Android được thiết kế để giúp trở nên dễ hiểu, hữu ích và an toàn hơn cho người dùng. Mô hình này đã chuyển Android các ứng dụng yêu cầu các quyền nguy hiểm (xem Các quyền bị ảnh hưởng) từ một Mô hình quyền tại thời điểm cài đặt sang mô hình quản lý quyền thời gian chạy:

  • Quyền khi cài đặt

    (Android 5.1 trở xuống) Người dùng cấp các quyền nguy hiểm cho một ứng dụng khi cài đặt hoặc cập nhật ứng dụng. Thiết bị nhà sản xuất và nhà mạng có thể cài đặt sẵn các ứng dụng có các quyền được cấp sẵn mà không cần thông báo người dùng.

  • Quyền khi bắt đầu chạy

    (Android 6.0 đến 9) Người dùng cấp các quyền nguy hiểm cho một ứng dụng khi ứng dụng đó đang chạy. Khi người dùng yêu cầu cấp quyền (chẳng hạn như khi ứng dụng khởi chạy hoặc khi người dùng truy cập vào một tính năng) phụ thuộc vào ứng dụng, nhưng người dùng cấp/từ chối ứng dụng quyền truy cập vào các nhóm quyền. OEM/nhà mạng có thể cài đặt sẵn ứng dụng nhưng không thể cấp trước quyền trừ phi họ sẽ trải qua quá trình ngoại lệ. (Xem bài viết Tạo ngoại lệ.)

    (Android 10) Người dùng thấy rõ ràng hơn và kiểm soát ứng dụng nào có quyền khi bắt đầu chạy tính năng Nhận dạng hoạt động (AR). Người dùng được nhắc hộp thoại quyền khi bắt đầu chạy để luôn cho phép, cho phép trong khi sử dụng hoặc từ chối cấp quyền. Khi nâng cấp hệ điều hành lên Android 10, các quyền cấp cho ứng dụng sẽ được giữ lại, nhưng người dùng có thể vào phần Cài đặt để thay đổi.

Quyền khi bắt đầu chạy ngăn các ứng dụng có được quyền truy cập vào dữ liệu riêng tư mà không có sự đồng ý của người dùng, đồng thời cung cấp cho họ thông tin bổ sung và hiểu rõ về các loại quyền đang tìm kiếm hoặc đã được cấp quyền. Mô hình thời gian chạy khuyến khích nhà phát triển giúp người dùng nắm được lý do ứng dụng đòi hỏi các quyền được yêu cầu, đồng thời cung cấp tính minh bạch để người dùng có thể đưa ra quyết định tốt hơn về việc cấp hay từ chối cấp quyền.

Các quyền bị ảnh hưởng

Android 6.0 trở lên yêu cầu các quyền có mức độ bảo vệ nguy hiểm để sử dụng mô hình quản lý quyền khi bắt đầu chạy. Quyền nguy hiểm là những quyền có mức độ rủi ro cao hơn (chẳng hạn như READ_CALENDAR) cấp yêu cầu các ứng dụng truy cập vào dữ liệu riêng tư của người dùng hoặc kiểm soát một thiết bị, điều này có thể tiêu cực ảnh hưởng đến người dùng. Để xem danh sách các quyền nguy hiểm, hãy chạy lệnh:

adb shell pm list permissions -g -d

Android 6.0 trở lên không thay đổi hành vi bình thường quyền truy cập. Đây là tất cả các quyền không nguy hiểm, bao gồm các quyền hệ thống và chữ ký. Quyền thông thường là quyền có mức độ rủi ro thấp hơn (chẳng hạn như SET_WALLPAPER) cấp cho các ứng dụng yêu cầu quyền truy cập vào cấp ứng dụng riêng biệt với mức rủi ro tối thiểu đối với các ứng dụng, hệ thống hoặc người dùng khác. Như trong Android 5.1 và các bản phát hành thấp hơn, hệ thống sẽ tự động cấp các quyền thông thường cho ứng dụng yêu cầu tại cài đặt và không nhắc người dùng phê duyệt. Để biết thông tin chi tiết về các quyền, hãy xem phần <permission> phần tử.

Hạn chế cứng và mềm trong Android 10

Ngoài mức độ nguy hiểm, một quyền còn có thể bị hạn chế cứng hoặc bị giới hạn tạm thời. Trong cả hai trường hợp, quyền bị hạn chế đó cũng phải được đưa vào danh sách cho phép. Không có trong danh sách cho phép các hạn chế cố định hoạt động khác với các hạn chế mềm không nằm trong danh sách cho phép hạn chế:

  • (Các hạn chế nghiêm ngặt) Không thể cấp các quyền không phải cho ứng dụng danh sách cho phép.
  • (Các hạn chế không cố định) Các ứng dụng không có trong danh sách cho phép sẽ hoạt động theo quyền cụ thể mà họ yêu cầu. Hành vi này được mô tả công khai tài liệu về quyền được yêu cầu.

Khi cài đặt một ứng dụng, trình cài đặt (chẳng hạn như Cửa hàng Google Play) có thể chọn để không đưa các quyền bị hạn chế cho ứng dụng vào danh sách cho phép. Quyền truy cập là bị hạn chế bởi nền tảng và chỉ có thể được cấp nếu ứng dụng đáp ứng các tiêu chí đặc biệt theo chính sách nền tảng. Ví dụ về các loại quyền bị hạn chế nghiêm ngặt bao gồm tin nhắn SMS và quyền truy cập Nhật ký cuộc gọi.

Việc đưa vào danh sách cho phép sẽ diễn ra trong quá trình cài đặt và khi

  • một ứng dụng đã được cài đặt trong quá trình nâng cấp Android từ 9 lên 10.
  • một quyền đã được cấp trước hoặc cài đặt trước một ứng dụng.
  • người dùng cần có quyền cho một vai trò đã được xác định để quyền.
  • trình cài đặt (chẳng hạn như Cửa hàng Google Play) đánh dấu quyền là danh sách cho phép.

Người dùng không thể thêm quyền vào danh sách cho phép theo cách thủ công.

Yêu cầu

Mô hình quản lý quyền khi bắt đầu chạy áp dụng cho tất cả ứng dụng, bao gồm cả các ứng dụng và ứng dụng cài đặt sẵn phân phối đến thiết bị trong quá trình thiết lập. Yêu cầu về phần mềm ứng dụng bao gồm:

  • Mô hình quản lý quyền khi bắt đầu chạy phải nhất quán trên tất cả các thiết bị chạy Android 6.0 và cao hơn. Việc này được thực thi bằng các bài kiểm thử Bộ kiểm tra tính tương thích (CTS) với Android.
  • Ứng dụng phải nhắc người dùng cấp quyền cho ứng dụng trong thời gian chạy. Để biết thông tin chi tiết, hãy xem phần Cập nhật . Có thể chấp nhận một số ít trường hợp ngoại lệ cho các ứng dụng và trình xử lý mặc định cung cấp chức năng cơ bản của thiết bị để đảm bảo hoạt động dự kiến của thiết bị. (Ví dụ: ứng dụng Trình quay số mặc định của thiết bị để xử lý ACTION_CALL có thể có Quyền truy cập vào điện thoại.) Để biết thông tin chi tiết, hãy xem phần Tạo ngoại lệ.
  • Ứng dụng tải sẵn có các quyền nguy hiểm phải nhắm đến API cấp 23 và duy trì mô hình quản lý quyền khi bắt đầu chạy. Tức là luồng giao diện người dùng trong quá trình cài đặt ứng dụng không được lệch với phương thức triển khai AOSP (Dự án nguồn mở Android) của LicenseController, người dùng có thể thu hồi các quyền nguy hiểm của các ứng dụng cài đặt sẵn, v.v. .
  • Ứng dụng không có giao diện người dùng phải dùng một hoạt động để yêu cầu quyền hoặc để chia sẻ UID với một ứng dụng khác có các quyền cần thiết. Để biết thông tin chi tiết, hãy xem phần Ứng dụng không có giao diện người dùng.

Di chuyển quyền

Các quyền được cấp cho ứng dụng trên Android 5.x vẫn được cấp sau khi cập nhật lên Android 6.0 trở lên, nhưng người dùng có thể thu hồi các quyền đó bất cứ lúc nào.

Trong bản cập nhật Android từ 9 lên 10, mọi quyền bị hạn chế cứng đều được danh sách cho phép. Để biết thông tin chi tiết về cách triển khai quyền phân tách nền trước/nền sau, hãy xem nội dung Thay đổi về quyền riêng tư trong Android 10, bắt đầu bằng phần Yêu cầu chạy ở chế độ nền vị trí.

Tích hợp

Khi tích hợp mô hình quản lý quyền khi bắt đầu chạy ứng dụng cho Android 6.0 trở lên, bạn phải cập nhật các ứng dụng được cài đặt trước để làm việc với mô hình mới. Bạn cũng có thể xác định trường hợp ngoại lệ cho ứng dụng là trình xử lý/nhà cung cấp mặc định cho chức năng cốt lõi, xác định quyền tuỳ chỉnh, và tuỳ chỉnh giao diện dùng trong ứng dụng PermissionController.

Cập nhật ứng dụng

Ứng dụng trên hình ảnh hệ thống và các ứng dụng cài đặt trước không được tự động cấp phép trước quyền truy cập. Bạn nên làm việc với các nhà phát triển ứng dụng cài đặt trước (OEM, nhà mạng và nhà phát triển ứng dụng thứ ba bên thứ ba) để thực hiện các sửa đổi bắt buộc đối với ứng dụng bằng cách sử dụng nhà phát triển nguyên tắc. Cụ thể, bạn phải đảm bảo rằng các ứng dụng cài đặt trước được sửa đổi để tránh và các vấn đề khác khi người dùng thu hồi quyền.

Ứng dụng tải sẵn

Trong Android 9 trở xuống, các ứng dụng tải trước dùng các quyền nguy hiểm phải nhắm đến API cấp 23 trở lên và duy trì mô hình quyền của Android 6.0 trở lên. Ví dụ: luồng giao diện người dùng trong quá trình cài đặt ứng dụng không được lệch với phương thức triển khai AOSP (Dự án nguồn mở Android) của PermissionController. Người dùng thậm chí có thể thu hồi các quyền nguy hiểm của ứng dụng được cài đặt trước.

Trên Android 6.0 đến 9, một số quyền được cấp trong quy trình cài đặt. Tuy nhiên, việc bắt đầu trong 10, luồng cài đặt (do ứng dụng Package Installer thực hiện) là một hàm riêng biệt với việc cấp quyền (trong Permission Controller).

Ứng dụng không có giao diện người dùng

Chỉ các hoạt động mới có thể yêu cầu quyền. Các dịch vụ không thể yêu cầu cấp quyền trực tiếp.

  • Trong Android 5.1 trở xuống, ứng dụng không có giao diện người dùng có thể yêu cầu cấp quyền khi hay được cài đặt sẵn mà không sử dụng hoạt động nào.
  • Trong Trên Android 6.0 trở lên, ứng dụng không có giao diện người dùng phải dùng một trong những phương pháp sau để yêu cầu cấp quyền:
    • Thêm một hoạt động để yêu cầu cấp quyền. (Đây là phương thức ưu tiên.)
    • Chia sẻ UID với một ứng dụng khác có các quyền cần thiết. Sử dụng bản thảo này chỉ khi bạn cần nền tảng xử lý nhiều APK dưới dạng một .

Mục đích là để tránh gây nhầm lẫn cho người dùng trước các yêu cầu cấp quyền xuất hiện ngoài bối cảnh.

Tuỳ chỉnh giao diện người dùng PackageInstaller

Nếu muốn, bạn có thể tuỳ chỉnh giao diện trong Giao diện người dùng cấp quyền theo cập nhật giao diện mặc định của thiết bị (Theme.DeviceDefault.SettingsTheme.DeviceDefault.Light.Dialog.NoActionBar) được dùng trong PackageInstaller (Trình cài đặt gói). Tuy nhiên, vì tính nhất quán là yếu tố quan trọng đối với các nhà phát triển ứng dụng, bạn không thể tuỳ chỉnh vị trí cũng như các quy tắc về thời điểm Giao diện người dùng xuất hiện.

Để đưa chuỗi vào cho các ngôn ngữ khác, hãy đóng góp thuộc tính chuỗi vào AOSP.

Tạo ngoại lệ

Bạn có thể cấp trước quyền cho các ứng dụng là trình xử lý mặc định hoặc các nhà cung cấp chức năng cốt lõi của hệ điều hành bằng cách sử dụng Lớp DefaultPermissionGrantPolicy.java trong PackageManager. Ví dụ:

ACTION_CALL (Dialer) Default
Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default
Phone, Contacts, SMS

Xác định quyền tuỳ chỉnh

Bạn có thể xác định quyền và nhóm tuỳ chỉnh là bình thường hoặc nguy hiểm và thêm các quyền dành riêng cho OEM/Nhà mạng vào các quyền hiện có các nhóm quyền, giống như cách bạn có thể làm trong các bản phát hành Android 5.x trở về trước.

Trong Android 6.0 trở lên, nếu bạn thêm một quyền nguy hiểm mới, thì quyền đó phải được xử lý trong giống như các quyền nguy hiểm khác (được yêu cầu trong thời gian chạy ứng dụng và người dùng có thể thu hồi). Cụ thể:

  • Bạn có thể thêm quyền mới vào nhóm hiện tại, nhưng không thể sửa đổi Liên kết AOSP (Dự án nguồn mở Android) về các quyền nguy hiểm và nhóm quyền nguy hiểm. (Nói cách khác, bạn không thể xoá quyền khỏi nhóm và chỉ định cho một nhóm khác).
  • Bạn có thể thêm các nhóm quyền mới trong các ứng dụng đã cài đặt trên thiết bị, nhưng bạn không thể thêm các nhóm quyền mới vào tệp kê khai nền tảng.

Kiểm thử quyền

Android bao gồm các bài kiểm thử Bộ kiểm tra tính tương thích (CTS) để xác minh quyền riêng lẻ được liên kết tới đúng nhóm. Việc vượt qua các bài kiểm tra này là yêu cầu về khả năng tương thích với Android 6.0 trở lên CTS.

Thu hồi quyền

Trên Android 13 trở lên, bạn có thể thu hồi chính sách đã cấp của mình quyền khi bắt đầu chạy bằng cách sử dụng Context.revokeSelfPermissionsOnKill(). Quá trình thu hồi diễn ra không đồng bộ và được kích hoạt khi thấy an toàn mà không gây gián đoạn người dùng. Khi việc thu hồi được kích hoạt, tất cả các quy trình đang chạy trong UID gọi sẽ bị dừng.

Bạn cần hiểu rằng việc thu hồi một quyền có thể không được phản ánh trong cài đặt giao diện người dùng. Giao diện này xử lý các quyền theo nhóm. Thông thường, một nhóm quyền được hiển thị là được cấp miễn là ít nhất một trong các quyền trong nhóm đó được cấp. Nếu đảm bảo rằng người dùng có thể xác nhận rằng việc thu hồi trong các chế độ cài đặt này là quan trọng đối với bạn, hãy nhớ thu hồi mọi trong nhóm quyền. Để tìm hiểu xem quyền nào thuộc về một nhóm nhất định, bạn có thể sử dụng PackageManager.getGroupOfPlatformPermissionPackageManager.getPlatformPermissionsForGroup.

Khi thu hồi các quyền đã yêu cầu, hệ thống cũng sẽ thu hồi nền tương ứng nếu vẫn chưa cấp quyền tương ứng nào trên nền trước.

Việc thu hồi sẽ không được kích hoạt miễn là quy trình vẫn ở nền trước nhưng có thể cũng được kích hoạt ngay lập tức bằng cách tắt thủ công tất cả các quy trình đang chạy trong uid hiện tại, cho thực thể sử dụng System.exit(). Tuy nhiên, bạn nên để hệ thống quyết định thời điểm kích hoạt quảng cáo.

Sau khi yêu cầu thu hồi quyền có hiệu lực, bạn có thể yêu cầu lại và người dùng được nhắc chấp nhận hoặc từ chối yêu cầu. Không thể yêu cầu quyền đã có trước đây đã bị người dùng từ chối. Mặc dù bạn được khuyến khích thu hồi các quyền đã hiện có nhưng không còn cần thiết, bạn nên cẩn thận không thông báo cho người dùng về cho đến khi lệnh thu hồi có hiệu lực.