提问人:Nikhil 提问时间:5/30/2015 最后编辑:Vadim KotovNikhil 更新时间:3/2/2023 访问量:8730
Android Studio 在真实设备上运行应用程序后添加不需要的权限
Android studio adds unwanted permission after running application on real device
问:
在设备上运行应用程序后,应用程序需要清单文件中未提及的不需要的位置权限。当我从我的朋友 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" />
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'
}
所以我无法理解为什么它需要位置权限。如何在我的应用中添加此位置权限?
答:
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>
评论
对于新版本的 Google Play 服务库,您只需将库的必需部分添加为依赖项。例如,如果您使用 Google Play 服务库只是为了展示来自 Admob 的广告,请将
compile 'com.google.android.gms:play-services:+'
跟
compile 'com.google.android.gms:play-services-ads:7.5.0'
这将删除其他不必要的权限。
您需要检查合并的清单。
您使用的库也可以请求权限。
这就是许可的来源。
有时,我们在项目中添加了第三方库,它们会要求我们未添加的权限。您可以通过此路径检查哪个库正在使用哪个权限。
转到:
[项目根]/应用/构建/输出/日志/清单合并调试报告.txt
你会在那里找到你所有的许可
通过merge-manifest检查权限的另一种方法
为此:
- 运行应用
- 转到清单文件
- 单击 Merge Manifest
评论
ACCESS_NETWORK_STATE
ACCESS_WIFI_STATE