O Android 8.1 (nível 27 da API) introduz uma variedade de novos recursos para usuários e desenvolvedores. Este documento destaca as novidades para os desenvolvedores.
Android Oreo (versão Go)
O Android Go é nossa iniciativa para otimizar a experiência do Android para bilhões de pessoas que estão começando a acessar a Internet em todo o mundo. A partir do Android 8.1, estamos tornando o Android uma ótima plataforma para dispositivos básicos. Os recursos da configuração do Android Oreo (versão Go) incluem:
- Otimizações de memória. Melhor uso da memória em toda a plataforma para garantir que os apps possam ser executados de forma eficiente em dispositivos com 1 GB ou menos de RAM.
- Opções de segmentação flexíveis. Novas constantes de recursos de hardware para permitir que você segmente a distribuição dos seus apps para dispositivos com memória RAM normal ou baixa pelo Google Play.
- Google Play.Embora todos os apps estejam disponíveis em dispositivos com o Android Oreo (versão Go), o Google Play dará visibilidade a apps otimizados especificamente por desenvolvedores para oferecer uma ótima experiência a bilhões de pessoas com o build para bilhões de diretrizes.
Atualizamos as diretrizes de criação para bilhões com orientações adicionais sobre como otimizar seu app para dispositivos que executam o Android Oreo (versão Go). Para a maioria dos desenvolvedores, otimizar o APK existente ou usar o recurso de vários APKs do Google Play para direcionar uma versão do APK a dispositivos com pouca memória RAM é a melhor maneira de se preparar para dispositivos que executam o Android Oreo (versão Go). Lembre-se de que tornar seu app mais leve e eficiente beneficia todo o público, independente do dispositivo.
API Neural Networks
A API Neural Networks oferece computação acelerada e inferência para frameworks de machine learning no dispositivo, como TensorFlow Lite, biblioteca de ML multiplataforma do Google para dispositivos móveis, Caffe2 e outros. Acesse o repositório de código aberto do TensorFlow Lite para downloads e documentos. O TensorFlow Lite funciona com a API Neural Networks para executar modelos como MobileNets, Inception v3 e Resposta inteligente de maneira eficiente no seu dispositivo móvel.
Atualizações do framework de preenchimento automático
O Android 8.1 (nível 27 da API) oferece várias melhorias para o framework de preenchimento automático que você pode incorporar aos seus apps.
A classe
BaseAdapter
agora inclui o método setAutofillOptions()
, que permite fornecer representações de string dos valores em um
adaptador. Isso é útil para controles giratórios
que geram dinamicamente os valores nos adaptadores. Por exemplo,
é possível usar o método setAutofillOptions()
para fornecer uma representação
em string da lista de anos que os usuários podem escolher como parte de uma
data de validade de cartão de crédito. Os serviços de preenchimento automático podem usar a representação de string
para preencher adequadamente as visualizações que exigem os dados.
Além disso, a classe
AutofillManager
inclui o método notifyViewVisibilityChanged(View, int, boolean)
,
que pode ser chamado para notificar o framework sobre mudanças na visibilidade de uma
visualização em uma estrutura virtual. Há também uma sobrecarga do método para estruturas
não virtuais. No entanto, estruturas não virtuais geralmente não exigem que você
notifique explicitamente o framework, porque o método já é chamado pela
classe
View
.
O Android 8.1 também oferece aos serviços de preenchimento automático mais capacidade de personalizar a funcionalidade de salvamento
da interface, adicionando suporte a CustomDescription
and
Validator
em SaveInfo
.
As descrições personalizadas são úteis para ajudar o serviço de preenchimento automático a esclarecer o que
está sendo salvo. Por exemplo, quando a tela contém um cartão de crédito, ela pode
mostrar um logotipo do banco, os últimos quatro dígitos do cartão
de crédito e o número de validade. Para saber mais, consulte a classe
CustomDescription
.
Os objetos
Validator
são usados para evitar a exibição da interface de salvamento do preenchimento automático quando a condição do
Validador não é atendida. Para saber mais, consulte a classe
Validator e as subclasses
LuhnChecksumValidator e RegexValidator.
Notificações
O Android 8.1 inclui as seguintes alterações nas notificações:
- Os aplicativos agora só podem emitir sons de notificação uma vez por segundo. Os sons de alerta que excedem essa taxa não são colocados na fila e são perdidos. Essa mudança não afeta outros aspectos do comportamento das notificações, e as mensagens de notificação ainda são postadas conforme esperado.
-
NotificationListenerService
eConditionProviderService
não são compatíveis com dispositivos Android com pouca memória RAM que retornamtrue
quandoActivityManager.isLowRamDevice()
é chamado.
Atualização do EditText
A partir do nível 27 da API, o método EditText.getText()
retorna um Editable
. Anteriormente,
ele retornava um CharSequence
. Essa mudança é
compatível com versões anteriores, já que Editable
implementa
CharSequence
.
A interface Editable
oferece outras
funcionalidades valiosas. Por exemplo, como Editable
também
implementa a interface Spannable
, você pode aplicar a marcação ao
conteúdo em uma instância de EditText
.
Ações programáticas de navegação segura
Ao usar a
implementação de WebView
da API Safe Browsing, seu app pode
detectar quando uma instância de WebView
tenta navegar
para um URL que o Google classificou como uma ameaça conhecida. Por padrão, o
WebView
mostra um intersticial que avisa os usuários sobre a ameaça conhecida.
Essa tela oferece aos usuários a opção de carregar o URL mesmo assim ou de retornar a uma
página anterior segura.
No Android 8.1, é possível definir de maneira programática como o app responde a uma ameaça conhecida:
- Você pode controlar se o aplicativo reporta as ameaças conhecidas para o Navegação segura.
- É possível configurar o app para realizar automaticamente uma ação específica, como voltar a uma página segura, sempre que ele encontrar um URL classificado como uma ameaça conhecida pelo Navegação segura.
Observação:para ter a proteção ideal contra ameaças conhecidas, aguarde
até inicializar o Navegação segura antes de invocar o método
loadUrl()
de um objeto WebView
.
Os snippets de código abaixo mostram como instruir as instâncias de
WebView
do app a sempre voltar a um estado seguro após encontrar uma
ameaça conhecida:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
Extrator de miniaturas de vídeos
A classe MediaMetadataRetriever
tem um novo método, getScaledFrameAtTime()
, que encontra
um frame perto de uma determinada posição de tempo e retorna um bitmap com a mesma proporção
que o frame de origem, mas dimensionado para caber em um retângulo de largura e
altura especificadas. Isso é útil para gerar imagens em miniatura de vídeos.
Recomendamos usar esse método em vez de getFrameAtTime()
, que pode desperdiçar memória
porque retorna um bitmap com a mesma resolução do vídeo de origem. Por
exemplo, um frame de um vídeo em 4K seria um bitmap de 16 MB, muito maior do que
o necessário para uma imagem em miniatura.
API de memória compartilhada
O Android 8.1 (nível 27 da API) introduz uma nova
API
SharedMemory
. Essa classe permite criar, mapear e gerenciar uma instância
SharedMemory
anônima. Você define a proteção de memória
em um objeto
SharedMemory
para leitura e/ou gravação e, como o objeto
SharedMemory
é Parcelable, ele pode ser transmitido facilmente para outro processo com a AIDL.
A API SharedMemory
interopera com o recurso
ASharedMemory
no NDK.
ASharedMemory
fornece acesso
a um descritor de arquivo, que pode ser mapeado para leitura e gravação. É uma ótima
maneira de compartilhar grandes quantidades
de dados entre apps ou entre vários processos em um único app.
API WallpaperColors
O Android 8.1 (API de nível 27) permite que seu plano de fundo interativo forneça informações
de cor para a IU do sistema. Para fazer isso, crie um objeto WallpaperColors
com base em um bitmap, um drawable ou use três cores selecionadas manualmente.
Você também pode recuperar essas informações de cor.
Para criar um objeto WallpaperColors
, siga um dos procedimentos a seguir:
- Para criar um objeto
WallpaperColors
usando três cores, crie uma instância da classeWallpaperColors
transmitindo a cor primária, a secundária e a terciária. A cor principal não pode ser nula. - Para criar um objeto
WallpaperColors
com base em um bitmap, chame o métodofromBitmap()
transmitindo a origem do bitmap como parâmetro. - Para criar um objeto
WallpaperColors
com um drawable, chame o métodofromDrawable()
transmitindo a origem do drawable como parâmetro.
Para extrair os detalhes das cores primária, secundária ou terciária do plano de fundo, chame estes métodos:
getPrimaryColor()
retorna a cor mais representativa do plano de fundo.getSecondaryColor()
retorna a segunda cor mais predominante do plano de fundo.getTertiaryColor()
retorna a terceira cor mais predominante do plano de fundo.
Para notificar o sistema sobre qualquer mudança significativa de cor no plano de fundo interativo,
chame o método
notifyColorsChanged()
. Esse método aciona um evento de ciclo de vida onComputeColors()
em que você tem a oportunidade de fornecer um novo objeto
WallpaperColors
.
Se quiser adicionar um listener para mudanças de cor, chame o método addOnColorsChangedListener()
. Você também pode
chamar o método getWallpaperColors()
para extrair as cores primárias de um plano de fundo.
Atualizações de impressão digital
A classe FingerprintManager
introduziu
os seguintes códigos de erro:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
: o usuário tentou desbloquear o dispositivo muitas vezes usando o leitor de impressão digital. -
FINGERPRINT_ERROR_VENDOR
: ocorreu um erro no leitor de impressão digital específico do fornecedor.
Atualizações de criptografia
Várias alterações de criptografia foram feitas no Android 8.1:
- Novos algoritmos foram implementados no Conscrypt. A implementação
do Conscrypt é usada preferencialmente em vez da implementação do Bouncy Castle
existente. Os novos algoritmos incluem:
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
- O
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
não funciona mais para algoritmos que usam o GCM. Em vez disso, usegetParameterSpec(GCMParameterSpec.class)
. - Muitas classes internas do Conscrypt associadas ao TLS foram refatoradas. Como
os desenvolvedores às vezes acessam esses recursos de forma reflexiva, os paliativos foram mantidos para
oferecer suporte ao uso anterior, mas alguns detalhes foram alterados. Por exemplo, os soquetes
anteriormente eram do tipo
OpenSSLSocketImpl
, mas agora são do tipoConscryptFileDescriptorSocket
ouConscryptEngineSocket
, ambos estendendoOpenSSLSocketImpl
. - Os métodos
SSLSession
usados para gerarIllegalArgumentException
quando transmitidos uma referência nula agora geramNullPointerException
- O RSA
KeyFactory
não permite mais a geração de chaves a partir de matrizes de bytes maiores que a chave codificada. As chamadas parageneratePrivate()
egeneratePublic()
que fornecem umKeySpec
em que a estrutura da chave não preenche todo o buffer resultam em umaInvalidKeySpecException
. - Quando uma leitura de soquete é interrompida pelo fechamento dele, o Conscrypt é usado
para retornar -1 da leitura. A leitura agora gera
SocketException
. - O conjunto de certificados de CA raiz foi alterado, removendo principalmente um grande número de certificados obsoletos, mas também removendo os certificados raiz do WoSign e do StartCom. Para mais informações sobre essa decisão, consulte a postagem do blog de segurança do Google, Remoção final da confiança nos certificados WoSign e StartCom (link em inglês).