應用程式權限最佳做法

Stay organized with collections Save and categorize content based on your preferences.

權限要求可保護裝置提供的機密資訊,因此只有在應用程式必須存取這類資訊來維持運作時才能使用。本文件提示了幾種方法,讓您不需要求這類資訊,就能夠執行相同 (或更優質的) 功能;此處並未完整探討 Android 作業系統中的權限運作方式。

如需查看有關 Android 權限的一般資訊,請參閱權限總覽一文。如要進一步瞭解如何透過程式碼與權限搭配運作,請參閱要求應用程式權限一文。

Android 6.0 以上版本的權限

在 Android 6.0 (API 級別 23) 以上版本中,應用程式可以在執行階段 (而非在安裝前) 向使用者要求權限。這樣一來,應用程式就能在確實需要相關服務或由該服務保護的資料時要求權限。儘管這項做法不一定會改變應用程式的整體行為,不過確實會造成一些與使用者機密資料處理方式相關的變動:

增加情境式的內容

當使用者要存取相關權限群組涵蓋的功能時,請在執行階段中依據應用程式的使用情境提示使用者授予權限。使用者對於要求取得權限時的使用情境更為敏感,因此如果您要求的權限與應用程式的用途不符,就更應該向使用者詳細說明您要求權限的原因。在要求權限時,以及在使用者拒絕要求後顯示的對話方塊中,請盡可能提供相關說明。

如要提高使用者接受權限要求的可能性,建議您只在需要執行特定功能時才提出要求。舉例來說,只有當使用者點選麥克風按鈕時,才提示要求麥克風存取權。使用者在預期行使特定權限時,更有可能允許授予權限。

權限授予更具彈性

使用者可在系統提出要求時「以及」在設定中拒絕個別權限,但對於因此而導致功能異常中斷的情況,仍可能感到不知所措。建議您監控拒絕授予權限的使用者人數 (例如使用 Google Analytics (分析)),以便據此重構出不依賴該權限的應用程式,或是提供更詳盡的說明,讓使用者瞭解為何必須授予權限才能讓應用程式順利運作。此外,當使用者拒絕權限要求或在設定中關閉權限時,您必須確保應用程式能夠處理例外狀況。

增加事務性負擔

系統會要求使用者逐一授予多個權限群組的權限,而不是一次授予所有權限群組的權限。這樣一來,盡量減少要求的權限數量就變得極為重要。這麼做會增加使用者的授權負擔,進而提高至少有一項要求遭拒的可能性。

需要成為預設處理常式的權限

部分應用程式需要存取通話記錄和簡訊相關的使用者機密資訊。如果想要求通話記錄和簡訊的特定權限,並將應用程式發布至 Play 商店,您必須先提示使用者將應用程式設為特定核心系統函式的「預設處理常式」,才能要求這些執行階段權限。

如要進一步瞭解預設處理常式,包括說明如何向使用者顯示預設處理常式提示的規範,請參閱僅供預設處理常式使用的權限指南。

瞭解搭配運作的資料庫

您在應用程式中使用的資料庫有時會需要權限。舉例來說,廣告和數據分析資料庫可能需要 LOCATION 權限群組的存取權,才能執行所需功能。但從使用者的觀點來看,權限要求是來自您的應用程式,而非資料庫。

如同使用者會選擇針對相同功能使用較少權限的應用程式,開發人員也應檢查自己的程式庫,並選擇不會使用非必要權限的第三方 SDK。舉例來說,假設您使用的程式庫提供位置資訊功能,請確認您並未要求 FINE_LOCATION 權限 (除非您要使用指定地區功能)。

限制位置資訊的背景存取權

應用程式在背景執行時,位置資訊的存取權必須攸關應用程式的核心功能,且能明確展現對使用者的好處。

測試兩種權限模型

在 Android 6.0 (API 級別 23) 以上版本中,使用者會在執行階段授予及撤銷應用程式權限,而不是在安裝應用程式時進行。因此,您必須在更廣泛的條件下測試應用程式。在 Android 6.0 以下版本中,您可以合理假設,當應用程式完整執行時,即代表該應用程式具備其資訊清單中所宣告的所有權限。而現在,無論 API 級別為何,使用者都能針對「任何」應用程式開啟或關閉權限。建議您進行測試,以確保應用程式在各種權限情境中都能正確運作。

下列提示有助於在搭載 API 級別 23 以上版本的裝置上,找出權限相關的程式碼問題:

  • 找出應用程式現有的權限和相關程式碼路徑。
  • 針對所有受權限保護的服務和資料,測試使用者流程。
  • 在授予或撤銷權限的各種組合情況下進行測試。舉例來說,某個相機應用程式的資訊清單可能會列出 CAMERAREAD_CONTACTSACCESS_FINE_LOCATION。您應分別在這些權限開啟及關閉的情況下測試應用程式,以確保應用程式能夠妥善處理所有權限設定。
  • 使用 adb 工具,透過指令列管理權限:
    • 依群組列出權限和狀態:
      $ adb shell pm list permissions -d -g
    • 授予或撤銷一或多項權限:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • 針對會使用權限的服務進行應用程式分析。

其他資源