Migração do projeto Xamarin.Android

Um projeto .NET 8 para um aplicativo .NET Android é semelhante ao exemplo a seguir:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>

Para um projeto de biblioteca, omita a $(OutputType) propriedade completamente ou especifique Library como o valor da propriedade.

Arquivos de configuração do .NET

Não há suporte para arquivos de configuração, como Foo.dll.config ou Foo.exe.config em projetos .NET Android. <dllmap> elementos de configuração não são suportados no .NET Core e outros tipos de elementos para pacotes de compatibilidade como System.Configuration.ConfigurationManager nunca foram suportados em projetos Android.

Alterações nas propriedades do MSBuild

A $(AndroidSupportedAbis) propriedade não deve ser usada:

<PropertyGroup>
  <!-- Used in Xamarin.Android projects -->
  <AndroidSupportedAbis>armeabi-v7a;arm64-v8a;x86;x86_64</AndroidSupportedAbis>
</PropertyGroup>

Em vez disso, a $(AndroidSupportedAbis) propriedade deve ser substituída por identificadores de tempo de execução do .NET:

<PropertyGroup>
  <!-- Used in .NET Android projects -->
  <RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
</PropertyGroup>

Para obter mais informações sobre identificadores de tempo de execução, consulte Catálogo de RID do .NET.

A tabela a seguir mostra outras propriedades do MSBuild que foram alteradas no .NET Android:

Propriedade Comentários
$(AndroidUseIntermediateDesignerFile) True por padrão.
$(AndroidBoundExceptionType) System por padrão. Essa propriedade altera os tipos de exceções lançadas de vários métodos para melhor alinhar com a semântica do .NET, ao custo da compatibilidade com o Xamarin.Android. Para obter mais informações, consulte Algumas das novas exceções Java encapsuladas usam exceções BCL que diferem dos tipos BCL relacionados.
$(AndroidClassParser) class-parse por padrão. Não há suporte para jar2xml.
$(AndroidDexTool) d8 por padrão. Não há suporte para dx.
$(AndroidCodegenTarget) XAJavaInterop1 por padrão. Não há suporte para XamarinAndroid.
$(AndroidManifest) O padrão é na raiz de projetos porque Properties\AssemblyInfo.cs não é AndroidManifest.xml mais usado em projetos no estilo SDK. Properties\AndroidManifest.xml também será detectado e usado, se existir, para facilitar a migração.
$(DebugType) portable por padrão. full e pdbonly não são suportados.
$(MonoSymbolArchive) False, uma vez que mono-symbolicate não é suportado.

Além disso, se a vinculação Java estiver ativada com @(InputJar), ou @(LibraryProjectZip), @(EmbeddedJar)a propriedade assumirá $(AllowUnsafeBlocks) como Truepadrão .

Observação

Não há suporte para referenciar um projeto do Android Wear a partir de um aplicativo Android.

Alterações no AndroidManifest.xml

Em projetos Xamarin.Android, Java e Kotlin Android, o <uses-sdk/> elemento indica a versão mínima do Android que seu aplicativo suporta, bem como a versão Android de destino na qual seu aplicativo é compilado:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.companyname.myapp">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
  <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" />
</manifest>

Para obter mais informações sobre o <uses-sdk/> elemento, consulte a documentação do Android.

Em aplicativos Android .NET 8, há propriedades MSBuild para definir esses valores. Usar as propriedades do MSBuild tem outros benefícios. Na maioria dos casos, o <uses-sdk/> elemento deve ser removido em favor de valores no arquivo do .csproj projeto:

<Project>
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
  </PropertyGroup>
</Project>

Neste exemplo, net8.0-android é a abreviação de net8.0-android34.0. Versões futuras do .NET rastrearão a versão mais recente do Android disponível no momento da versão do .NET.

O TargetFramework é mapeado para android:targetSdkVersion. No momento da compilação, esse valor será automaticamente incluído no <uses-sdk/> elemento para você. A vantagem de usar TargetFramework dessa maneira é que você recebe a vinculação C# correspondente para a API 34 do Android para net8.0-android34.0. Versões do Android independentemente do ciclo de lançamento do .NET, portanto, temos a flexibilidade de optar net8.0-android35.0 por quando uma associação estiver disponível para a próxima versão do Android.

Da mesma forma, SupportedOSPlatformVersion mapeia para android:minSdkVersion. No momento da compilação, esse valor será automaticamente incluído no <uses-sdk/> elemento para você. As APIs do Android são decoradas com o SupportedOSPlatformAttribute para que você receba avisos de compilação para chamar APIs que estão disponíveis apenas para algumas das versões do Android em que seu aplicativo pode ser executado:

error CA1416: This call site is reachable on 'Android' 21.0 and later. `ConnectivityManager.ActiveNetwork` is only supported on: 'Android' 23.0 and later.

Para usar essa API com segurança, você pode declarar uma API superior em seu projeto ou usar a IsAndroidVersionAtLeast API SupportedOSPlatformVersion em tempo de execução:

if (OperatingSystem.IsAndroidVersionAtLeast(23))
{
    // Use the API here
}

Inclusão de arquivo padrão

O comportamento padrão de globbing de arquivo relacionado ao .NET Android é definido no AutoImport.props. Esse comportamento pode ser desabilitado para itens do Android definindo $(EnableDefaultAndroidItems) como , ou todo o comportamento de inclusão de item padrão pode ser desabilitado definindo $(EnableDefaultItems) como falsefalse. Para obter mais informações, consulte Arquivos de props de carga de trabalho.

Comportamento de tempo de execução

Há alterações comportamentais no String.IndexOf() método no .NET 5+ em diferentes plataformas. Para mais informações, confira Globalização do .NET e ICU.

Vinculador

O .NET 5+ tem novas configurações para o vinculador:

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>, que permite o corte no nível do membro.

Para obter mais informações, consulte Opções de corte.

Em projetos .NET Android por padrão, Debug as compilações não usam o vinculador e compilações set PublishTrimmed=true e TrimMode=linkRelease . TrimMode=copyused é o padrão para o SDK do .NET, mas não é apropriado para aplicativos móveis. No entanto, você ainda pode optar por participar TrimMode=copyused , se necessário.

Se a configuração herdada AndroidLinkMode for usada, ambas e SdkOnlyFull o padrão para configurações de vinculador equivalentes:

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>

Com AndroidLinkMode=SdkOnlyo , somente os assemblies BCL e SDK marcados com %(Trimmable) são vinculados no nível do membro. AndroidLinkMode=Full em %(TrimMode)=link todos os assemblies .NET.

Dica

Você deve migrar para as novas configurações do vinculador, pois a AndroidLinkMode configuração será eventualmente preterida.

Compilação antecipada

$(RunAOTCompilation) é a nova propriedade MSBuild para habilitar a compilação Ahead-of-Time (AoT). Esta é a mesma propriedade usada para Blazor WASM. A $(AotAssemblies) propriedade também habilita o AOT, a fim de ajudar com a migração de projetos Xamarin.Android para projetos Android .NET.

Dica

Você deve migrar para a nova $(RunAOTCompilation) propriedade, porque $(AotAssemblies) foi preterida do .NET 7.

Release cria como padrão os seguintes valores de propriedade AOT:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>true</RunAOTCompilation>
  <AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>

Esse é o comportamento quando as propriedades e são desdefinidas e escolhe as $(RunAOTCompilation) configurações ideais para o tempo de inicialização e $(AndroidEnableProfiledAot) o tamanho do aplicativo.

Para desabilitar o AOT, você precisa definir explicitamente as $(RunAOTCompilation) propriedades e $(AndroidEnableProfiledAot) como false:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>false</RunAOTCompilation>
  <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
</PropertyGroup>

Codificações suportadas

Se seu aplicativo Xamarin.Android usa determinados conjuntos de códigos internacionais, eles precisam ser especificados explicitamente no arquivo de projeto usando a Mandroidl18n propriedade MSBuild, para que o vinculador possa incluir recursos de suporte. Para obter mais informações sobre essa propriedade de compilação, consulte MAndroidl18n.

No entanto, a Mandroidl18n propriedade MSBuild não tem suporte em aplicativos .NET Android. Em vez disso, o suporte é fornecido pelo pacote NuGet System.TextEncoding.CodePages . Para obter mais informações, consulte CodePagesEncodingProvider.

CLI do .NET

O .NET Android oferece suporte ao uso da interface de linha de comando do .NET (CLI do .NET) para criar, compilar, publicar e executar aplicativos Android.

dotnet new

dotnet new pode ser usado para criar novos projetos e itens do .NET Android usando modelos de projeto e modelos de item que são nomeados seguindo os padrões e a nomenclatura de modelos .NET existentes:

Template Nome curto Idioma Marcações
Modelo de atividade do Android android-atividade C# Android
Vinculação da Biblioteca Java do Android android-bindinglib C# Android
Modelo de layout do Android android-layout C# Android
Biblioteca de classes do Android androidlib C# Android
Aplicativo Android android C# Android

Os exemplos a seguir mostram o uso dotnet new para criar diferentes tipos de projetos .NET Android:

dotnet new android            --output MyAndroidApp     --packageName com.mycompany.myandroidapp
dotnet new androidlib         --output MyAndroidLibrary
dotnet new android-bindinglib --output MyJavaBinding

Depois que os projetos do .NET Android tiverem sido criados, os modelos de item poderão ser usados para adicionar itens aos projetos:

dotnet new android-activity --name LoginActivity --namespace MyAndroidApp
dotnet new android-layout   --name MyLayout      --output Resources/layout

dotnet build & publicar

Para .NET Android, dotnet build produz um aplicativo executável. Isso significa criar um .apk arquivo ou .aab durante o processo de compilação e reordenar as tarefas do MSBuild do SDK do .NET para que elas sejam executadas durante a compilação. Portanto, o .NET Android faz o seguinte durante uma compilação:

  • Executar aapt para gerar Resource.designer.cs e potencialmente emitir erros de compilação para problemas em @(AndroidResource) arquivos.
  • Compile código C#.
  • Execute o destino ILLink MSBuild para vinculação.
  • Gerar stubs java e AndroidManifest.xml.
  • Compilar código java via javac.
  • Converter código java para .dex via d8/r8.
  • Crie um .apk ou .aab e assine-o.

dotnet publish é reservado para a publicação de um aplicativo para o Google Play e outros mecanismos de distribuição, como ad-hoc. Ele também assina o .apk ou .aab com chaves diferentes.

Observação

O comportamento dentro dos IDEs será diferente. O Build destino não produzirá um .apk arquivo se $(BuildingInsideVisualStudio) for true. Os IDEs chamarão o destino para implantação, que produzirá o Install.apk arquivo. Esse comportamento corresponde ao Xamarin.Android.

dotnet run

dotnet run pode ser usado para iniciar aplicativos em um dispositivo ou emulador através do --project argumento:

dotnet run --project HelloAndroid.csproj

Como alternativa, você pode usar o Run destino MSBuild:

dotnet build HelloAndroid.csproj -t:Run

Confira também