Java 包名称通常与 C# 命名空间约定不匹配,因为存在额外的前缀和大写差异等问题。
例如,Java 包名称 com.microsoft.streamwriters 将自动转换为 Com.Microsoft.Streamwriters ,因为绑定过程会自动将命名空间转换为 Pascal 大小写。 然而,更合适的选择是 Microsoft.StreamWriters。
可以通过向项目文件添加项 <AndroidNamespaceReplacement> 来实现此目的:
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft.streamwriters' Replacement='Microsoft.StreamWriters' />
</ItemGroup>
尽管 Java 包也可以使用传统 metadata包进行重命名,但重命名许多类似的包可能很繁琐:
<attr path="/api/package[@name='com.microsoft.accessibility']" name="managedName">Microsoft.Accessibility</attr>
<attr path="/api/package[@name='com.microsoft.content']" name="managedName">Microsoft.Content</attr>
<attr path="/api/package[@name='com.microsoft.core']" name="managedName">Microsoft.Core</attr>
...
使用<AndroidNamespaceReplacement>,可以将项目文件中放置的相同 MSBuild 变换应用于所有匹配的包。
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>
规范
这些替换项仅针对<package>未指定metadata@managedName属性的元素运行。
如果使用@managedName,则表示选择提供明确的所需名称,它将不会被进一步处理。
与未使用的元数据不同,如果未使用,这些替换项将不会引发警告。
事例敏感性
替换在自动 Pascal 大小写转换后执行,但比较时不区分大小写。
因此,以下两项都是等效的:
<AndroidNamespaceReplacement Include='Androidx' Replacement='AndroidX' />
<AndroidNamespaceReplacement Include='androidx' Replacement='AndroidX' />
词边界
替换操作仅在完整单词(命名空间部分)上进行。
因此,
<AndroidNamespaceReplacement Include='Com' Replacement='' />
匹配Com.Google.Library,但不匹配Common.Google.Library或Google.Imaging.Dicom。
可以使用多个完整单词:
<AndroidNamespaceReplacement Include='Com.Google' Replacement='Google' />
<AndroidNamespaceReplacement Include='Com.Androidx' Replacement='Microsoft.AndroidX' />
单词位置
单词部分匹配可以通过在命名空间的结尾附加 . 或在开头加上 . 来限制。
<AndroidNamespaceReplacement Include='Androidx.' Replacement='Microsoft.AndroidX' />
Androidx.Core匹配,但Square.OkHttp.Androidx不匹配。
类似地,
<AndroidNamespaceReplacement Include='.Compose' Replacement='ComposeUI' />
Google.AndroidX.Compose 匹配,但不匹配 Google.Compose.Writer。
在前面添加和在后面附加.都会使其精确匹配。
<AndroidNamespaceReplacement Include='.Androidx.' Replacement='Microsoft.AndroidX' />
匹配Androidx,但不匹配Google.Androidx.Core。
替换顺序
替换项按照<ItemGroup>指定的顺序运行,然而在不同时间添加到此组可能会导致顺序意外。
替换按顺序运行,多个替换可能会影响单个命名空间。
<AndroidNamespaceReplacement Include='Androidx' Replacement='Microsoft.AndroidX' />
<AndroidNamespaceReplacement Include='View' Replacement='Views' />
将 Androidx.View 更改为 Microsoft.AndroidX.Views。
与元数据的关系
技术上,@(AndroidNamespaceReplacement) 是作为 <metadata> 的特殊情况实现的,并且可以直接放置在 metadata.xml 文件中。
元数据表单(如果需要)。
也就是说,MSBuild 的项目条目:
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>
可以改为放置在 metadata.xml :
<metadata>
<ns-replace source='com.microsoft' replacement='Microsoft' />
</metadata>