Android Studio 在真机上运行应用程序后添加了不需要的权限 [英] Android studio adds unwanted permission after running application on real device

查看:30
本文介绍了Android Studio 在真机上运行应用程序后添加了不需要的权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在设备上运行应用程序后,应用程序需要清单文件中未提及的不需要的位置权限.而当我从我的朋友 Android Studio 运行相同的代码时,它在不需要额外许可的情况下正常运行.

After running application on device application required unwanted location permission that is not mention in manifest file. While when I am running same code from my friend Android studio than its run normal without extra permission required.

清单文件

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

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

So I am unable to understand why its require location permission. How this location permission added in my app?

推荐答案

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

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

This library will request location permissions, as several pieces of Play Services need it.

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

First, never use +. If you want to allow free-floating patchlevels (e.g., 22.0.+), that's not completely insane, but using + for the version is insane.

接下来,考虑使用一个(或多个)更集中的依赖项,而不是完整的 Play 服务 SDK.这不仅可能会消除您不想要的权限,而且您的 APK 也会小很多.文档涵盖了可用选项(请参阅有选择地将 API 编译到可执行文件中"" 部分).

Next, consider using one (or more) of the more focused dependencies, rather than the full Play Services SDK. Not only will this perhaps eliminate the permission that you do not want, but your APK will be a lot smaller. The documentation covers the available options (see the "Selectively compiling APIs into your executable" section).

如果您仍然获得不想要的权限,那么您需要确定权限的来源.在您的模块的 build/outputs/logs/ 中应该有一个清单合并报告.理解起来有点困难,但希望您能确定提供此权限的库.此外,当您编辑清单时,Android Studio 2.2+ 将在子选项卡中显示您的合并清单.UPDATE 2020-03-24:Android Studio 的现代版本也在清单编辑器的合并清单"子选项卡中显示这些内容,并使用颜色编码来尝试向您展示哪些权限来自什么图书馆.

If you still wind up with permissions that you do not want, then you will need to determine where the permissions are coming from. There should be a manifest merger report in build/outputs/logs/ of your module. It will be a bit difficult to understand, but hopefully you can identify the library that is contributing this permission. Also, Android Studio 2.2+ will show your merged manifest in a sub-tab when you edit your manifest. UPDATE 2020-03-24: Modern versions of Android Studio also show this stuff in the "Merged Manifest" sub-tab of the manifest editor, with color-coding to try to show you what permissions came from what libraries.

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

At that point, you need to decide how to proceed:

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

  • The safest answer that removes the permission is to no longer use that library, but instead find some other solution to whatever problem you are trying to solve with that library

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

Or, live with the permission

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

Or, try adding the following to your app's manifest:

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

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

This will require you to add xmlns:tools="http://schemas.android.com/tools" to the root <manifest> element if it is not already there. This will tell the build tools to explicitly exclude this permission, even though libraries are contributing it. However, your use of those libraries may break. Only do this if you have a dedicated testing team that can spend the time needed to ensure that your decision to block this permission will not result in crashes or other behavior that affects the user.

这篇关于Android Studio 在真机上运行应用程序后添加了不需要的权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆