为啥包含 Google Play 服务库时权限会自动添加到我的 AndroidManifest

Posted

技术标签:

【中文标题】为啥包含 Google Play 服务库时权限会自动添加到我的 AndroidManifest【英文标题】:Why are permissions being automatically added to my AndroidManifest when including Google Play Services library为什么包含 Google Play 服务库时权限会自动添加到我的 AndroidManifest 【发布时间】:2015-08-19 22:14:07 【问题描述】:

我注意到当我在 build.gradle 文件中使用以下权限时,会自动添加以下权限

compile 'com.google.android.gms:play-services:7.5.0'

早期版本的播放服务不会出现这种情况。 有没有人有解决方案来删除这些不需要的权限?

我只使用广告功能(INTERNET 和 ACCESSNETWORK_STATE)。 我不需要 LOCATION 和 USE_CREDENTIALS 权限。 如何删除这些不需要的权限?

我注意到“manifest-merger-xxx-debug-report.txt”文件包含以下内容

 ...<snipped bunch of other merges>
MERGED from com.google.android.gms:play-services-maps:7.5.0:22:5
    android:name
        ADDED from com.google.android.gms:play-services-maps:7.5.0:22:22
uses-permission#android.permission.ACCESS_COARSE_LOCATION
ADDED from com.google.android.gms:play-services-maps:7.5.0:23:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:23:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:23:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:23:5
    android:name
        ADDED from com.google.android.gms:play-services-maps:7.5.0:23:22
uses-feature#0x00020000
ADDED from com.google.android.gms:play-services-maps:7.5.0:24:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:24:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:24:5
MERGED from com.google.android.gms:play-services-maps:7.5.0:24:5
    android:glEsVersion
        ADDED from com.google.android.gms:play-services-maps:7.5.0:25:8
    android:required
        ADDED from com.google.android.gms:play-services-maps:7.5.0:26:8
android:uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from AndroidManifest.xml:2:1 reason: com.google.android.gms.maps requested WRITE_EXTERNAL_STORAGE
uses-permission#android.permission.GET_ACCOUNTS
ADDED from com.google.android.gms:play-services-wallet:7.5.0:21:5
    android:name
        ADDED from com.google.android.gms:play-services-wallet:7.5.0:21:22
uses-permission#android.permission.USE_CREDENTIALS
ADDED from com.google.android.gms:play-services-wallet:7.5.0:22:5
    android:name
        ADDED from com.google.android.gms:play-services-wallet:7.5.0:22:22
meta-data#com.google.android.gms.wallet.api.enabled
 ...<snips more lines away>

【问题讨论】:

【参考方案1】:

当你使用

compile 'com.google.android.gms:play-services:7.5.0'

这意味着您正在使用 Google Play 服务的每一项功能,包括定位服务。如果你只需要一个特定的 API,你应该使用selective APIs。

如果是广告,您可以单独使用:

compile 'com.google.android.gms:play-services-ads:7.5.0'

【讨论】:

啊。解决了它。奇怪的是,快速入门指南要求我们使用所有服务,而不仅仅是广告包。 developers.google.com/admob/android/quick-start @AngelKoh - 我已向 Google 文档团队提交了一个错误,以更新快速入门指南。感谢您指出这一点! @NanaGhartey - 这是 6.5 版的限制,而不是 7.5 版的限制。 AFAIK,此限制已被删除。 注意,quick start guide 现在更新为引用 play-services-ads play-services 7.5 是第一个自动添加必要权限的版本,而过去这不是为您完成的。【参考方案2】:

如果您的应用功能不需要,您可以排除这些自动添加的权限。

就我而言,我使用的是 Google wallet 播放服务 8.3,它添加了 GET_ACCOUNTSUSE_CREDENTIALS 。我们不要求用户选择谷歌账户来选择谷歌钱包。

<uses-permission android:name="android.permission.GET_ACCOUNTS" tools:node="remove"/>
<uses-permission android:name="android.permission.USE_CREDENTIALS" tools:node="remove" />

tools:node="remove" 在创建完整清单时发挥作用。

/build/intermediates/manifest/full/debug查看完整的决赛AndroidManifest.xml

【讨论】:

这与我更相关,因为从 Play Services 8.3 开始,play-services-ads 依赖项引入了 WAKE_LOCK 权限。

以上是关于为啥包含 Google Play 服务库时权限会自动添加到我的 AndroidManifest的主要内容,如果未能解决你的问题,请参考以下文章

为啥打开google play就闪退

为啥我的google play一直显示网络连接失败?

为啥无法登录 Google Play 服务?

Android:Google Play 服务“无资源”错误

为啥我用谷歌账号登陆play商店他说与google服务器通信出现问题啊?

为啥 Localytics 需要 google-play-services:ads?