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

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

在这里输入图像描述

的build.gradle

 apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "xxxxxxx" minSdkVersion 14 targetSdkVersion 21 // Enabling multidex support. multiDexEnabled true } 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 project(':boxAndroidLibraryV2') compile 'com.google.http-client:google-http-client-gson:1.19.0' compile 'com.google.code.gson:gson:2.1' compile 'com.google.android.gms:play-services:+' compile files('libs/HockeySDK-3.0.2.jar') compile files('libs/dropbox-android-sdk-1.6.3.jar') compile 'com.google.apis:google-api-services-drive:v2-rev164-1.20.0' compile files('libs/in-app-purchasing-2.0.59.jar') compile files('libs/json_simple-1.1.jar') compile 'com.android.support:multidex:1.0.0' compile 'com.android.support:appcompat-v7:21.0.3' compile files('libs/slf4j-api-1.7.5.jar') compile files('libs/jackrabbit-webdav-2.7.2.jar') compile files('libs/commons-httpclient-3.1.jar') compile project(':utilities') compile files('libs/pass-v1.1.3.jar') compile files('libs/sdk-v1.0.0.jar') compile 'com.google.api-client:google-api-client:1.20.0' compile 'com.google.oauth-client:google-oauth-client:1.20.0' compile 'com.google.api-client:google-api-client-android:1.20.0' compile 'com.google.http-client:google-http-client-android:1.20.0' } configurations { all*.exclude group: 'com.google.guava', module:'guava-jdk5' } 

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

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

这个库会请求位置权限,因为几个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" /> 

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

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

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

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

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