3.2权限信息扫描

文章目录
  1. 1. 检测方法
  2. 2. 1 权限简介
    1. 2.1. 运行时请求(Android 6.0及更高版本)
    2. 2.2. 安装时请求(Android 5.1.1及更低版本)
  3. 3. 2 权限的详细清单
    1. 3.1. 特别注意
    2. 3.2. 所有的权限列表清单
  4. 4. 3 权限组
    1. 4.0.1. 对permission-group、permission、uses-permission三者的理解
    2. 4.0.2. 关于危险权限的权限组
    3. 4.0.3. 权限组列表
  • 5. 4 Google官方文档链接
  • 检测方法

    只需提取出所有标签中的android:name属性的值即可,主要采用正则表达式来提取。

    uses-permission标签

    1 权限简介

    Android构建权限体系的目的是保护Android用户的隐私。当Android应用请求访问敏感用户数据(如联系人和短信)的权限,以及某些系统功能(如相机和互联网)时,必须获得权限许可。根据功能的不同,系统可能会自动授予权限,也可能会提示用户批准请求。

    Android安全体系结构的核心设计点是,默认情况下,任何应用程序都无权执行任何会对其他应用程序,操作系统或用户产生负面影响的操作。这包括读取或写入用户的私人数据(如联系人或电子邮件),读取或写入其他应用程序的文件,执行网络访问,保持设备唤醒等等。

    应用必须通过 <uses-permission>标签在AndroidManifest中说明其所需的权限 。例如,需要发送SMS消息的应用程序需要包含以下行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <manifest 
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.snazzyapp">

    <uses-permission android:name="android.permission.SEND_SMS"/>

    <application ...>
    ...
    </application>
    </manifest>

    这是一个AndroidManifest.xml文件的例子,可以看到它申请了八个权限:

    权限说明

    如果您的应用在其清单中列出了正常权限(即不会对用户的隐私或设备操作造成太大风险的权限),系统会自动将这些权限授予您的应用。

    如果您的应用在其清单中列出了危险权限(即可能影响用户隐私或设备正常运行的SEND_SMS权限),例如上述权限,则用户必须明确同意授予这些权限。

    有关正常和危险权限的详细信息,请参阅第二节:权限的详细清单的内容。

    只有危险权限才需要用户同意。Android要求用户授予危险权限的方式取决于用户设备上运行的Android版本以及应用程序定位的系统版本。

    运行时请求(Android 6.0及更高版本)

    如果设备运行的是Android 6.0(API级别23)或更高版本, 并且应用程序的数量targetSdkVersion 为23或更高,则在安装时不会通知用户任何应用程序权限。您的应用必须要求用户在运行时授予危险权限。当您的应用请求权限时,用户会看到一个系统对话框(如图1左侧所示),告诉用户您的应用尝试访问哪个权限组。该对话框包括拒绝和允许按钮。

    如果用户拒绝权限请求,则下次应用请求权限时,该对话框包含一个复选框,选中该复选框后,表示不希望再次提示用户获得权限(参见图1,右)。

    运行时请求

    图1.初始权限对话框(左)和次要权限请求以及关闭进一步请求的选项(右)

    如果用户选中“ 永不再询问”框并点击 “拒绝”,则系统不再提示用户以后是否尝试请求相同的权限。

    即使用户授予您的应用程序所请求的权限,您也不能总是依赖它。用户还可以选择在系统设置中逐个启用和禁用权限。您应该始终在运行时检查并请求权限以防止运行时错误(SecurityException)。

    有关如何处理运行时权限请求的详细信息,请参阅 请求应用程序权限。

    安装时请求(Android 5.1.1及更低版本)

    如果设备运行Android 5.1.1(API级别22)或更低版本,或者targetSdkVersion 在任何版本的Android上运行时 应用程序为22或更低,系统会自动要求用户在安装时为您的应用授予所有危险权限(见图2)。

    安装时请求

    图2.安装时权限对话框

    如果用户单击“ 接受”,则授予应用程序请求的所有权限。如果用户拒绝权限请求,系统将取消应用程序的安装。

    如果应用更新包含对其他权限的需求,则会在更新应用之前提示用户接受这些新权限。

    2 权限的详细清单

    Android的权限体系,一般是分为四种保护等级:正常、危险、签名和签名|特权,但是根据实际情况,还需要再附加两种情况:不允许被第三方应用使用、已启用

    保护等级 英文表示 英文简写 含义
    正常 normal N 默认值。风险较低的权限,允许请求应用程序访问隔离的应用程序级功能,对其他应用程序,系统或用户的风险最小。系统会在安装时自动向请求的应用程序授予此类权限,而不会要求用户明确批准(尽管用户始终可以选择在安装之前查看这些权限)。
    危险 dangerous D 一种风险较高的权限,可以使请求的应用程序访问私有用户数据或控制可能对用户产生负面影响的设备。由于此类权限会引入潜在风险,因此系统可能不会自动将其授予请求的应用程序。例如,应用程序请求的任何危险许可可以显示给用户并且在继续之前需要确认,或者可以采取一些其他方法以避免用户自动允许使用这些设施。
    签名 signature S 仅当请求的应用程序使用与声明权限的应用程序相同的证书进行签名时系统授予的权限。如果证书匹配,系统会自动授予权限,而不通知用户或要求用户明确批准。
    签名/特权 signature/privileged S/P 在API级别23后推荐使用”signatureOrSystem”表示。</br>系统仅授予Android系统映像上专用文件夹中的应用程序使用与声明权限的应用程序相同的证书进行签名的权限。应避免使用此选项,因为signature 保护级别应该足以满足大多数需求,并且无论应用程序的确切安装位置如何都能正常工作。“ signatureOrSystem”权限用于某些特殊情况,其中多个供应商将应用程序内置到系统映像中,并且需要明确共享特定功能,因为它们是一起构建的。

    再附加两种情况:

    情况 英文表示 英文简写
    不允许被第三方应用使用 Not for Use by third-party applications NU
    已弃用 out O

    特别注意

    这里有必要提及一下第三方应用的概念,Android系统自带的应用以外的,也就是我们开发者开发的Android应用,比如QQ、微博、微信、今日头条、抖音和王者荣耀等等,都是第三方应用,这些应用都是不能拥有NU标注的权限的。

    对于带有已弃用标注的权限,有以下三种情况

    1. 从API级别高于某一值废弃。低于这个数值申请该权限属于正常,但是高于这个数值,再申请肯定是错误的,因为此权限被弃用。我们使用O-xxx来表示从API级别xxx以后废弃该权限。比如O-23表示从API Level为23以后弃用该权限。
    2. 该权限被某一权限替代。比如BIND_CARRIER_MESSAGING_SERVICE被BIND_CARRIER_SERVICES取代。
    3. 该权限被永久废弃。我们用O-all来表示。

    所有的权限列表清单

    类型 权限字符串 安全等级
    String ACCEPT_HANDOVER </br>允许呼叫应用继续在另一个应用中启动的呼叫。 D
    String ACCESS_CHECKIN_PROPERTIES </br>允许对签入数据库中的“属性”表进行读/写访问,以更改上载的值。 NU
    String ACCESS_COARSE_LOCATION </br>允许应用访问大致位置。 D
    String ACCESS_FINE_LOCATION </br>允许应用访问精确位置。 D
    String ACCESS_LOCATION_EXTRA_COMMANDS </br>允许应用程序访问额外的位置提供程序命令。 N
    String ACCESS_NETWORK_STATE </br>允许应用程序访问有关网络的信息。 N
    String ACCESS_NOTIFICATION_POLICY </br>对希望访问通知政策的应用程序的标记权限。 N
    String ACCESS_WIFI_STATE </br>允许应用程序访问有关Wi-Fi网络的信息。 N
    String ACCOUNT_MANAGER </br>允许应用程序调用AccountAuthenticators。 NU
    String ADD_VOICEMAIL </br>允许应用程序将语音邮件添加到系统中。 D
    String ANSWER_PHONE_CALLS </br>允许该应用接听来电。 D
    String BATTERY_STATS </br>允许应用程序收集电池统计信息 N
    String BIND_ACCESSIBILITY_SERVICE </br>必须由AccessibilityService调用,以确保只有系统可以绑定它。 S
    String BIND_APPWIDGET </br>允许应用程序告诉AppWidget服务哪个应用程序可以访问AppWidget的数据。 NU
    String BIND_AUTOFILL_SERVICE </br>必须由a来要求AutofillService,以确保只有系统可以绑定它。 S
    String BIND_CARRIER_MESSAGING_SERVICE </br>此常量在API级别23中已弃用。请改为BIND_CARRIER_SERVICES使用 S/P(O-23)
    String BIND_CARRIER_SERVICES </br>允许绑定到运营商应用程序中的服务的系统进程将具有此权限。 S/P
    String BIND_CHOOSER_TARGET_SERVICE </br>必须由ChooserTargetService调用,以确保只有系统可以绑定它。 S
    String BIND_CONDITION_PROVIDER_SERVICE </br>必须由ConditionProviderService调用,以确保只有系统可以绑定它。 S
    String BIND_DEVICE_ADMIN </br>必须由设备管理接收器要求,以确保只有系统可以与之交互。 S
    String BIND_DREAM_SERVICE </br>必须由DreamService调用,以确保只有系统可以绑定它。 S
    String BIND_INCALL_SERVICE </br>必须由InCallService调用,以确保只有系统可以绑定它。 S/P
    String BIND_INPUT_METHOD </br>必须由InputMethodService调用,以确保只有系统可以绑定它。 S
    String BIND_MIDI_DEVICE_SERVICE </br>必须由MidiDeviceService调用,以确保只有系统可以绑定它。 S
    String BIND_NFC_SERVICE </br>必须由HostApduService或OffHostApduService调用,确保只有系统可以绑定它。 S
    String BIND_NOTIFICATION_LISTENER_SERVICE </br>必须由NotificationListenerService调用,以确保只有系统可以绑定它。 S
    String BIND_PRINT_SERVICE </br>必须由PrintService调用,以确保只有系统可以绑定它。 S
    String BIND_QUICK_SETTINGS_TILE </br>允许应用程序绑定到第三方快速设置磁贴,只能由系统申请,并且附加TileService的声明 S/P
    String BIND_REMOTEVIEWS </br>必须由RemoteViewsService调用,以确保只有系统可以绑定它。 S/P
    String BIND_SCREENING_SERVICE </br>必须由CallScreeningService调用,以确保只有系统可以绑定它。 S/P
    String BIND_TELECOM_CONNECTION_SERVICE </br>必须由ConnectionService调用,以确保只有系统可以绑定它。 S/P
    String BIND_TEXT_SERVICE </br>必须由TextService要求(例如 S
    String BIND_TV_INPUT </br>必须由TvInputService调用,确保只有系统可以绑定它。 S/P
    String BIND_VISUAL_VOICEMAIL_SERVICE </br>必须通过链接VisualVoicemailService来确保只有系统可以绑定它。 S/P
    String BIND_VOICE_INTERACTION </br>必须由VoiceInteractionService调用,以确保只有系统可以绑定它。 S
    String BIND_VPN_SERVICE </br>必须由VpnService调用,以确保只有系统可以绑定它。 S
    String BIND_VR_LISTENER_SERVICE </br>必须由VrListenerService调用,以确保只有系统可以绑定它。 S
    String BIND_WALLPAPER </br>必须由WallpaperService调用,以确保只有系统可以绑定它。 S/P
    String BLUETOOTH </br>允许应用程序连接到配对的蓝牙设备。 N
    String BLUETOOTH_ADMIN </br>允许应用程序发现并配对蓝牙设备。 N
    String BLUETOOTH_PRIVILEGED </br>允许应用程序在没有用户交互的情况下配对蓝牙设备,并允许或禁止电话簿访问或消息访问。 NU
    String BODY_SENSORS </br>允许应用程序访问用户用来测量身体内部情况的传感器数据,例如心率。 D
    String BROADCAST_PACKAGE_REMOVED </br>允许应用程序广播已删除应用程序包的通知。 NU
    String BROADCAST_SMS </br>允许应用程序广播SMS收据通知。 NU
    String BROADCAST_STICKY </br>允许应用程序广播粘性意图。 N
    String BROADCAST_WAP_PUSH </br>允许应用程序广播WAP PUSH收据通知。 NU
    String CALL_PHONE </br>允许应用程序在不通过拨号器用户界面的情况下发起电话呼叫,以便用户确认呼叫。 D
    String CALL_PRIVILEGED </br>允许应用程序拨打任何电话号码(包括紧急号码),而无需通过拨号器用户界面以便用户确认正在拨打的电话。 NU
    String CAMERA </br>需要能够访问相机设备。 D
    String CAPTURE_AUDIO_OUTPUT </br>允许应用程序捕获音频输出。 NU
    String CAPTURE_SECURE_VIDEO_OUTPUT </br>允许应用程序捕获安全视频输出。 NU
    String CAPTURE_VIDEO_OUTPUT </br>允许应用程序捕获视频输出。 NU
    String CHANGE_COMPONENT_ENABLED_STATE </br>允许应用程序更改是否启用了应用程序组件(除了它自己的组件)。 NU
    String CHANGE_CONFIGURATION </br>允许应用程序修改当前配置,例如区域设置。 N
    String CHANGE_NETWORK_STATE </br>允许应用程序更改网络连接状态。 N
    String CHANGE_WIFI_MULTICAST_STATE </br>允许应用程序进入Wi-Fi多播模式。 N
    String CHANGE_WIFI_STATE </br>允许应用程序更改Wi-Fi连接状态。 N
    String CLEAR_APP_CACHE </br>允许应用程序清除设备上所有已安装应用程序的缓存。 S/P
    String CONTROL_LOCATION_UPDATES </br>允许从收音机启用/禁用位置更新通知。 NU
    String DELETE_CACHE_FILES </br>允许应用程序删除缓存文件,这是旧的权限,不再使用,但是我们可以简单地忽略它而不调用它,而不是抛出异常的信号。 N
    String DELETE_PACKAGES </br>允许应用程序删除包。 NU
    String DIAGNOSTIC </br>允许应用程序将RW转换为诊断资源。 NU
    String DISABLE_KEYGUARD </br>允许应用程序在密钥保护不安全时禁用它。 N
    String DUMP </br>允许应用程序从系统服务检索状态转储信息。 NU
    String EXPAND_STATUS_BAR </br>允许应用程序展开或折叠状态栏。 N
    String FACTORY_TEST </br>作为制造商测试应用程序运行,以root用户身份运行。 NU
    String FOREGROUND_SERVICE </br>允许常规应用程序使用Service.startForeground。 N
    String GET_ACCOUNTS </br>允许访问帐户服务中的帐户列表。 D
    String GET_ACCOUNTS_PRIVILEGED </br>允许访问帐户服务中的帐户列表。 N
    String GET_PACKAGE_SIZE </br>允许应用程序查找任何包使用的空间。 N
    String GET_TASKS </br>此常量在API级别21中已弃用。不再强制执行。 N/O-21
    String GLOBAL_SEARCH </br>此权限可用于内容提供商,以允许全局搜索系统访问其数据。 S/P
    String INSTALL_LOCATION_PROVIDER </br>允许应用程序将位置提供程序安装到位置管理器中。 NU
    String INSTALL_PACKAGES </br>允许应用程序安装包。 NU
    String INSTALL_SHORTCUT </br>允许应用程序在Launcher中安装快捷方式。 N
    String INSTANT_APP_FOREGROUND_SERVICE </br>允许即时应用创建前台服务。 N
    String INTERNET </br>允许应用程序打开网络套接字。 N
    String KILL_BACKGROUND_PROCESSES </br>允许应用程序调用 ActivityManager.killBackgroundProcesses(String)。 N
    String LOCATION_HARDWARE 允许应用程序在硬件中使用位置功能,例如geofencing api。 NU
    String MANAGE_DOCUMENTS </br>允许应用程序管理对文档的访问,通常作为文档选择器的一部分。 S
    String MANAGE_OWN_CALLS </br>允许通过自我管理的ConnectionServiceAPI 管理自己的调用的调用应用程序 。 N
    String MASTER_CLEAR </br>不适用于第三方应用程序。 NU
    String MEDIA_CONTENT_CONTROL </br>允许应用程序知道正在播放的内容并控制其播放。 NU
    String MODIFY_AUDIO_SETTINGS </br>允许应用程序修改全局音频设置。 N
    String MODIFY_PHONE_STATE </br>允许修改电话状态 - 开机,mmi等 NU
    String MOUNT_FORMAT_FILESYSTEMS </br>允许格式化可移动存储的文件系统。 NU
    String MOUNT_UNMOUNT_FILESYSTEMS </br>允许安装和卸载文件系统以进行可移动存储。 NU
    String NFC </br>允许应用程序通过NFC执行I / O操作。 N
    String NFC_TRANSACTION_EVENT </br>允许应用程序接收NFC交易事件。 N
    String PACKAGE_USAGE_STATS </br>允许应用程序收集组件使用情况统计信息,声明权限意味着使用API​​的意图,设备用户可以通过“设置”应用程序授予权限。 D
    String PERSISTENT_ACTIVITY </br>此常量在API级别9中已弃用。此功能将在以后删除; 请不要使用。允许应用程序使其活动持久。 O-all
    String PROCESS_OUTGOING_CALLS </br>允许应用程序查看拨出呼叫期间拨打的号码,并选择将呼叫重定向到其他号码或完全中止呼叫。 D
    String READ_CALENDAR </br>允许应用程序读取用户的日历数据。 D
    String READ_CALL_LOG </br>允许应用程序读取用户的通话记录。 D
    String READ_CONTACTS </br>允许应用程序读取用户的联系人数据。 D
    String READ_EXTERNAL_STORAGE </br>允许应用程序从外部存储读取。 D
    String READ_FRAME_BUFFER </br>允许应用程序进行屏幕截图,更一般地,可以访问帧缓冲区数据。 NU
    String READ_INPUT_STATE </br>此常量在API级别16中已弃用。已删除使用此权限的API。 NU/O-16
    String READ_LOGS </br>允许应用程序读取低级系统日志文件。 NU
    String READ_PHONE_NUMBERS </br>允许读取设备的电话号码。 D
    String READ_PHONE_STATE </br>允许只读访问电话状态,包括设备的电话号码,当前的蜂窝网络信息,任何正在进行的呼叫的状态以及PhoneAccount在设备上注册的任何s 的列表 。 D
    String READ_SMS </br>允许应用程序读取SMS消息。 D
    String READ_SYNC_SETTINGS </br>允许应用程序读取同步设置。 N
    String READ_SYNC_STATS </br>允许应用程序读取同步统计信息。 N
    String READ_VOICEMAIL </br>允许应用程序读取系统中的语音邮件。 S/P
    String REBOOT </br>必须能够重启设备。 NU
    String RECEIVE_BOOT_COMPLETED </br>允许应用程序接收Intent.ACTION_BOOT_COMPLETED系统完成引导后广播的应用程序 。 N
    String RECEIVE_MMS </br>允许应用程序监控传入的MMS消息。 D
    String RECEIVE_SMS </br>允许应用程序接收SMS消息。 D
    String RECEIVE_WAP_PUSH </br>允许应用程序接收WAP推送消息。 D
    String RECORD_AUDIO </br>允许应用程序录制音频。 D
    String REORDER_TASKS </br>允许应用程序更改任务的Z-order。 N
    String REQUEST_COMPANION_RUN_IN_BACKGROUND </br>允许随播应用在后台运行。 N
    String REQUEST_COMPANION_USE_DATA_IN_BACKGROUND </br>允许配套应用在后台使用数据。 N
    String REQUEST_DELETE_PACKAGES </br>允许应用程序请求删除包。 N
    String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS </br>必须持有申请才能使用 Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。 N
    String REQUEST_INSTALL_PACKAGES </br>允许应用程序请求安装包。 S
    String RESTART_PACKAGES </br>API级别8中不推荐使用此常量ActivityManager.restartPackage(String) 。不再支持API。 O-all
    String SEND_RESPOND_VIA_MESSAGE </br>允许应用程序(电话)向其他应用程序发送请求,以处理来电期间的响应消息操作。 NU
    String SEND_SMS </br>允许应用程序发送短信。 D
    String SET_ALARM </br>允许应用程序广播Intent以为用户设置警报。 N
    String SET_ALWAYS_FINISH </br>允许应用程序控制在后台放置活动是否立即完成。 NU
    String SET_ANIMATION_SCALE </br>修改全局动画缩放系数。 NU
    String SET_DEBUG_APP </br>配置应用程序以进行调试。 NU
    String SET_PREFERRED_APPLICATIONS </br> 此常量在API级别7中已弃用。不再有用,请参阅 PackageManager.addPackageToPreferred(String) 详细信息。 O-all
    String SET_PROCESS_LIMIT </br>允许应用程序设置可以运行的最大(不需要)应用程序进程数。 NU
    String SET_TIME </br> 允许应用程序设置系统时间。 NU
    String SET_TIME_ZONE </br>允许应用程序设置系统时区。 NU
    String SET_WALLPAPER </br>允许应用程序设置壁纸。 N
    String SET_WALLPAPER_HINTS </br>允许应用程序设置壁纸提示。 N
    String SIGNAL_PERSISTENT_PROCESSES </br>允许应用程序请求将信号发送到所有持久进程。 NU
    String STATUS_BAR </br>允许应用程序打开,关闭或禁用状态栏及其图标。 NU
    String SYSTEM_ALERT_WINDOW </br>允许应用使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY所有其他应用上显示的类型创建窗口 。 S
    String TRANSMIT_IR </br>允许使用设备的红外发射器(如果有)。 N
    String UNINSTALL_SHORTCUT </br> 请勿在您的应用中使用此权限。 O-all
    String UPDATE_DEVICE_STATS </br>允许应用程序更新设备统计信息。 NU
    String USE_BIOMETRIC </br>允许应用使用设备支持的生物识别模式。 N
    String USE_FINGERPRINT </br>这个常量在API-28已弃用,应用程序应申请权限USE_BIOMETRIC。 N/O-28
    String USE_SIP </br> 允许应用程序使用SIP服务。 D
    String VIBRATE </br>允许访问振动器。 N
    String WAKE_LOCK </br>允许使用PowerManager WakeLocks防止处理器休眠或屏幕变暗。 N
    String WRITE_APN_SETTINGS </br>允许应用程序编写apn设置。 NU
    String WRITE_CALENDAR </br>允许应用程序写入用户的日历数据。 D
    String WRITE_CALL_LOG </br>允许应用程序写入(但不读取)用户的呼叫日志数据。 D
    String WRITE_CONTACTS </br>允许应用程序写入用户的联系人数据。 D
    String WRITE_EXTERNAL_STORAGE </br>允许应用程序写入外部存储。 D
    String WRITE_GSERVICES </br>许应用修改Google服务地图。 NU
    String WRITE_SECURE_SETTINGS </br>允许应用程序读取或写入安全系统设置。 NU
    String WRITE_SETTINGS </br>允许应用程序读取或写入系统设置。 S
    String WRITE_SYNC_SETTINGS </br>允许应用程序写入同步设置。 N
    String WRITE_VOICEMAIL </br>允许应用程序修改和删除系统中的现有语音邮件。 S/P

    3 权限组

    权限分组为与设备功能或功能相关的组。在此系统下,权限请求在组级别处理,单个权限组对应于应用程序清单中的多个权限声明。例如,SMS组包括声明READ_SMSRECEIVE_SMS声明。以这种方式对权限进行分组使用户能够做出更有意义和更明智的选择,而不会被复杂和技术许可请求所淹没。

    权限组说明

    对permission-group、permission、uses-permission三者的理解

    权限组用标签<permission-group>表示,这里需要说明一下<permission>标签和<uses-permission>标签的区别。

    我们来看一下某版本的Android系统的源代码,不要奇怪没有见过COST_MONEY这个权限组,因为不同SDK对权限组的定义和划分可能会有不同。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <permission-group
    android:name="android.permission-group.COST_MONEY"
    android:label="@string/permgrouplab_costMoney"
    android:description="@string/permgroupdesc_costMoney"/>

    <permission
    android:name="android.permission.SEND_SMS"
    android:permissionGroup="android.permission-group.COST_MONEY"
    android:protectionLevel="dangerous"
    android:label="@string/permlab_sendSms"
    android:description="@string/permdesc_sendSms"/>

    <permission
    android:name="android.permission.CALL_PHONE"
    android:permissionGroup="android.permission-group.COST_MONEY"
    android:protectionLevel="dangerous"
    android:label="@string/permlab_callPhone"
    android:description="@string/permdesc_callPhone"/>

    可以看到,这边先定义了一个permission-group:

    • android.permission-group.COST_MONEY

    然后又定义了两个permission:

    • android.permission.SEND_SMS
    • android.permission.CALL_PHONE

    需要注意的是,这两个权限中都一个android:permissionGroup属性,这个属性就指定了这个权限所属的PermissionGroup。

    而PermissionGroup在定义时,仅仅制定了label和description,就是说明一下这个权限组的作用,没什么其他用处。

    通过这个Android系统的源码我们也可以总结出<permission>标签和<uses-permission>标签的区别,Android系统在开发时就预先设计好了若干的权限,也就是Google官方文档展示的权限清单,我们在开发应用时只需根据需求,申请我们的APP所需的权限即可,采用<uses-permission>标签;只有在我们开发的APP类似Android系统(操作系统本质也是一个应用)提供了供其他应用程序调用的代码或者数据,才需要使用<permission>声明自己的程序的权限

    关于危险权限的权限组

    所有危险的Android权限都属于权限组。无论保护级别如何,任何权限都可以属于权限组。但是,如果权限是危险的,则权限组仅影响用户体验。

    如果设备运行的是Android 6.0(API级别23)且应用程序targetSdkVersion为23或更高,则当您的应用请求危险权限时,以下系统行为适用:

    • 如果应用程序当前在权限组中没有任何权限,系统会向用户显示描述应用程序要访问的权限组的权限请求对话框。该对话框未描述该组中的特定权限。例如,如果某个应用请求了该 READ_CONTACTS权限,系统对话框就会说该应用需要访问该设备的联系人。如果用户授予批准,系统将为应用程序提供其请求的权限。
    • 如果应用程序已在同一权限组中被授予其他危险权限,则系统会立即授予权限,而不与用户进行任何交互。例如,如果某个应用程序先前已请求并已获得该READ_CONTACTS权限,然后它会请求WRITE_CONTACTS,则系统会立即授予该权限,而不向用户显示权限对话框。
    警告:未来版本的Android SDK可能会将特定权限从一个组移动到另一个组。因此,请勿将应用程序的逻辑基于这些权限组的结构。
    

    例如,与Android 8.1(API级别27)READ_CONTACTS属于同一权限组 WRITE_CONTACTS。如果您的应用请求READ_CONTACTS 权限,然后请求 WRITE_CONTACTS权限,请不要假设系统可以自动授予 WRITE_CONTACTS权限。

    如果设备运行Android 5.1(API级别22)或更低版本,或者应用程序 targetSdkVersion为22或更低,系统会要求用户在安装时授予权限。系统再次告诉用户应用程序需要哪些权限组,而不是单个权限。例如,当应用程序请求READ_CONTACTS安装对话框时,列出“联系人”组。用户接受时,仅READ_CONTACTS授予应用程序权限。

    注意:即使用户已在同一组中授予了其他权限,您的应用仍需要明确请求其所需的每个权限。此外,将权限分组到组中可能会在将来的Android版本中发生变化。您的代码不应具有依赖于同一组中的一组特定权限的逻辑。
    

    权限组列表

    类型 权限组字符串 权限
    String CALENDAR 用于与用户日历相关的运行时权限。 READ_CALENDAR</br>WRITE_CALENDAR
    String CALL_LOG 用于与电话功能相关联的权限。 READ_CALL_LOG</br>WRITE_CALL_LOG</br>PROCESS_OUTGOING_CALLS
    String CAMERA 用于与访问摄像头或从设备捕获图像/视频相关联的权限。 CAMERA
    String CONTACTS 用于与此设备上的联系人和配置文件相关的运行时权限。 READ_CONTACTS</br>WRITE_CONTACTS</br>GET_ACCOUNTS
    String LOCATION 用于允许访问设备位置的权限。 ACCESS_FINE_LOCATION</br>ACCESS_COARSE_LOCATION
    String MICROPHONE 用于与从设备访问麦克风音频相关联的权限。 RECORD_AUDIO
    String PHONE 用于与电话功能相关联的权限。 READ_PHONE_STATE</br>READ_PHONE_NUMBERS</br>CALL_PHONE</br>ANSWER_PHONE_CALLS</br>ADD_VOICEMAIL</br>USE_SIP
    String SENSORS 用于与访问正文或环境传感器相关联的权限。 BODY_SENSORS
    String SMS 用于与用户的SMS消息相关的运行时权限。 SEND_SMS</br>RECEIVE_SMS</br>READ_SMS</br>RECEIVE_WAP_PUSH</br>RECEIVE_MMS
    String STORAGE 用于与共享外部存储相关的运行时权限。 READ_EXTERNAL_STORAGE</br>WRITE_EXTERNAL_STORAGE

    4 Google官方文档链接

    查阅更多,请查阅Google Android开发文档。