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

Android studio adds unwanted permission after running application on real device

提问人:Nikhil 提问时间:5/30/2015 最后编辑:Vadim KotovNikhil 更新时间:3/2/2023 访问量:8730

问:

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

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

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

android-gradle-plugin build.gradle android-manifest android-permissions

评论

2赞 TooCool 5/30/2015
也许您正在使用一些使用那些添加的 permession 的库
0赞 Vladimir Petrakovich 5/30/2015
检查位于“app\build\intermediates\manifests\debug”(其中“app”是应用程序的主模块名称)中的清单。它是否包含位置权限?
1赞 Bill Tsagkas 5/30/2015
您能向我们展示一下您在项目中可能使用的其他库吗?
0赞 pathfinderelite 5/30/2015
也许是由其中之一引起的?尝试暂时删除这些内容,看看是否会删除位置权限。ACCESS_NETWORK_STATEACCESS_WIFI_STATE
0赞 Tharif 5/30/2015
<uses-permission android:name=“com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY”/>

答:

43赞 CommonsWare 5/30/2015 #1
compile 'com.google.android.gms:play-services:+'

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

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

接下来,请考虑使用一个或多个更集中的依赖项,而不是完整的 Play Services SDK。这不仅可能会消除您不想要的权限,而且您的APK会小得多。该文档介绍了可用选项(请参阅“有选择地将 API 编译到可执行文件中”部分)。

如果您仍然拥有不想要的权限,则需要确定权限的来源。您的模块中应该有一个清单合并报告。这有点难以理解,但希望您能确定提供此权限的库。此外,当您编辑清单时,Android Studio 2.2+ 会在子标签页中显示合并后的清单。2020-03-24 更新:现代版本的 Android Studio 也会在清单编辑器的“合并清单”子标签页中显示这些内容,并使用颜色编码来尝试向您显示哪些权限来自哪些库。build/outputs/logs/

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

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

  • 或者,在获得许可的情况下生活

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

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

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

评论

0赞 Moti Bartov 4/6/2016
伟大!谢谢!Google-Play服务添加了一些奇怪的权限,例如android.permission.USE_CREDENTIALS和权限。GET_ACCOUNTS,我的应用程序不需要这些权限,但“删除”解决方案会取消这些权限。只有查看日志文件时,我才能知道它们来自哪里。
4赞 eyeslave 7/1/2015 #2

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

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

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

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

6赞 Goran Horia Mihail 12/19/2018 #3

您需要检查合并的清单。

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

这就是许可的来源。

enter image description here

0赞 Muzammil Hussain 3/2/2023 #4

有时,我们在项目中添加了第三方库,它们会要求我们未添加的权限。您可以通过此路径检查哪个库正在使用哪个权限。

转到:

[项目根]/应用/构建/输出/日志/清单合并调试报告.txt

enter image description here

你会在那里找到你所有的许可

通过merge-manifest检查权限的另一种方法

为此:

  1. 运行应用
  2. 转到清单文件
  3. 单击 Merge Manifest

enter image description here