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

Trong Android 6.0 trở lên, mô hình quyền của ứng dụng Android được thiết kế để giúp người dùng hiểu rõ, sử dụng hiệu quả và an toàn hơn các quyền. Mô hình này đã di chuyển các ứng dụng Android yêu cầu quyền có mức độ bảo vệ nguy hiểm (xem Các quyền bị ảnh hưởng) từ mô hình quyền thời gian cài đặt sang mô hình 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 quyền nguy hiểm cho một ứ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à mạng có thể cài đặt trước 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 khi bắt đầu chạy

    (Android 6.0 đến 9) Người dùng cấp quyền nguy hiểm cho một ứng dụng khi ứng dụng đang chạy. Thời điểm 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 cụ thể) phụ thuộc vào ứng dụng, nhưng người dùng sẽ 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ể. Nhà sản xuất thiết bị gốc (OEM)/nhà mạng có thể cài đặt trước ứng dụng, nhưng không thể cấp trước quyền trừ phi họ thực hiện quy trình ngoại lệ. (Xem phần Tạo ngoại lệ.)

    (Android 10) Người dùng thấy được tính minh bạch cao hơn và có quyền kiểm soát những ứng dụng có quyền khi bắt đầu chạy tính năng nhận dạng hoạt động (AR). Hộp thoại cấp quyền trong thời gian chạy sẽ nhắc người dùng 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 cấp cho ứng dụng sẽ được giữ lại, nhưng người dùng có thể chuyển đến phần Cài đặt để thay đổi các quyền đó.

Quyền khi bắt đầu chạy ngăn ứng dụng truy cập vào dữ liệu riêng tư khi chưa có sự đồng ý của người dùng, đồng thời cung cấp cho họ thêm thông tin về ngữ cảnh và khả năng hiển thị các loại quyền mà ứng dụng đang yêu cầu hoặc đã được cấp. Mô hình thời gian chạy khuyến khích 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 đã 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 sáng suốt hơn về việc cấp hoặc từ chối các quyền đó.

Các 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 khi bắt đầu chạy. Quyền có mức độ bảo vệ 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 cho ứ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ị, có thể ảnh hưở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 sau:

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 quyền thông thường, quyền hệ thống và quyền chữ ký. 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 riêng biệt ở cấp ứng dụng mà chỉ gây ra rủi ro ở mức 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 các bản phát hành Android 5.1 trở xuống, 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 thời điểm cài đặt và không nhắc người dùng phê duyệt. Để biết thông tin chi tiết về quyền, hãy xem tài liệu về phần tử<permission>.

Các quy định hạn chế cứng và mềm trong Android 10

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

  • (Hạn chế nghiêm ngặt) Không thể cấp cho ứng dụng các quyền không có 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 ứ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 cho ứng dụng. Các quyền do nền tảng hạn chế và chỉ được cấp nếu ứng dụng đáp ứng các tiêu chí đặc biệt theo chính sách của nền tảng. Ví dụ về các loại quyền bị hạn chế nghiêm ngặt bao gồm quyền truy cập vào SMS và Nhật ký cuộc gọi.

Việc thêm 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 từ Android 9 lên 10.
  • một quyền được cấp trước hoặc một ứng dụng được cài đặt sẵn.
  • một vai trò đã được xác định cần có quyền để đư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 này là được 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 quyền khi bắt đầu chạy áp dụng cho tất 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 đến thiết bị trong quá trình thiết lập. Các yêu cầu về phần mềm ứng dụng bao gồm:

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

Tích hợp

Khi tích hợp mô hình 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 sẵn để hoạt động với mô hình mới. Bạn cũng có thể xác định các trường hợp 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 quyền tuỳ chỉnh và tuỳ chỉnh giao diện đượ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à ứng dụng được cài đặt trước không tự động được cấp trước quyền. Bạn nê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à mạng và bên thứ ba) để thực hiện các sửa đổi ứng dụng bắt buộc theo 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 cài đặt sẵn được sửa đổi để tránh sự cố và các vấn đề khác khi người dùng thu hồi quyền.

Ứng dụng tải sẵn

Trên Android 9 trở xuống, các ứng dụng tải trước sử dụng 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 AOSP 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 cách triển khai PermissionController của AOSP. 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.

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, bắt đầu từ phiên bản 10, quy trình 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 ứng dụng 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ể trực tiếp yêu cầu cấp quyền.

  • Trên Android 5.1 trở xuống, các ứng dụng không có giao diện người dùng có thể yêu cầu cấp quyền khi được cài đặt hoặc nếu được cài đặt sẵn mà không sử dụng hoạt động.
  • 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 thức sau để yêu cầu 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. Chỉ sử dụng phương thức 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 duy nhất.

Mục tiêu là tránh gây nhầm lẫn cho người dùng bằng các yêu cầu cấp quyền xuất hiện ngoài ngữ 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 của giao diện người dùng Quyền bằng cách cập nhật giao diện thiết bị mặc định (Theme.DeviceDefault.SettingsTheme.DeviceDefault.Light.Dialog.NoActionBar) mà PackageInstaller sử dụng. Tuy nhiên, vì tính nhất quán là yếu tố quan trọng đối với nhà phát triển ứng dụng, nên bạn không thể tuỳ chỉnh vị trí, vị trí và quy tắc về thời điểm giao diện người dùng Quyền xuất hiện.

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

Tạo trường hợp 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 trình cung cấp mặc định cho 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 các quyền và nhóm tuỳ 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à mạng vào các nhóm quyền hiện có, giống như 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, quyền đó phải được xử lý 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 các quyền mới vào một nhóm hiện tại, nhưng không thể sửa đổi ánh xạ AOSP của 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 một 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 không thể thêm các nhóm quyền mới trong 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 rằng các quyền riêng lẻ được liên kết với đúng nhóm. Việc vượt qua các bài kiểm thử này là yêu cầu để đảm bảo khả năng tương thích với CTS của Android 6.0 trở lên.

Thu hồi quyền

Trong Android 13 trở lên, bạn có thể thu hồi các quyền khi bắt đầu chạy mà mình đã cấp 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 có thể thực hiện một cách an toàn mà không làm gián đoạn người dùng. Khi quá trình 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ị huỷ.

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 giao diện người dùng cài đặt, nơi xử lý các quyền theo nhóm. Thông thường, một nhóm quyền sẽ 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 bạn muốn đảm bảo rằng người dùng có thể xác nhận việc thu hồi trong phần cài đặt, hãy nhớ thu hồi mọi quyền trong nhóm quyền. Để tìm hiểu 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 các quyền tương ứng ở chế độ nền nếu không có quyền tương ứng nào ở chế độ nền trước đượ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 tất cả các quy trình đang chạy trong uid hiện tại theo cách thủ công, chẳng hạn như 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.

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à người dùng đã từ chối trước đó. Mặc dù bạn nên thu hồi các quyền mà bạn hiện đang giữ nhưng không còn cần 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.