在我的清单中,我只要求这两个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但是当我在手机上安装应用程序时,我也会收到此通知:
Low-risk permissions
Phone ID
Get your phone ID, including IMEI, IMSI, etc.
根据我从this SO answer收集的内容,我应该使用TelephonyManager
并致电
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
要求此权限。但我没有使用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:+'
}
我测试了一个包含这两个依赖项的新应用程序,并且没有请求任何权限。
我的下一步是从头开始再次添加每个活动,看看我是否可以找到此权限开始被调用的位置。继续......
更新4
我把所有东西复制到一个新项目并重构项目名称和删除碎片,但事实证明它非常复杂。我无法理清原因。
更新5
我将targetSdkVersion设置为1.这在安装应用程序之前宣布权限时会显示一条新消息:
阅读手机状态和身份
允许该应用访问设备的手机功能。这个 权限允许应用确定电话号码和设备 ID,呼叫是否处于活动状态,以及由a连接的远程号码 调用
我在开头写的旧手机ID权限通知仍然存在(在安装应用程序后显示)。这让我想知道它是否与操作系统有关(我在小米手机上使用MIUI Android)。该应用程序仍有一些东西导致它显示在此应用程序中,但不会在其他应用程序中显示。我需要在接下来的其他设备上测试它。
答案 0 :(得分:16)
这是因为您导入的targetSdkVersion低于应用程序的targetSdkVersion
来自{{3}}:
导入targetSdkVersion低于的库时 导入应用程序targetSdkVersion, 某些权限可能 自动添加到生成的合并清单文件中。 这是必要的,因为这些库以运行时为目标,其中隐式授予了这些权限。因此,没有必要宣布这样的许可。但是,在最近的Android版本中,不会自动授予这些权限。因此,在针对更新的运行时的应用程序中合并后,在没有权限的情况下定位此类旧运行时的库将无法正常工作。
可以添加的权限是:
您可以检查由Manifest Merger生成的报告(在\ app \ build \ outputs \ apk \ manifest-merger-XXX-report中),以查看哪个库导致添加了READ_PHONE_STATE权限。你会看到类似的东西:
IndexError: Invalid index to scalar variable
答案 1 :(得分:4)
将以下代码添加到AndroidManifest.xml中以删除不必要的权限:
setlocal enabledelayedexpansion
来源: