Compartilhar via


Personalizando namespaces

Os nomes de pacote Java geralmente não correspondem às convenções de namespace C# devido a problemas como prefixos extras e diferenças de maiúsculas e minúsculas.

Por exemplo, o nome de pacote com.microsoft.streamwriters do Java seria traduzido automaticamente para Com.Microsoft.Streamwriters porque o processo de ligação converte automaticamente os namespaces para notação Pascal. No entanto, um ajuste melhor seria Microsoft.StreamWriters.

Isso pode ser feito adicionando um <AndroidNamespaceReplacement> item ao arquivo de projeto:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft.streamwriters' Replacement='Microsoft.StreamWriters' />
</ItemGroup>

Embora os pacotes Java também possam ser renomeados usando o método tradicional metadata, pode ser tedioso 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 do MSBuild colocada no arquivo de projeto pode ser aplicada a todos os pacotes correspondentes:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>

Especificação

Essas substituições serão executadas apenas para elementos que não especificam um atributo.
Se @managedName for usado, você está optando por fornecer o nome exato desejado, ele não será processado posteriormente.

Ao contrário dos metadados não utilizados, essas substituições não gerarão um aviso se não forem usadas.

Diferenciar maiúsculas de minúsculas

As substituições são executadas após a transformação automática de Pascal Case, mas a comparação é feita ignorando maiúsculas e minúsculas.

Assim, ambos os itens a seguir 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 namespace).

Assim,

<AndroidNamespaceReplacement Include='Com' Replacement='' />

Corresponde a Com.Google.Library, mas não a Common.Google.Library ou Google.Imaging.Dicom.

Várias palavras completas podem ser usadas:

<AndroidNamespaceReplacement Include='Com.Google' Replacement='Google' />
<AndroidNamespaceReplacement Include='Com.Androidx' Replacement='Microsoft.AndroidX' />

Posição da palavra

A correspondência de parte da palavra pode ser restrita ao início ou ao fim de um namespace acrescentando um . ou antepondo um ., respectivamente.

<AndroidNamespaceReplacement Include='Androidx.' Replacement='Microsoft.AndroidX' />

corresponde Androidx.Core, mas não Square.OkHttp.Androidx.

De forma similar,

<AndroidNamespaceReplacement Include='.Compose' Replacement='ComposeUI' />

corresponde Google.AndroidX.Compose, mas não Google.Compose.Writer.

Tanto o prefixo quanto o acréscimo de a . tornam uma correspondência exata.

<AndroidNamespaceReplacement Include='.Androidx.' Replacement='Microsoft.AndroidX' />

corresponde Androidx, mas não Google.Androidx.Core.

Pedido de substituição

As substituições são executadas na ordem especificada pelo <ItemGroup>, no entanto, adicionar a esse grupo em momentos diferentes pode resultar em uma ordem não intencional.

As substituições são executadas sequencialmente e várias substituições podem afetar um único namespace.

<AndroidNamespaceReplacement Include='Androidx' Replacement='Microsoft.AndroidX' />
<AndroidNamespaceReplacement Include='View' Replacement='Views' />

Altera Androidx.View para Microsoft.AndroidX.Views.

Relação com metadados

Tecnicamente @(AndroidNamespaceReplacement) é implementado como um caso especial de <metadata>, e pode ser colocado diretamente em um metadata.xml arquivo em
formulário de metadados, se desejar.

Ou seja, o item MSBuild:

<ItemGroup>
  <AndroidNamespaceReplacement Include='com.microsoft' Replacement='Microsoft' />
</ItemGroup>

poderia ser colocado em metadata.xml como:

<metadata>
  <ns-replace source='com.microsoft' replacement='Microsoft' />
</metadata>