如何在Xamarin构建过程中修改生成的AndroidManifest文件?
解决Xamarin构建过程中修改生成的AndroidManifest文件的方案
问题原因说明
你之前直接在Properties/AndroidManifest.xml中添加<service>标签报错APT2263,是因为该标签没有放置在<application>节点内部;即便放置正确,也可能因为DLL中已自动生成该service节点导致合并冲突。由于无法升级DLL,最可靠的方式是在构建过程中生成AndroidManifest之后、打包之前,直接修改obj目录下的生成文件。
解决方案:通过MSBuild自定义任务修改生成的Manifest
Xamarin.Android基于MSBuild构建,我们可以在项目的.csproj文件中添加自定义Target,自动执行修改操作:
方法1:使用PowerShell脚本修改(灵活性高)
- 右键你的Xamarin.Android项目,选择编辑项目文件打开
.csproj - 在文件末尾的
</Project>标签之前,添加以下代码:
<Target Name="ModifyGeneratedAndroidManifest" AfterTargets="_GenerateAndroidManifest"> <!-- 指定生成的Manifest文件路径 --> <PropertyGroup> <GeneratedManifestPath>$(IntermediateOutputPath)android\AndroidManifest.xml</GeneratedManifestPath> </PropertyGroup> <!-- 执行PowerShell脚本修改XML --> <Exec Command='powershell -Command "$xml = [xml](Get-Content ''$(GeneratedManifestPath)''); $nsManager = New-Object System.Xml.XmlNamespaceManager($xml.NameTable); $nsManager.AddNamespace(''android'', ''http://schemas.android.com/apk/res/android''); $serviceNode = $xml.SelectSingleNode(''/manifest/application/service[@android:name=''crc6494e14b9856016c30.PNFirebaseMessagingService'']'', $nsManager); if ($serviceNode -ne $null) { $serviceNode.SetAttribute(''exported'', ''http://schemas.android.com/apk/res/android'', ''true'') } $xml.Save(''$(GeneratedManifestPath)'')"' /> </Target>
方法2:使用MSBuild的XmlPoke任务(更轻量化)
如果你的环境中PowerShell执行受限,可以用MSBuild内置的XmlPoke任务,同样添加到.csproj文件末尾:
<Target Name="ModifyGeneratedAndroidManifest" AfterTargets="_GenerateAndroidManifest"> <PropertyGroup> <GeneratedManifestPath>$(IntermediateOutputPath)android\AndroidManifest.xml</GeneratedManifestPath> <AndroidXmlNs>http://schemas.android.com/apk/res/android</AndroidXmlNs> </PropertyGroup> <!-- 为目标service节点添加android:exported="true"属性 --> <XmlPoke XmlInputPath="$(GeneratedManifestPath)" Query="/manifest/application/service[@android:name='crc6494e14b9856016c30.PNFirebaseMessagingService']/@android:exported" Value="true" Namespaces="<Namespace Prefix='android' Uri='$(AndroidXmlNs)' />" /> </Target>
验证操作
- 保存
.csproj文件,重新构建项目 - 构建完成后,打开
obj\Release\120\android\AndroidManifest.xml(路径根据你的配置调整),检查目标<service>节点是否已添加android:exported="true"属性
内容的提问来源于stack exchange,提问作者user1853472
相关产品推荐
相关产品推荐

