Xamarin.Android添加android:exported遇重复项,无法发布至Google Play
解决Xamarin.Android + OneSignal 3.2.0的android:exported发布问题
方法1:用Manifest合并规则覆盖自动生成的节点
Xamarin.Android的清单合并支持通过tools命名空间控制节点替换,无需复制完整节点:
- 打开
Properties/AndroidManifest.xml,在根<manifest>标签里添加命名空间:<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="你的应用包名"> - 在
<application>内添加对应<receiver>节点,用tools:node="replace"覆盖自动生成的版本:<!-- 替换OneSignal的GcmBroadcastReceiver --> <receiver android:name="com.onesignal.GcmBroadcastReceiver" android:exported="false" tools:node="replace" /> <!-- 替换OneSignal的NotificationOpenedReceiver --> <receiver android:name="com.onesignal.NotificationOpenedReceiver" android:exported="false" tools:node="replace" />
编译时会用你定义的带android:exported的节点完全替换自动生成的节点,不会出现重复项。
方法2:通过MSBuild任务自动修改生成的清单
如果方法1不生效,直接在项目文件里添加编译任务,自动修正obj目录的临时清单:
- 右键项目 → 编辑项目文件(
.csproj) - 在
<Project>节点内添加以下MSBuild任务:<Target Name="FixOneSignalExportedFlag" AfterTargets="PrepareForBuild"> <!-- 给GcmBroadcastReceiver添加exported=false --> <XmlPoke XmlInputPath="$(IntermediateOutputPath)AndroidManifest.xml" Query="/manifest/application/receiver[@android:name='com.onesignal.GcmBroadcastReceiver']/@android:exported" Value="false" /> <!-- 给NotificationOpenedReceiver添加exported=false --> <XmlPoke XmlInputPath="$(IntermediateOutputPath)AndroidManifest.xml" Query="/manifest/application/receiver[@android:name='com.onesignal.NotificationOpenedReceiver']/@android:exported" Value="false" /> </Target>
这个任务会在编译准备阶段自动修改临时清单里的对应节点,无需手动维护自定义清单。
方法3:临时切换到Visual Studio for Mac编译
既然之前用VS Mac处理时没有重复清单的问题,临时可以用VS Mac打包发布,避开Windows版VS的清单合并逻辑差异。
内容的提问来源于stack exchange,提问作者Blazej
相关产品推荐
相关产品推荐

