Các phương pháp hay nhất về quyền cho ứng dụng

Các yêu cầu quyền bảo vệ thông tin nhạy cảm có sẵn trên một thiết bị và chỉ nên dùng khi ứng dụng cần quyền truy cập vào thông tin để có thể hoạt động. Tài liệu này cung cấp các bí quyết để giúp bạn đạt được chức năng tương tự (hoặc tốt hơn) mà không cần phải truy cập vào các thông tin đó. Đây không phải là một phần thảo luận toàn diện về cách hoạt động của quyền trong hệ điều hành Android.

Để biết thêm thông tin chung về quyền trong Android, vui lòng xem nội dung Tổng quan về quyền. Để biết thông tin chi tiết về cách làm việc với quyền trong mã của bạn, xem nội dung Yêu cầu cấp quyền cho ứng dụng.

Quyền trong Android 6.0 trở lên

Trong Android 6.0 (API cấp 23) trở lên, ứng dụng có thể yêu cầu người dùng cấp quyền trong thời gian chạy, thay vì trước khi cài đặt. Điều này cho phép ứng dụng yêu cầu được cấp quyền khi ứng dụng thực sự đòi hỏi dịch vụ hoặc dữ liệu được dịch vụ bảo vệ. Trong khi việc này không (nhất thiết) thay đổi hành vi tổng thể của ứng dụng, nhưng nó sẽ tạo ra một vài thay đổi liên quan đến cách xử lý dữ liệu nhạy cảm của người dùng:

Bối cảnh tình huống gia tăng

Trong bối cảnh của ứng dụng, người dùng được nhắc để cấp quyền truy cập vào chức năng thuộc các nhóm quyền đó trong thời gian chạy. Người dùng nhạy cảm hơn với bối cảnh khi có yêu cầu cấp quyền và nếu có sự không khớp giữa những gì bạn đang yêu cầu và mục đích của ứng dụng, thậm chí điều quan trọng hơn là phải giải thích chi tiết cho người dùng về lý do tại sao bạn yêu cầu quyền đó. Mỗi khi có thể, bạn nên giải thích về yêu cầu của mình tại thời điểm yêu cầu lẫn trong hộp thoại tiếp theo nếu người dùng từ chối yêu cầu.

Để tăng khả năng yêu cầu cấp quyền được chấp nhận, hãy chỉ nhắc khi cần có một tính năng cụ thể. Ví dụ: chỉ nhắc cấp quyền truy cập vào micrô khi người dùng nhấp vào nút micrô. Nhiều khả năng người dùng cấp quyền cho điều họ đang mong đợi.

Linh hoạt hơn trong việc cấp quyền

Người dùng có thể từ chối cấp quyền truy cập riêng lẻ vào thời điểm quyền được yêu cầu đang trong phần cài đặt. Tuy nhiên, họ vẫn thấy bất ngờ khi chức năng không hoạt động do không được cấp quyền. Bạn nên theo dõi số lượng người dùng đang từ chối quyền (ví dụ như sử dụng Google Analytics) để có thể tái cấu trúc ứng dụng nhằm tránh phụ thuộc vào quyền đó, hoặc giải thích rõ hơn lý do bạn cần đến quyền để ứng dụng hoạt động đúng cách. Bạn cũng nên đảm bảo rằng ứng dụng xử lý các trường hợp ngoại lệ khi người dùng từ chối yêu cầu cấp quyền hoặc tắt quyền trong chế độ cài đặt.

Tăng gánh nặng giao dịch

Người dùng được yêu cầu cấp quyền truy cập cho từng nhóm quyền chứ không phải như một tập hợp nào đó. Điều này cực kỳ quan trọng để giảm thiểu số lượng quyền mà bạn yêu cầu. Điều này làm tăng gánh nặng cấp quyền cho người dùng và do đó làm tăng xác suất để ít nhất một trong các yêu cầu bị từ chối.

Các quyền yêu cầu trở thành trình xử lý mặc định

Một số ứng dụng phụ thuộc vào quyền truy cập vào thông tin người dùng nhạy cảm liên quan đến nhật ký cuộc gọi và tin nhắn SMS. Nếu muốn yêu cầu cấp quyền cụ thể với nhật ký cuộc gọi và tin nhắn SMS cũng như xuất bản ứng dụng lên Cửa hàng Play, thì bạn phải nhắc người dùng đặt ứng dụng làm trình xử lý mặc định cho một hàm hệ thống cốt lõi trước khi yêu cầu quyền khi bắt đầu chạy này.

Để biết thêm thông tin về trình xử lý mặc định, bao gồm cả hướng dẫn về hiển thị lời nhắc trình xử lý mặc định cho người dùng, xem hướng dẫn về các quyền chỉ được sử dụng trong trình xử lý mặc định.

Biết rõ những thư viện bạn đang dùng đến

Đôi khi, thư viện mà bạn sử dụng trong ứng dụng yêu cầu cấp quyền. Ví dụ: quảng cáo và thư viện phân tích có thể đòi hỏi quyền truy cập vào nhóm quyền LOCATION để triển khai chức năng được yêu cầu. Tuy nhiên, theo quan điểm của người dùng, yêu cầu cấp quyền đến từ ứng dụng của bạn chứ không phải từ thư viện.

Cũng giống như người dùng chọn những ứng dụng sử dụng ít quyền hơn cho cùng một chức năng, nhà phát triển nên rà soát thư viện của họ và chọn các SDK của bên thứ ba mà không sử dụng các quyền không cần thiết. Ví dụ: nếu bạn đang sử dụng một thư viện cung cấp chức năng vị trí, đảm bảo bạn không yêu cầu quyền FINE_LOCATION trừ khi đang sử dụng chức năng nhắm mục tiêu dựa trên vị trí.

Giới hạn quyền truy cập trong chế độ nền vào tính năng vị trí

Khi ứng dụng của bạn đang chạy trong chế độ nền, quyền truy cập vào vị trí phải quan trọng với chức năng cốt lõi của ứng dụng và cho thấy lợi ích rõ ràng với người dùng.

Kiểm thử cả hai mô hình cấp quyền

Trên Android 6.0 (cấp API 23) trở lên, người dùng có thể cấp và thu hồi quyền cho ứng dụng tại thời điểm chạy, thay vì làm như vậy khi cài đặt ứng dụng. Vì vậy, bạn sẽ phải kiểm thử ứng dụng của mình trong nhiều điều kiện hơn. Trước Android 6.0, bạn có thể hợp lý giả định rằng nếu ứng dụng đang chạy, thì ứng dụng có tất cả các quyền đã được ứng dụng khai báo trong tệp kê khai ứng dụng. Giờ đây, người dùng có thể bật hoặc tắt quyền cho mọi ứng dụng, bất kể cấp độ API là như thế nào. Bạn nên kiểm thử để đảm bảo chức năng của ứng dụng hoạt động thông suốt trên nhiều trường hợp cấp quyền.

Các bí quyết sau đây sẽ giúp bạn phát hiện các vấn đề về mã liên quan đến quyền trên thiết bị chạy API cấp 23 trở lên:

  • Xác định quyền hiện tại của ứng dụng và đường dẫn mã liên quan.
  • Kiểm thử luồng người dùng trên dịch vụ và dữ liệu có quyền được bảo vệ.
  • Kiểm thử qua nhiều cách kết hợp về các quyền đã cấp hoặc bị thu hồi. Ví dụ: một ứng dụng máy ảnh có thể liệt kê CAMERA, READ_CONTACTSACCESS_FINE_LOCATION trong tệp kê khai. Bạn nên kiểm thử ứng dụng với từng quyền được bật và tắt để đảm bảo ứng dụng có thể xử lý tất cả các cấu hình quyền một cách tốt đẹp.
  • Sử dụng công cụ adb để quản lý quyền từ dòng lệnh:
    • Liệt kê quyền và trạng thái theo nhóm:
      $ adb shell pm list permissions -d -g
    • Cấp hoặc thu hồi một hoặc nhiều quyền:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • Phân tích ứng dụng về các dịch vụ sử dụng quyền.

Tài nguyên khác