在真实设备上运行应用程序后,Android Studio会添加不需要的权限

时间:2015-05-30 12:30:37

标签: android android-gradle build.gradle android-manifest android-permissions

在设备应用程序上运行应用程序后,需要在清单文件中未提及的不需要的位置权限。当我从我的朋友Android工作室运行相同的代码而不是正常运行而没有额外的许可时。

清单文件

<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" />

enter image description here

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'
    }

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

3 个答案:

答案 0 :(得分:36)

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

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

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

接下来,考虑使用一个(或多个)更集中的依赖项,而不是完整的Play Services SDK。这不仅会消除您不想要的许可,而且您的APK将会小很多。 The documentation涵盖了可用的选项(请参阅&#34;有选择地将API编译到可执行文件&#34;部分)。

如果您仍然使用不需要的权限,那么您需要确定权限的来源。在您的模块的build/outputs/logs/中应该有一个清单合并报告。这将有点难以理解,但希望您可以识别提供此权限的库。此外,当您编辑清单时,Android Studio 2.2+将在子选项卡中显示您的合并清单。

此时,您需要决定如何继续:

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

  • 或者,获得许可

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

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

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

答案 1 :(得分:4)

对于新版Google Play服务库,您必须仅添加库中所需的部分作为依赖项。例如,如果您仅使用Google Play服务库来展示Admob中的广告,请替换

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

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

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

答案 2 :(得分:2)

您需要检查合并的清单。

您使用的库也可以请求权限。

那是许可的来源。

enter image description here

相关问题