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

Nik*_*hil 21 android android-manifest android-permissions build.gradle android-gradle-plugin

在设备应用程序上运行应用程序后,需要在清单文件中未提及的不需要的位置权限 当我从我的朋友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" />
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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'
    }
Run Code Online (Sandbox Code Playgroud)

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

Com*_*are 37

compile 'com.google.android.gms:play-services:+'
Run Code Online (Sandbox Code Playgroud)

该库将请求位置权限,因为几个Play服务需要它.

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

接下来,考虑使用一个(或多个)更集中的依赖项,而不是完整的Play Services SDK.这不仅会消除您不想要的许可,而且您的APK将会小很多.该文档包含可用选项(请参阅"将API选择性地编译到可执行文件中"部分).

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

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

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

  • 或者,获得许可

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

    <uses-permission
         android:name="android.permission.ACCESS_COARSE_LOCATION"
         tools:node="remove" />
    
    Run Code Online (Sandbox Code Playgroud)

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


Gor*_*ail 5

You need to check the merged manifest.

Libraries that you use can also request permissions.

That is where that permission comes from.

在此处输入图片说明