解决幽灵权限问题
1. 问题描述
- 工作中遇到这样一个问题,应用上架的时候提示使用了 READ_PHONE_STATE 权限,但是实际上在 AndroidManifest.xml 中并没有声明这个权限。提示信息如下:
Your app has an APK with version code 29 that requests the permission:android.permission.READ_PHONE_STATE.Apps using this permission in an APK are required to have a privacy policy set.
- 这就很奇怪了,明明没有声明和使用这个权限,但是却收到这样的警告。首先先确认一下是不是真的包含了这个权限吧。
2. 确定问题
- 打开 app/build/outputs/logs/,点开其中一个,以 manifest-merger-debug-report.txt 为例,在这个文件搜索 READ_PHONE_STATE ,确实出现了这个权限的搜索结果,紧随其后的应该就是引起这个问题的相关原因,在这里也可以看出是和我使用的 vlc 库有点关系,因为我的 org.videolan 包下就是vlc,大家可以根据自己的情况进行排查。
- 于是我再用 APK Messenger 这个工具查看了一下,结果确实显示应用申请了这个权限。
- 看来问题确实是因为应用中申请了这个权限。
3. 解决办法
- 全局搜索项目中其他使用的 module 也没有这个权限的身影,一通搜索下来才找到能够解决我这个情况的答案。
原答案地址:http://www.voidcn.com/article/p-rwdsssbq-bvu.html
- 大意就是有些引用的第三方库没有指定 minSdkVersion 和 targetSdkVersion,而当这两个值都低于4的时候系统就会自动添加这个权限都应用中。虽然不明白为什么,但是确实很坑爹。
- 根据前面的方法找到的引起这个原因的库我已经确定是哪一个了,但是这个库我没有源码,只是一个 aar 文件,没办法重编一个。不过 aar 文件也很好解决,先把后缀改成 zip ,然后修改压缩包里的 AndroidManifest.xml 文件,增加 minSdkVersion 和 targetSdkVersion,改完再把后缀改回 aar 就可以了。
- 重新编译,再次用 APK Messenger 查看,果然没有那个权限了。
- 如果是有源码或者可以从远程拉一份代码的话,直接重新编一份就可以。还有一种方法就是在AndroidManifest.xml 中配置 <uses-sdk tools:overrideLibrary=“xxx.xxx.xxx”/> 这个属性,在里面写minSdk 和 targetSdk ,但是我没有验证过这种办法是否确实有效。
- 幽灵权限这个名字是在搜解决办法的时候看到一个回答里提出的,但是现在找不到那个回答了就没贴上。
完