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 True
padrã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 false
false
. 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=link
Release
. 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 SdkOnly
Full
o padrão para configurações de vinculador equivalentes:
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>link</TrimMode>
Com AndroidLinkMode=SdkOnly
o , 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 gerarResource.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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de