为什么我的应用要求获得手机ID权限?

Sur*_*gch 9 permissions android

在我的清单中,我只要求这两个权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

但是当我在手机上安装应用程序时,我也收到了这个通知:

Low-risk permissions
Phone ID
Get your phone ID, including IMEI, IMSI, etc.
Run Code Online (Sandbox Code Playgroud)

从我从这个SO答案中收集到的内容,我应该使用TelephonyManager并打电话

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Run Code Online (Sandbox Code Playgroud)

要求此权限.但我没有使用TelephonyManager或调用该权限.我不想要求用户提供此权限.我查看了我的清单和gradle文件.可能是我使用的一些代码触发了这个权限被调用而没有我特别要求它吗?我知道我不会给你很多东西,因为我不知道还有什么可以看的.

更新1

我在Android Studio中创建了一个全新的项目,并从中生成了一个签名的APK.我安装了它,但没有要求权限.(这至少证实了我在Android Studio中不是一些自动要求此权限的"新功能".)

更新2

至于@ antonio的答案我发现app/build/outputs/logs/manifest-merger-release-report.txt但是,我没有发现任何隐含的权限被请求.

更新3

以下是我的应用程序使用的依赖项(来自gradle.build):

dependencies {
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
Run Code Online (Sandbox Code Playgroud)

我测试了一个具有这两个依赖项的新应用程序,并且没有请求任何权限.

我的下一步是从头开始再次添加每个活动,看看我是否可以找到此权限开始被调用的位置.未完待续...

更新4

我把所有东西复制到一个新项目并重构项目名称和删除碎片,但事实证明它非常复杂.我无法理清原因.

更新5

我将targetSdkVersion设置为1.这在安装应用程序之前宣布权限时会给出一条新消息:

读取电话状态和身份

允许该应用访问设备的手机功能.此权限允许应用程序确定电话号码和设备ID,呼叫是否处于活动状态以及通过呼叫连接的远程号码.

我在开头写的旧手机ID权限通知仍然存在(在安装应用程序后显示).这让我想知道它是否与操作系统有关(我在小米手机上使用MIUI Android).该应用程序仍有一些东西导致它显示在此应用程序中,但不会在其他应用程序中显示.我需要在接下来的其他设备上测试一下.

ant*_*nio 16

发生这种情况是因为您导入的targetSdkVersion低于应用程序的targetSdkVersion库

从Manifest Merger文档:

导入targetSdkVersion低于导入应用程序targetSdkVersion的库时,某些权限可能会自动添加到生成的合并清单文件中. 这是必要的,因为这些库以运行时为目标,其中隐式授予了这些权限.因此,没有必要宣布这样的许可.但是,在最近的Android版本中,不会自动授予这些权限.因此,在针对更新的运行时的应用程序中合并后,在没有权限的情况下定位此类旧运行时的库将无法正常工作.

可以添加的权限是:

  • WRITE_EXTERNAL_STORAGE导入targetSdkVersion <4的库时添加
  • READ_EXTERNAL_STORAGE导入声明为WRITE_EXTERNAL_STORAGE的库时添加
  • READ_PHONE_STATE在导入targetSdkVersion <4的库时添加
  • READ_CALL_LOG在导入targetSdkVersion <16并使用READ_CONTACTS权限的库时添加
  • WRITE_CALL_LOG导入具有targetSdkVersion <16并使用WRITE_CONTACTS权限的库时添加

您可以检查由Manifest Merger生成的报告(在\ app\build\outputs\apk\manifest-merger-XXX-report中),以查看哪个库导致添加了READ_PHONE_STATE权限.你会看到类似的东西:

android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from AndroidManifest.xml:2:1 reason: the.library has a targetSdkVersion < 4
Run Code Online (Sandbox Code Playgroud)