Visão geral de recursos e APIs

O Android 13 introduz ótimos recursos e APIs novos para desenvolvedores. As seções abaixo ajudam você a conhecer os recursos dos apps e a começar a usar as APIs relacionadas.

Para uma lista detalhada das APIs novas, modificadas e removidas, leia o Relatório de diferenças da API. Para ver detalhes sobre as novas APIs, acesse a Referência da API do Android. As APIs novas estão em destaque para melhor visibilidade. Além disso, para saber mais sobre as áreas em que as mudanças na plataforma podem afetar seus apps, consulte as mudanças de comportamento do Android 13 para apps destinados ao Android 13 e para todos os apps.

Produtividade do desenvolvedor

Nova IU de copiar e colar

A partir do Android 13, o sistema mostra uma confirmação visual padrão ao adicionar conteúdo à área de transferência. A nova confirmação faz o seguinte:

  • Confirma que o conteúdo foi copiado.
  • Oferece uma visualização do conteúdo copiado.

Esse recurso padroniza as várias notificações exibidas pelos apps após copiar um conteúdo e oferece aos usuários mais controle sobre a área de transferência. Para mais informações, acesse a página do recurso copiar e colar.

Widget do recurso copiar e colar
Nova IU exibida quando o conteúdo é inserido na área de transferência.

Gesto "Voltar" preditivo

O Android 13 introduz um gesto "Voltar" preditivo para os dispositivos Android, como smartphones, telas grandes e dobráveis. Para que haja suporte a esse recurso, é necessário atualizar o app.

Para ver a documentação detalhada, consulte Atualizar o app para oferecer suporte ao gesto "Voltar" preditivo. Você também pode consultar nosso codelab.

Ícones de app com tema

Usuário ativando ícones temáticos de apps
Figura 1: ativação de ícones temáticos para apps no Android 13

Começando pelo Android 13, os usuários podem ativar ícones de app com tema. Com esse recurso, os ícones dos apps em telas de início compatíveis do Android herdam a tonalidade da cor do plano de fundo escolhido e de outros temas.

Para oferecer suporte a esse recurso, o app precisa fornecer um ícone adaptativo e um ícone monocromático, bem como apontar para o ícone monocromático do elemento <adaptive-icon> no manifesto. Caso o usuário tenha ativado a opção Ícones com tema nas configurações do sistema e a tela de início ofereça suporte a esse recurso, o sistema usa a cor do plano de fundo e o tema escolhidos pelo usuário para determinar a cor da tonalidade a ser aplicada ao ícone monocromático do app.

Em qualquer um dos casos a seguir, a tela inicial NÃO mostra o ícone do app com tema, mas sim o ícone adaptativo ou padrão:

  • Se o usuário não tiver ativado a opção de ícones com tema.
  • Se o app não tiver um ícone monocromático.
  • Se a tela de início não oferecer suporte para ícones de apps com tema.

Especificações

Ícones monocromáticos de apps precisam atender a estas especificações:

  • O ícone precisa ser um VectorDrawable.
  • Recomendamos que o logotipo se encaixe em uma área de 44 x 44 dp em um contêiner de 108 x 108 dp. Se o logotipo precisar ser maior, ele pode ter o tamanho máximo de 72 x 72 dp.
  • Recomendamos logotipos planos. Se o logotipo for tridimensional, use o gradiente alfa.

Você pode apontar o atributo monocromático para o mesmo VectorDrawable usado pela camada de primeiro plano do ícone do app adaptativo ou reutilizar o drawable vetorial usado para notificações.

O exemplo abaixo mostra um ícone monocromático de app para o Google app, com linhas pontilhadas que representam os limites entre as áreas do logotipo e do contêiner. Eles são apresentados aqui apenas para fins ilustrativos e não estão de acordo com a escala real.

Especificações de design monocromático para um ícone temático de app: o ícone à
            esquerda tem linhas pontilhadas que representam as medidas, com a linha
            pontilhada externa rotulada como &quot;1&quot; representando o contêiner do ícone
            e a linha pontilhada interna rotulada como &quot;2&quot; representando a área
            do logotipo. O ícone à direita é aparência sem as
            linhas pontilhadas adicionadas.
Figura 2: medições do ícone temático de apps

1 Área do contêiner (108 x 108 dp).

2 Área do logotipo (recomenda-se 44 x 44 dp, no máximo 72 x 72 dp).

Implementar um ícone temático para o app

Adicione o atributo monochrome android:drawable ao elemento <adaptive-icon>. Por exemplo, em res/mipmap-anydpi-v26/ic_launcher.xml:

<adaptive-icon >
    <background android:drawable="..." />
    <foreground android:drawable="..." />
    <monochrome android:drawable="@drawable/myicon" />
</adaptive-icon>

No arquivo de manifesto, defina o ícone usando android:icon:

<application
    …
    android:icon="@mipmap/ic_launcher"
    …>
</application>

API de posicionamento para Configurações rápidas

As Configurações rápidas na aba de notificações são uma maneira conveniente para o usuário mudar configurações ou realizar ações rápidas sem sair do contexto de um app. Deixamos mais fácil encontrar e adicionar apps que fornecem blocos personalizados às Configurações rápidas. Usando uma nova API de posicionamento de bloco, o app agora pode solicitar que o usuário adicione diretamente um bloco personalizado ao conjunto de blocos ativos de Configurações rápidas. Em vez de precisar acessar as Configurações rápidas para adicionar o bloco, uma nova caixa de diálogo do sistema permite que ele o adicione em uma única etapa, sem sair do app.

Uma caixa de diálogo perguntando se o usuário quer adicionar um bloco às
          Configurações rápidas.

Melhorias no suporte para usuários multilíngues

O Android 13 introduz vários recursos para melhorar as experiências do app para usuários multilíngues, descritas nas seções abaixo:

Preferências de idioma por app

Em muitos casos, os usuários multilíngues definem um idioma para o sistema, como o inglês, mas querem selecionar outros idiomas para apps específicos, como holandês, chinês ou hindi. A fim de ajudar os apps a oferecer uma melhor experiência a esses usuários, o Android 13 introduz os recursos abaixo para apps que oferecem suporte a vários idiomas:

  • Configurações do sistema que permitem que os usuários selecionem o idioma preferido para cada app em um só lugar.

    Para informar ao sistema que ele oferece suporte para vários idiomas, o app precisa declarar o atributo android:localeConfig no manifesto. Para saber mais, consulte as instruções sobre como criar um arquivo de recursos e declará-lo no arquivo de manifesto do app.

  • APIs que permitem que os apps definam um idioma diferente para ser usado na interface do usuário durante a execução.

    Apps que usam seletores de idioma personalizados precisam usar essas novas APIs para garantir que os usuários tenham uma experiência consistente, independente do local em que selecionarem as preferências de idioma. As novas APIs também ajudam a reduzir a quantidade de código boilerplate, oferecem suporte para APKs divididos e para Backup automático, permitindo que os apps armazenem as seleções de idioma do usuário.

    Para oferecer compatibilidade com versões anteriores do Android, as APIs também estão disponíveis no AndroidX. Recomendamos o uso do Appcompat 1.6.0-alpha03 ou versões mais recentes.

    Para saber mais, consulte as instruções para implementar as novas APIs.

Melhoria no ajuste de texto em japonês

Agora, as TextViews conseguem ajustar o texto com base no bunsetsu (menor unidade sonora significativa) ou em frases, e não por caractere. Dessa forma, é possível proporcionar aplicativos mais elaborados e mais legíveis em japonês. Para aproveitar esse recurso, use android:lineBreakWordStyle="phrase" com as TextViews.

Ajuste de texto em japonês com base em frases ativado (abaixo) e desativado (acima).

Melhorias na altura de linhas para textos em idiomas não latinos

O Android 13 melhora a exibição de textos em idiomas não latinos, como tâmil, birmanês, télugo e tibetano, usando uma altura de linha adaptada a cada idioma. As alturas das novas linhas evitam cortes e melhoram o posicionamento dos caracteres. Para aproveitar essas melhorias, basta destinar o app ao Android 13. É importante fazer testes no app ao usar o novo espaçamento entre linhas, porque as mudanças podem afetar a IU em idiomas não latinos.

Alturas de linha cortadas no Android 12 (acima) e que agora ficam melhor posicionadas e não são cortadas no Android 13 (abaixo).

APIs Text Conversion

Falantes de idiomas como o japonês e o chinês usam métodos de entrada com alfabeto fonético, que geralmente reduzem a velocidade da pesquisa e de recursos como o preenchimento automático. No Android 13, os apps podem chamar a nova API Text Conversion para que os usuários consigam encontrar o que procuram com mais rapidez e facilidade. Antes, para fazer uma pesquisa, um usuário falante de japonês precisava seguir estas etapas:

  1. Inserir o hiragana com a pronúncia fonética do termo de pesquisa, como um lugar ou o nome de um app.
  2. Usar o teclado para converter os caracteres hiragana em kanji.
  3. Pesquisar novamente usando os caracteres kanji.
  4. Finalmente, ver os resultados da pesquisa.

Com a nova API de conversão de texto, os usuários falantes de japonês podem digitar em hiragana e receber imediatamente os resultados da pesquisa em kanji, pulando as etapas 2 e 3.

Atualizações da biblioteca Unicode

O Android 13 adiciona as melhorias, correções e mudanças mais recentes incluídas em Unicode ICU 70, Unicode CLDR 40 e Unicode 14.0 (links em inglês).

Veja algumas mudanças importantes:

  • O inglês en‑CA (Canadá) e o inglês en‑PH (República das Filipinas) usam recursos de tradução do inglês en (Estados Unidos) quando não há recursos de tradução disponíveis, em vez de usar o inglês en‑GB (Reino Unido).
  • A categoria plural many foi introduzida para os idiomas espanhol es, italiano it, português pt e português pt‑PT (Portugal). De forma parecida com o francês introduzido no CLDR v38 (link em inglês), ela é usada para grandes números.

Hifenização mais rápida

A hifenização facilita a leitura de texto agrupado e ajuda a tornar a IU mais adaptativa. No Android 13, otimizamos o desempenho da hifenização em até 200% para que você possa a ativar na TextView sem afetar o desempenho da renderização. Para permitir uma hifenização mais rápida, use as novas frequências fullFast ou normalFast no método setHyphenationFrequency().

Fontes vetoriais coloridas

Emoji vetorial em COLRv1 (à esquerda) e emoji em bitmap (à direita)

O Android 13 adiciona suporte à renderização de fontes COLRv1 e atualiza os emojis do sistema para o formato COLRv1. COLRv1 é um formato de fonte novo e altamente compacto, que é renderizado de forma rápida e nítida em qualquer tamanho.

Na maioria dos apps, o sistema processa tudo e o COLRv1 funciona normalmente. No entanto, caso o app implemente uma renderização de texto própria e use as fontes do sistema, recomendamos testar a renderização de emojis.

Para saber mais sobre o COLRv1, consulte os recursos abaixo:

Áudio bluetooth de baixa energia

O áudio de baixa energia é o formato de áudio sem fio de última geração criado para substituir o Bluetooth clássico e permitir novos casos de uso e topologias de conexão. Isso vai permitir que os usuários compartilhem e transmitam áudio a amigos e familiares ou que participem de transmissões públicas para ter acesso a informações, entretenimento ou recursos de acessibilidade. Esse formato foi projetado para garantir que os usuários recebam áudio de alta fidelidade sem sacrificar a duração da bateria e possam alternar entre diferentes casos de uso que não eram possíveis com o Bluetooth clássico. O Android 13 inclui suporte integrado ao áudio de baixa energia. Os desenvolvedores vão receber os novos recursos sem custos financeiros em dispositivos compatíveis.

MIDI 2.0

O Android 13 adiciona suporte ao novo padrão MIDI 2.0, incluindo a possibilidade de conectar hardware MIDI 2.0 por USB. Esse padrão atualizado oferece recursos como maior resolução para controladores, melhor compatibilidade com entonação não ocidental e desempenho mais expressivo usando controladores por nota.

Privacidade e segurança

Exportação mais segura de receptores registrados por contexto

Para ajudar a tornar os receptores de execução mais seguros, o Android 13 permite que você defina se um broadcast receiver específico no app precisa ser exportado e ficar visível para outros apps no dispositivo. Se o broadcast receiver for exportado, outros apps vão poder enviar transmissões desprotegidas ao seu app. Essa configuração de exportação, disponível para apps destinados ao Android 13 ou versões mais recentes, pode ajudar a evitar uma das principais fontes de vulnerabilidades de apps.

Nas versões anteriores do Android, qualquer app no dispositivo podia enviar uma transmissão desprotegida a um receptor registrado dinamicamente, a menos que esse receptor fosse protegido por uma permissão de assinatura.

Para implementar essa medida de melhoria de segurança, faça o seguinte:

  1. Ative a mudança do framework de compatibilidade DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED.
  2. Indique explicitamente em cada broadcast receiver do app se outros apps podem enviar transmissões a ele, conforme mostrado no snippet de código abaixo:

    Kotlin

    // This broadcast receiver should be able to receive broadcasts from other apps.
    // This option causes the same behavior as setting the broadcast receiver's
    // "exported" attribute to true in your app's manifest.
    context.registerReceiver(sharedBroadcastReceiver, intentFilter,
        RECEIVER_EXPORTED)
    
    // For app safety reasons, this private broadcast receiver should **NOT**
    // be able to receive broadcasts from other apps.
    context.registerReceiver(privateBroadcastReceiver, intentFilter,
        RECEIVER_NOT_EXPORTED)

    Java

    // This broadcast receiver should be able to receive broadcasts from other apps.
    // This option causes the same behavior as setting the broadcast receiver's
    // "exported" attribute to true in your app's manifest.
    context.registerReceiver(sharedBroadcastReceiver, intentFilter,
        RECEIVER_EXPORTED);
    
    // For app safety reasons, this private broadcast receiver should **NOT**
    // be able to receive broadcasts from other apps.
    context.registerReceiver(privateBroadcastReceiver, intentFilter,
        RECEIVER_NOT_EXPORTED);

Seletor de fotos

O Android 13 (API de nível 33) inclui uma nova experiência do seletor de fotos. Quando o app inicia o seletor de fotos, os usuários selecionam imagens e vídeos específicos para compartilhar, como fotos do perfil, em vez de conceder acesso a ele para ver toda a biblioteca de mídia.

O seletor de fotos oferece melhor privacidade aos usuários porque o app não precisa declarar nenhuma permissão de execução. Além disso, ele fornece uma IU integrada e padronizada para apps, o que cria uma experiência do usuário mais consistente.

Nova permissão de execução para dispositivos Wi-Fi por perto

O Android 13 (API de nível 33) introduz uma nova permissão de execução no grupo de permissões NEARBY_DEVICES para apps que gerenciam as conexões de um dispositivo aos pontos de acesso Wi-Fi por perto. Esses apps precisam declarar a nova permissão, NEARBY_WIFI_DEVICES, quando chamam várias APIs Wi-Fi. Além disso, contanto que os apps não determinem a localização física das APIs de Wi-Fi, eles não precisam declarar a permissão ACCESS_FINE_LOCATION quando são direcionados ao Android 13 ou versões mais recentes.

Saiba mais sobre a permissão para dispositivos Wi-Fi por perto.

Nova permissão para usar alarmes exatos

Se o app for destinado ao Android 13, use a permissão USE_EXACT_ALARM, que é concedida automaticamente ao app. No entanto, para que seu app possa usar essa permissão, ele precisa ser:

  • Um app de despertador ou timer.
  • Um app de agenda que mostra notificações dos próximos eventos.

Caso seu app use alarmes exatos, mas não corresponda a nenhum dos casos apresentados acima, continue declarando a permissão SCHEDULE_EXACT_ALARM, ciente de que o usuário poderá decidir negar acesso ao app.

Permissões que podem ser removidas pelo desenvolvedor

A partir do Android 13, o app pode revogar o acesso a permissões de execução que foram concedidas anteriormente, seja pelo sistema ou pelo usuário. Essa API permite que o app execute tarefas que aumentam a privacidade do usuário, como:

  • Remover as permissões não utilizadas.
  • Seguir as práticas recomendadas de permissões, aumentando a confiança dos usuários. É recomendável mostrar aos usuários uma caixa de diálogo que apresente as permissões que o app revogou proativamente.

Para revogar uma permissão de execução específica, transmita o nome da permissão para revokeSelfPermissionOnKill(). Para revogar um grupo de permissões de execução ao mesmo tempo, transmita uma coleção de nomes de permissões para revokeSelfPermissionsOnKill(). A revogação acontece de forma assíncrona e encerra todos os processos associados ao UID do app.

Para que o sistema revogue as permissões, todos os processos vinculados ao app precisam ser encerrados. Quando você chama a API, o sistema determina qual é o momento mais seguro para fazer isso. Geralmente, o sistema espera até que o app fique em segundo plano por um longo período, em vez do primeiro plano.

Para revogar as permissões de maneira imediata, é necessário encerrar todos os processos relacionados ao app manualmente. Essa ação cria uma experiência de usuário indesejável e, portanto, não é recomendada.

Para informar ao usuário que as permissões do app foram revogadas, mostre uma caixa de diálogo na próxima vez que o app for iniciado. Você pode incluir uma lista das permissões revogadas.

Esquema de assinatura de APK v3.1

O Android 13 inclui suporte ao esquema de assinatura de APK v3.1, que apresenta melhorias em relação ao esquema de assinatura de APK v3. Esse esquema trata de alguns dos problemas conhecidos do esquema de assinatura de APK v3 com relação à alternação. Mais especificamente, o esquema de assinatura v3.1 permite que os apps ofereçam suporte a signatários originais e alternados em um único APK. O esquema de assinatura v3.1 também oferece suporte ao direcionamento de versão do SDK, o que permite que a alternação seja destinada a uma versão mais recente da plataforma.

O esquema de assinatura v3.1 usa um novo ID de bloco, que não é reconhecido no 12L ou versões anteriores. Portanto, a plataforma aplica este comportamento de signatário:

  • Dispositivos com o Android 13 usam o signatário alternado no bloco v3.1.
  • Dispositivos com versões mais antigas do Android ignoram o signatário alternado e, em vez disso, usam o signatário original no bloco v3.0.

Em apps que ainda não alternaram a chave de assinatura, nenhuma outra ação é necessária. Quando esses apps optarem por alternar, o sistema vai aplicar o novo esquema de assinatura v3.1 por padrão.

Apps que já foram alternados e querem continuar a usar a chave de assinatura alternada no bloco de assinatura v3.0 precisam atualizar a invocação do apksigner:

apksigner sign --ks keystore.jks |
  --key key.pk8 --cert cert.x509.pem
  --rotation-min-sdk-version API_LEVEL
  [signer_options] app-name.apk

... em que o API_LEVEL é 32 ou menos.

Geração de relatórios de erros aprimorada no Keystore e no KeyMint

Para apps que geram chaves, o Keystore e o KeyMint agora oferecem indicadores de erros mais detalhados e precisos. Adicionamos uma hierarquia de classe de exceção em java.security.ProviderException, com exceções específicas para o Android que incluem códigos de erro do Keystore/KeyMint e informam se o erro pode ser repetido. Também é possível modificar os métodos de geração de chaves e usar assinatura ou criptografia para gerar essas novas exceções. Os relatórios de erros aprimorados não se limitam à geração de chaves. Com esse recurso, você terá o necessário para tentar gerar chaves novamente.

Suporte para tablets e telas grandes

O Android 13 foi desenvolvido com base nas otimizações para tablets introduzidas no Android 12 e na atualização de recursos do 12L, incluindo as otimizações para a IU do sistema, a melhor função de multitarefas e os modos de compatibilidade aprimorados. Como parte do processo de testes, confira se o app é exibido corretamente em tablets e outros dispositivos de tela grande.

Para saber mais sobre as novidades e o que é necessário testar, consulte a página Suporte para tablets e telas grandes.

Gráficos

Sombreadores programáveis

Um sombreador animado AGSL, adaptado deste sombreador GLSL.

O Android 13 adiciona suporte a objetos programáveis RuntimeShader, com um comportamento definido usando a Linguagem de sombreamento gráfico do Android (AGSL, na sigla em inglês). A AGSL compartilha grande parte da sintaxe com a GLSL, mas funciona no mecanismo de renderização do Android para personalizar a exibição da tela do Android, além de filtrar o conteúdo da visualização. O Android usa esses sombreadores internamente para implementar efeitos de ondulação, desfoque e rolagem esticada. O Android 13 permite criar efeitos avançados parecidos para o app.

Media

Roteamento de áudio antecipado

Para ajudar os apps de música a identificar como o áudio será roteado, adicionamos novas APIs de roteamento de áudio na classe AudioManager. A nova API getAudioDevicesForAttributes() permite recuperar uma lista dos dispositivos que podem ser usados para tocar o áudio especificado e a API getDirectProfilesForAttributes() ajuda a entender se é possível tocar o stream de áudio diretamente. Use essas novas APIs para definir o melhor AudioFormat a ser usado na sua faixa de áudio.

Acessibilidade

Audiodescrição

O Android 13 (API de nível 33) introduz uma nova preferência de acessibilidade que pode ser aplicada para todo o sistema, permitindo que os usuários ativem audiodescrições em todos os apps. A audiodescrição é uma faixa de narração do sistema que descreve a apresentação do app e o que está acontecendo na tela nos intervalos em que o áudio é pausado. Os apps podem seguir as preferências de audiodescrição do usuário. Para isso, basta consultá-las usando isAudioDescriptionRequested(), conforme mostrado no snippet de código a seguir:

Kotlin


private lateinit var accessibilityManager: AccessibilityManager

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)

// Where your media player is initialized
if (accessibilityManager.isAudioDescriptionRequested) {
    // User has requested to enable audio descriptions
}

Java


private AccessibilityManager accessibilityManager;

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager.class);

// Where your media player is initialized
if(accessibilityManager.isAudioDescriptionRequested()) {
    // User has requested to enable audio descriptions
}

Para monitorar mudanças nas preferências do usuário, o app pode adicionar um listener ao AccessbilityManager:

Kotlin

private val listener =
    AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
        // Preference changed; reflect its state in your media player
    }

override fun onStart() {
    super.onStart()

    accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}

override fun onStop() {
    super.onStop()

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}

Java

private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> {
    // Preference changed; reflect its state in your media player
};

@Override
protected void onStart() {
    super.onStart();

    accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener);
}

@Override
protected void onStop() {
    super.onStop();

    accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener);
}

Principal recurso

Atualizações do OpenJDK 11

O Android 13 inicia o trabalho de atualização das bibliotecas principais do Android para se alinhar à versão LTS do OpenJDK 11, com atualizações de biblioteca e suporte à linguagem Java 11 para desenvolvedores de aplicativos e plataformas. As principais mudanças de biblioteca introduzidas no Android 13 também vão ser disponibilizadas para dispositivos Android 12 por uma atualização do sistema do Google Play para o módulo ART Mainline.

O Android 13 inclui as mudanças abaixo nas principais bibliotecas:

  • Suporte à palavra-chave var para variáveis locais e como lambdas de parâmetros.
  • Novos métodos na classe String:

    • isBlank()
    • lines()
    • repeat()
    • strip()
    • stripLeading()
    • stripTrailing()
  • Suporte a Collection.toArray(IntFunction) para facilitar a adaptação de uma coleção a uma matriz.

  • Suporte aos métodos ifPresentOrElse(), isEmpty(), orElseThrow() e stream() nas classes java.util Optional, OptionalDouble, OptionalInt e OptionalLong.

  • Suporte estendido para as SocketOptions, incluindo a reutilização de soquetes.

  • As funcionalidades NullReader, NullWriter, InputStream, OutputStream e transferTo() Reader, que transferem caracteres de leitura para um Writer.

  • A funcionalidade para codificação e decodificação de URLs usando Charsets foi adicionada.

  • Funcionalidade de Charset para FileReader, FileWriter, PrintStream e PrintWriter.

  • Novas funções transferTo(), readNBytes(), readAllBytes() e writeBytes() para ByteArrayInput ou OutputStream e Input ou OutputStream.

  • Suporte ao ambiente de execução e ao compilador para java.lang.invoke.VarHandle.

  • Atualização do java.util.concurrent para a API OpenJDK 11 usando VarHandle internamente.

Java e OpenJDK são marcas registradas da Oracle e/ou afiliadas.