首页 > 解决方案 > Android - 神秘权限出现在构建清单中

问题描述

最近在将我的应用上传到 Google Play 时,出现了一个警告,提示已添加了新权限:

Google Play 权限警告

我不需要这些权限。我发现它们可能来自我正在使用的库,所以我<uses-permission>从我的库中删除了所有内容AndroidManifest.xml以进行测试。

1. 合并清单报告

我在 中检查了合并的清单报告/app/build/outputs/logs/manifest-merger-debug-report.txt,它向我显示了各种库正在添加以下权限:

uses-permission#android.permission.INTERNET
uses-permission#android.permission.ACCESS_NETWORK_STATE
uses-permission#android.permission.WAKE_LOCK
uses-permission#com.google.android.c2dm.permission.RECEIVE
permission#com.pressbible.view.permission.C2D_MESSAGE
uses-permission#com.pressbible.view.permission.C2D_MESSAGE

那些看起来不错,但它并没有解释ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATIONCHANGE_WIFI_STATE来自哪里。

2. 最终清单

一整套权限出现在合并的构建清单的底部/app/build/intermediates/manifests/full/debug/AndroidManifest.xml

  <uses-permission android:name="android.permission.GET_TASKS"/>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
  <uses-permission android:name="android.permission.BLUETOOTH"/>
  <uses-permission android:name="android.permission.RECEIVE_SMS"/>

我的清单中没有这些,它们也不在清单报告中。

3. 移除尝试

尝试添加行

<uses-permission android:name=”android.permission.[permision-name]” tools:node=”remove” />

对于每个权限都没有删除它们。

4. 合并清单视图

我还使用了Android 文档建议的合并清单视图,除了在merger-debug-report.txt

我尝试从其他库中搜索清单文件,但没有找到它们。我还尝试了使无效并重新启动,重新启动计算机并删除所有构建文件。神秘的权限仍然出现在合并的 AndroidManifest.xml 中。

我怎样才能找到这些权限的来源?

我怎样才能删除它们?

相关问题:

禁用依赖库权限

使用gradle构建Android应用程序时如何删除特定权限?

为什么从 AndroidManifest.xml 中删除权限不起作用?

标签: javaandroidandroid-permissions

解决方案


我在清理一些代码时偶然发现了答案——权限是由插件而不是库添加的,这就是为什么它没有出现在上述报告中的原因。

我们使用名为ShareSDK的 sdk 进行共享。它被这一行添加到build.gradle

apply plugin: 'com.mob.sdk'

当我删除这一行和相关代码时,合并的清单不再包含额外的权限。对于任何偶然发现这个问题的未来用户,我会说要提防为中国市场制作的任何库或插件!


推荐阅读