Android Manifest合并时如何保障位置/蓝牙权限为最大所需配置
Android Manifest 权限合并异常修复
问题成因
Android 清单合并工具处理同名称的<uses-permission>条目时,不会自动清除maxSdkVersion这类限制性属性:只要任意一个集成模块声明了该权限的版本上限,合并结果就会默认保留该上限配置,即便其他模块声明了无版本限制的同名权限,也不会自动覆盖这个限制。
保留maxSdkVersion="30"配置后,Android 12(API 31)及以上版本的设备安装应用时,系统不会授予ACCESS_FINE_LOCATION权限,会直接导致蓝牙信标扫描功能失效——按照Android权限规范,蓝牙信标扫描在所有SDK版本下都依赖精确定位权限。
修复方案
最稳妥、侵入性最低的修复方式是在**app主模块(最终打包的宿主模块)**的AndroidManifest.xml中显式配置合并规则,强制移除该权限的版本上限限制:
- 先确认Manifest根节点已声明tools命名空间,没有的话补充上:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="你的应用包名"> - 在权限声明区域添加如下配置,显式指定合并时移除
maxSdkVersion属性:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:remove="android:maxSdkVersion" />
验证方式
配置完成后重新构建应用,查看合并后的Manifest产物确认修复生效,产物默认路径为:app/build/intermediates/merged_manifest/[对应构建变体]/AndroidManifest.xml
打开文件检查ACCESS_FINE_LOCATION对应的权限条目,确认不存在android:maxSdkVersion属性即为修复成功。
补充说明:如果有权限修改声明了
maxSdkVersion="30"的模块源码,也可以直接调整该模块的权限配置,但该方案无法规避后续接入其他依赖时再次出现同类冲突的问题,主模块配置合并规则的方案通用性更强。
内容的提问来源于stack exchange,提问作者Steven Jeuris
相关产品推荐
相关产品推荐

