Android 工作室在真实设备上 运行 应用程序后添加了不需要的权限

Android studio adds unwanted permission after running application on real device

运行在设备应用程序上安装应用程序后需要清单文件中未提及的不需要的位置权限。当我 运行 从我的朋友 Android studio 使用与它的 运行 相同的代码而不需要额外的许可时。

清单文件

<uses-sdk
    android:minSdkVersion="14"
android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

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

Build.gradle

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.2"

        defaultConfig {
            applicationId "xxxxxxx"
        }
        dexOptions {

            javaMaxHeapSize "4g"
        }

        packagingOptions {
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/NOTICE'
        }

        lintOptions{
            abortOnError false
        }
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        compile 'com.google.android.gms:play-services:+'

        compile 'com.android.support:multidex:1.0.0'
        compile 'com.android.support:appcompat-v7:21.0.3'
    }

所以我无法理解为什么它需要位置许可。如何在我的应用程序中添加此位置权限?

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

此库将请求位置权限,因为多个 Play 服务需要它。

首先,永远不要使用+。如果你想允许自由浮动的补丁级别(例如,22.0.+),那并不完全是疯了,但是使用 + 作为版本 疯了。

接下来,考虑使用一个(或多个)更集中的依赖项,而不是完整的 Play 服务 SDK。这不仅可能会消除您不想要的权限,而且您的 APK 会小很多。 The documentation 涵盖可用选项(请参阅 "Selectively compiling APIs into your executable" 部分)。

如果您仍然得到不需要的权限,那么您将需要确定这些权限的来源。在您的模块的 build/outputs/logs/ 中应该有一份清单合并报告。这会有点难以理解,但希望您能识别提供此权限的库。此外,Android Studio 2.2+ 将在您编辑清单时在子选项卡中显示合并的清单。 更新 2020-03-24:Android Studio 的现代版本也在清单编辑器的 "Merged Manifest" 子选项卡中显示这些内容,颜色编码为尝试向您展示哪些权限来自哪些库。

届时,您需要决定如何进行:

  • 删除权限的最安全答案是不再使用该库,而是找到其他解决方案来解决您试图用该库解决的任何问题

  • 或者,在允许的情况下生活

  • 或者,尝试将以下内容添加到您应用的清单中:

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

这将要求您将 xmlns:tools="http://schemas.android.com/tools" 添加到根 <manifest> 元素(如果尚不存在)。这将告诉构建工具明确排除此权限,即使库正在贡献它。但是,您对这些库的使用可能会中断。仅当您有专门的测试团队可以花时间确保您阻止此权限的决定不会导致崩溃或影响用户的其他行为时才这样做。

对于 Google Play Service 库的新版本,您只需将库的必需部分添加为依赖项。例如,如果您使用 Google 播放服务库只是为了显示来自 Admob 的广告,则替换

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

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

这将删除其他不必要的权限。

您需要检查合并后的清单。

您使用的图书馆也可以请求权限。

这就是该许可的来源。