为什么 play-services-location 需要 android.permission.WRITE_EXTERNAL_STORAGE 和 android.permission.READ_EXTERNAL_STORAGE 权限?

Why does play-services-location need the android.permission.WRITE_EXTERNAL_STORAGE and android.permission.READ_EXTERNAL_STORAGE permissions?

我在 AndroidManifest.xml 中只有:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

将APK上传到开发者控制台后,增加了两个新的权限:

我的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "net.perspiratron.ifpaprofile"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 3
        versionName "1.2"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
//    wearApp project(':wear')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.google.android.gms:play-services-analytics:7.5.0'
    compile 'com.google.android.gms:play-services-location:7.5.0'
    compile 'com.jjoe64:graphview:4.0.0'
}

我唯一添加的是播放服务位置。为什么这个图书馆需要它?

简短回答:我认为 play-services-location 不需要这些权限。它似乎也不需要 android.permission.ACCESS_NETWORK_STATEandroid.permission.INTERNET,它们也在添加中。

更长的答案: 查看我的清单合并日志,似乎所有这四个权限都是应 play-services-maps 的请求包含的,其中 -location 是 link 自己加入的。我的应用程序不使用 -maps,只使用 -location。

此外,我发现这个行为只是出现在 play-services-location 的 7.5.0 版本中;以前的版本不包括 -maps,并且不添加这些权限。

我实际上怀疑这个与 play-services-maps 的连接是偶然的,并且会在未来的 GMS 版本中被删除。

根据 Mark Murphy (CommonsWare) 给出的 link,您可以通过将以下行添加到您的清单中来从您的应用程序中删除这些权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" tools:node="remove" />
<uses-permission android:name="android.permission.INTERNET" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />

请注意,您还需要在开头的 <manifest ... > 元素中添加 xmlns:tools="http://schemas.android.com/tools" 才能使这些工作正常进行。通常的注意事项适用:我的应用程序在执行此步骤后运行良好,但 YMMV。


2015 年 9 月 10 日更新:Mark Murphy (@commonsware) 在他的博客上 an excellent writeup on this issue,包括对我的解决方案风险的讨论。