在进行动态权限时,除了主工程中声明的权限外,很有可能引用的三方sdk中也有特殊权限的声明,那么如何找到某些特殊权限是由哪个sdk引入的,又如何解决呢。
如何查找
1.官网
对于三方sdk,在相应官网都会有详细的使用说明,使用到的权限等,这确实是一种查找方案,但如果三方sdk很多,或者引用的一些小众的sdk,并没有详细的说明,那这种方法就会显的无能为力。因此,我们需要找到另一种更简便的方式。
2.gradle log
gradle在进行打包时,会将主工程、子工程以及三方sdk中的manifest文件中的内容进行合并操作,对于权限的合并,会生成一个相应的Log文件。在 app/build/outputs下,除了常用的 apk和mapping文件夹外,还有一个logs文件夹:
image.png 如图所示,可以清楚的知道,vds-android-agent:1.1.2这个sdk引入的READ_PHONE_STATE 这个危险权限。
如何解决
1. 更新sdk
想要移除sdk中的相应权限,尤其是危险权限,首先是还是去官网上,更新到最新的sdk,看看相应的说明中,是否已经把该危险权限已去除。
2. tools:node 属性
这个标签指定了manifest中冲突属性的合并规则或删除不必要的元素和属性,很明显,对于三方中的权限,我们是要进行删除的
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" />
tools是一个比较强大的功能,除了指定permission外,对于activity的属性、service以及application等中的属性都可指定,而除了remove,还有replace、strict等,具体可见官网:https://developer.android.com/studio/build/manifest-merge?hl=zh-cn
注意:在使用上述tools:node="remove"方式移除危险权限时,一定要保证sdk无此权限也能正常运行且不影响功能,否则的话,还需在应用中申请此权限。
参考:
https://medium.com/glucosio-project/how-libraries-can-silently-add-permissions-to-your-android-app-620911d7de6c
https://developer.android.com/studio/build/manifest-merge?hl=zh-cn
网友评论