调试MSBUILD AndroidManifest合并 排查重复位置权限上传报错
- VS 2022 17.1.0
- Xamarin Android SDK 12.2.0.4
现有一个包含Android目标端的Xamarin Forms项目,近期将Android目标端的targetSdkVersion升级为31(对应Android 12)。尝试将构建生成的签名APK上传至Google Play时,收到如下报错:
权限android.permission.ACCESS_COARSE_LOCATION存在maxSdkVersion属性不一致的重复声明;权限android.permission.ACCESS_FINE_LOCATION存在maxSdkVersion属性不一致的重复声明。
提取VS2022构建输出的签名APK内的AndroidManifest.xml文件,可见如下冲突的权限声明条目:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" /> <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
补充说明:当前已正式发布的线上版本targetSdkVersion为30(对应Android 11),该版本的合并后清单文件中同样存在上述重复权限条目,但Google Play未触发同类报错。
项目主AndroidManifest.xml相关配置片段如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="3.7.0" android:installLocation="0" android:compileSdkVersion="31" android:compileSdkVersionCodename="12" package="com.OurCompany.OurApp" platformBuildVersionCode="31" platformBuildVersionName="12"> <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="31" /> OTHER VALUES REMOVED </manifest>
定位冲突来源
构建Android项目时,编译流程会自动生成完整的Manifest合并溯源报告,文件存放在Android项目目录下的obj\对应构建配置\12.0\android\manifest\merger文件夹中,文件名为manifest-merger-构建配置-report.txt(比如Release渠道包对应manifest-merger-release-report.txt)。打开文件后直接搜索ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION关键词,每一条权限声明的来源都会明确标注:是主项目Manifest手动添加、哪个NuGet依赖包注入、还是SDK内置配置,可直接定位到冲突条目的具体来源。常见冲突原因
附带android:maxSdkVersion="30"的两个位置权限声明,绝大多数是低版本Xamarin.Essentials、Xamarin.AndroidX.Core类库自动注入的。之前targetSdkVersion设为30时,maxSdkVersion=30的条目和无版本限制的权限条目不会触发Google Play校验规则;升级到targetSdkVersion 31后,Google Play会对覆盖到31版本的所有权限声明做一致性校验,因此抛出重复声明错误。修复操作
如果冲突条目来自第三方依赖无法直接修改,可在主项目的AndroidManifest.xml中直接移除冲突的旧条目:
- 在manifest根节点补充tools命名空间声明:
xmlns:tools="http://schemas.android.com/tools" - 在manifest节点下(与uses-sdk同级)添加如下移除节点:
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove" /> <uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove" />
重新构建后解压APK检查最终的AndroidManifest.xml,确认仅保留无maxSdkVersion限制的两个位置权限条目,即可正常上传Google Play。
内容的提问来源于stack exchange,提问作者Pat Long - Munkii Yebee

