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

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

  • Quyền tại thời điểm cài đặt

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

  • Quyền thời gian chạy

    ( Android 6.0 – 9 ) Người dùng cấp các quyền nguy hiểm cho ứng dụng khi ứng dụng đang chạy. Thời điểm yêu cầu 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 một tính năng cụ thể) tùy thuộc vào ứng dụng nhưng người dùng cấp/từ chối quyền truy cập của ứng dụng vào các nhóm quyền cụ thể. OEM/nhà cung cấp dịch vụ có thể cài đặt trước ứng dụng nhưng không thể cấp trước quyền trừ khi họ trải qua quy trình ngoại lệ. (Xem Tạo ngoại lệ .)

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

Quyền trong thời gian chạy ngăn ứng dụng 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 chúng ngữ cảnh và khả năng hiển thị bổ sung về các loại quyền mà ứng dụng đang tìm kiếm hoặc đã được cấp. Mô hình thời gian chạy khuyến khích các nhà phát triển giúp người dùng hiểu lý do ứng dụng yêu cầu các quyền được yêu cầu và cung cấp tính minh bạch cao hơn để người dùng có thể đưa ra quyết định tốt hơn về việc cấp hoặc từ chối chúng.

Quyền bị ảnh hưởng

Android 6.0 trở lên yêu cầu các quyền nguy hiểm để sử dụng mô hình quyền trong thời gian chạy. Các quyền nguy hiểm là các quyền có mức độ rủi ro cao hơn (chẳng hạn như READ_CALENDAR ) cấp cho các ứng dụng yêu cầu quyền truy cập vào dữ liệu riêng tư của người dùng hoặc quyền kiểm soát thiết bị, điều này có thể tác động tiêu cực đế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 của các quyền thông thường . Đây đều là các quyền không nguy hiểm bao gồm các quyền thông thường, hệ thống và chữ ký. Các quyền thông thường là các 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ác tính năng cấp ứng dụng riêng biệt với rủi ro tối thiểu đối với các ứng dụng khác, hệ thống hoặc người dùng. Giống 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 khi cài đặt và không nhắc người dùng phê duyệt. Để biết chi tiết về quyền, hãy xem tài liệu về phần tử <permission> .

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

Ngoài việc nguy hiểm, quyền có thể bị hạn chế cứng hoặc hạn chế mềm. 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. Các hạn chế cứng không nằm trong danh sách cho phép 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ứng ) Không thể cấp các quyền không nằm trong danh sách cho phép.
  • ( Hạn chế mềm ) Các ứng dụng không có danh sách cho phép sẽ hoạt động theo quyền cụ thể mà chúng yêu cầu. Hành vi này được mô tả trong tài liệu công khai 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ế vào danh sách cho phép đối với ứng dụng đó. Các quyền bị hạn chế bởi nền tảng và chỉ được cấp nếu ứng dụng đáp ứng các tiêu chí đặc biệt cho mỗi chính sách nền tảng. Ví dụ về các loại quyền bị hạn chế cứng bao gồm quyền SMS và Nhật ký cuộc gọi.

Việc đưa vào danh sách cho phép xảy 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 9 lên 10.
  • quyền được cấp trước hoặc ứng dụng được cài đặt sẵn.
  • Cần có quyền đối với vai trò đã được xác định để đưa quyền vào danh sách cho phép.
  • trình cài đặt (chẳng hạn như Cửa hàng Google Play) đánh dấu quyền là có trong danh sách cho phép.

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

Yêu cầu

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

  • Mô hình quyền khi chạy phải nhất quán trên tất cả các thiết bị chạy Android 6.0 trở lên. Điều này được thực thi bằng các thử nghiệm của Bộ kiểm tra khả năng tương thích Android (CTS).
  • Ứ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 chi tiết, hãy xem Cập nhật ứng dụng . Các ngoại lệ hạn chế có thể được cấp 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ị cho 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 Quyền điện thoại.) Để biết chi tiết, hãy xem Tạo ngoại lệ .
  • Các ứng dụng tải sẵn có quyền nguy hiểm phải nhắm mục tiêu API cấp 23 và duy trì mô hình quyền trong thời gian chạy. Nghĩa là, luồng giao diện người dùng trong quá trình cài đặt ứng dụng không được khác với quá trình triển khai AOSP của PermissionController, người dùng có thể thu hồi các quyền nguy hiểm của các ứng dụng được cài đặt sẵn, v.v.
  • Các ứng dụng không có giao diện phải sử 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 chi tiết, xem Ứng dụng không đầu .

Di chuyển quyền

Các quyền được cấp cho các ứ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 kỳ lúc nào.

Trong bản cập nhật Android 9 đến 10, tất cả các quyền bị hạn chế cứng đều được đưa vào danh sách cho phép. Để biết chi tiết về cách triển khai quyền phân chia nền trước/nền, hãy xem Thay đổi quyền riêng tư của Android 10 , bắt đầu bằng Yêu cầu vị trí ở nền .

Hội nhập

Khi tích hợp mô hình quyền thời gian 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 sẵn để hoạt động với mô hình mới. Bạn cũng có thể xác định các ngoại lệ cho các ứ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 các quyền tùy chỉnh và tùy chỉnh chủ đề được sử dụng trong ứng dụng PermissionController .

Cập nhật ứng dụng

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

Ứng dụng được tải sẵn

Trong Android 9 trở xuống, các ứng dụng tải sẵn sử dụng các quyền nguy hiểm phải nhắm mục tiêu API cấp 23 trở lên và duy trì mô hình quyền AOSP 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 khác với quá trình triển khai AOSP của PermissionController . Người dùng thậm chí có thể thu hồi các quyền nguy hiểm của các ứng dụng được cài đặt sẵn.

Trong Android 6.0 đến 9, một số quyền được cấp trong quá trình cài đặt. Tuy nhiên, bắt đầu từ phiên bản 10, quy trình cài đặt (được thực hiện bởi ứng dụng Package Installer ) là một chức năng riêng biệt với việc cấp quyền (trong ứng dụng Permission Controller ).

Ứng dụng không đầu

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

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

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

Tùy chỉnh giao diện người dùng PackageInstaller

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

Để bao gồm các chuỗi cho các ngôn ngữ bổ sung, hãy đóng góp chuỗi cho 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ý hoặc nhà cung cấp mặc định cho chức năng hệ điều hành cốt lõi 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 tùy chỉnh

Bạn có thể xác định các quyền và nhóm tùy chỉnh là bình thường hoặc nguy hiểm , đồng thời thêm các quyền dành riêng cho OEM/Nhà cung cấp dịch vụ vào các nhóm quyền hiện có, giống như bạn có thể làm trong Android 5.x và các bản phát hành 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ý theo cách tương tự 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 biệt:

  • Bạn có thể thêm các quyền mới vào nhóm hiện tại nhưng bạn không thể sửa đổi ánh xạ AOSP của các quyền nguy hiểm và các nhóm quyền nguy hiểm. (Nói cách khác, bạn không thể xóa quyền khỏi nhóm và gán cho 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 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 trong bảng kê khai nền tảng.

Kiểm tra quyền

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

Thu hồi quyền

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

Điều quan trọng là phải hiểu rằng việc thu hồi một quyền có thể không được phản ánh trong giao diện người dùng cài đặt vốn xử lý các quyền theo nhóm. Thông thường, một nhóm quyền sẽ được hiển thị dưới dạng được cấp miễn là ít nhất một trong các quyền trong nhóm đó được cấp. Nếu việc đảm bảo rằng người dùng có thể xác nhận việc thu hồi trong cài đặt là quan trọng đối với bạn, hãy đảm bảo thu hồi mọi quyền trong nhóm quyền. Để tìm hiểu những 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 hệ thống thu hồi các quyền được yêu cầu, hệ thống cũng thu hồi các quyền nền tương ứng nếu không có quyền nền trước tương ứng nào của chúng vẫn được cấp.

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ũng có thể đượ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, chẳng hạn như sử dụng System.exit() . Tuy nhiên, nên để hệ thống quyết định thời điểm kích hoạt nó.

Sau khi việc 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 sẽ được nhắc cấp hoặc từ chối yêu cầu. Không thể yêu cầu quyền mà trước đó người dùng đã từ chối. Mặc dù bạn được khuyến khích thu hồi các quyền mà bạn hiện đang nắm giữ nhưng không còn cần thiết nữa, nhưng bạn nên cẩn thận không thông báo cho người dùng về việc thu hồi cho đến khi việc thu hồi đó có hiệu lực.