Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os nomes dos pacotes Java muitas vezes não correspondem às convenções do espaço de nomes C# devido a problemas como prefixos extra e diferenças de capitalização.
Por exemplo, o nome com.microsoft.streamwriters do pacote Java seria automaticamente traduzido para Com.Microsoft.Streamwriters porque o processo de ligação converte automaticamente os namespaces para caso Pascal. No entanto, uma opção melhor seria Microsoft.StreamWriters.
Isto pode ser conseguido adicionando um <AndroidNamespaceReplacement> item ao ficheiro do projeto:
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft.streamwriters' Replacement='Microsoft.StreamWriters' />
</ItemGroup>
Embora os pacotes Java também possam ser renomeados usando o tradicional metadata, pode ser aborrecido renomear muitos pacotes semelhantes:
<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>
...
Com <AndroidNamespaceReplacement>, a mesma transformação MSBuild colocada no ficheiro do projeto pode ser aplicada a todos os pacotes correspondentes:
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>
Especificação
Estas substituições só serão executadas para <package> elementos que não especifiquem um metadata@managedName atributo.
Caso @managedName seja utilizado, estará a optar por fornecer o nome exato desejado, e não será processado posteriormente.
Ao contrário dos metadados não utilizados, estas substituições não geram um aviso se não forem utilizadas.
Sensível às maiúsculas e minúsculas
As substituições ocorrem após a transformação automática para maiúsculas e minúsculas em Pascal, mas a comparação é insensível a maiúsculas e minúsculas.
Assim, ambos os seguintes são equivalentes:
<AndroidNamespaceReplacement Include='Androidx' Replacement='AndroidX' />
<AndroidNamespaceReplacement Include='androidx' Replacement='AndroidX' />
Limites de palavras
As substituições ocorrem apenas em palavras completas (partes do espaço de nomes).
Assim,
<AndroidNamespaceReplacement Include='Com' Replacement='' />
Combina com Com.Google.Library, mas não com Common.Google.Library ou Google.Imaging.Dicom.
Podem ser usadas várias palavras completas:
<AndroidNamespaceReplacement Include='Com.Google' Replacement='Google' />
<AndroidNamespaceReplacement Include='Com.Androidx' Replacement='Microsoft.AndroidX' />
Posição da palavra
A correspondência de segmentos da palavra pode ser restringida ao início ou ao fim de um namespace, acrescentando um . ou antepondo um ., respetivamente.
<AndroidNamespaceReplacement Include='Androidx.' Replacement='Microsoft.AndroidX' />
corresponde Androidx.Core, mas não Square.OkHttp.Androidx.
Do mesmo modo,
<AndroidNamespaceReplacement Include='.Compose' Replacement='ComposeUI' />
corresponde a Google.AndroidX.Compose, mas não a Google.Compose.Writer.
Tanto o prepender como o acrescentar a . torna-o uma correspondência exata.
<AndroidNamespaceReplacement Include='.Androidx.' Replacement='Microsoft.AndroidX' />
corresponde Androidx, mas não Google.Androidx.Core.
Ordem de substituição
As substituições são executadas na ordem especificada pelo <ItemGroup>, no entanto, adicionar a este grupo em momentos diferentes pode resultar numa ordem não intencional.
As substituições são executadas sequencialmente, e múltiplas substituições podem afetar um único namespace.
<AndroidNamespaceReplacement Include='Androidx' Replacement='Microsoft.AndroidX' />
<AndroidNamespaceReplacement Include='View' Replacement='Views' />
muda Androidx.View para Microsoft.AndroidX.Views.
Relação com metadados
Tecnicamente @(AndroidNamespaceReplacement) é implementado como um caso especial de <metadata>, e pode ser colocado diretamente num metadata.xml ficheiro em
formulário de metadados, se desejado.
Ou seja, o item do MSBuild:
<ItemGroup>
<AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>
poderia antes ser colocado em metadata.xml como:
<metadata>
<ns-replace source='com.microsoft' replacement='Microsoft' />
</metadata>