O Android 8.1 (nível 27 da API) apresenta uma variedade de novos recursos e funções 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 Android para bilhões de pessoas que estão on-line em todo o mundo. A partir do Android 8.1, estamos tornando o Android uma ótima plataforma para dispositivos básicos. Recursos no Android Oreo (versão Go) inclui:
- Otimizações de memória. Melhor uso da memória em toda a plataforma para garantir que os apps possam ser executados com eficiência 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 por meio do 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 pelos desenvolvedores para oferecer uma ótima experiência para bilhões de pessoas com o edifício para bilhões de pessoas diretrizes.
Atualizamos as diretrizes de criação para bilhões com orientações adicionais sobre como otimizar aplicativos para dispositivos com o Android Oreo (versão Go). Para a maioria dos desenvolvedores, otimizar o APK existente ou usar o recurso de Múltiplos APKs do Google Play para destinar uma versão do APK a dispositivos com pouca memória RAM é a melhor maneira de se preparar para dispositivos Android Oreo (edição Go). Lembre-se de que fazer aplicativo mais leve e eficiente beneficia todo o público, não importa o dispositivo.
API Neural Networks
A API Neural Networks oferece computação acelerada e inferência para frameworks de aprendizado de máquina no dispositivo, como o 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 a Resposta inteligente com eficiência no seu dispositivo móvel.
Atualizações do framework de preenchimento automático
O Android 8.1 (API de nível 27) oferece várias melhorias no preenchimento automático que você pode incorporar aos seus aplicativos.
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 Spinner
que geram dinamicamente os valores nos próprios adaptadores. Por exemplo:
você pode usar o método setAutofillOptions()
para fornecer uma string
representação da lista de anos que os usuários podem escolher como parte de uma
a data de validade do cartão de crédito. Os serviços de preenchimento automático podem usar a representação de string
para preencher corretamente as visualizações que exigem os dados.
Além disso, o AutofillManager
inclui o método notifyViewVisibilityChanged(View, int, boolean)
que você pode chamar para notificar a estrutura sobre alterações na visibilidade de um
em uma estrutura virtual. Há também uma sobrecarga do método para
estruturas virtuais. No entanto, estruturas não virtuais geralmente não exigem que você
explicitamente notificar o framework porque o método já é chamado pela
View
.
O Android 8.1 também oferece aos serviços de preenchimento automático mais capacidade de personalizar a affordance de salvamento
da interface adicionando suporte a CustomDescription
and
Validator
no SaveInfo
.
As descrições personalizadas são úteis para ajudar o serviço de preenchimento automático a esclarecer o que é
sendo salvos; por exemplo, quando a tela contém um cartão de crédito, ele poderia
exibir um logotipo do banco do cartão de crédito, os últimos quatro dígitos do cartão de crédito
e o número da validade. Para saber mais, consulte a
CustomDescription
.
Os objetos
Validator
são usados para evitar a exibição da IU de 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. Sons de alerta que excedem esse limite de conversão não entram na fila e são perdidas. Essa mudança não afeta outros aspectos do comportamento de notificação e as mensagens de notificação ainda são publicadas conforme o esperado.
-
NotificationListenerService
eConditionProviderService
não têm suporte em memória RAM baixa Dispositivos com tecnologia Android que retornamtrue
quandoActivityManager.isLowRamDevice()
for chamado.
Atualização do EditText
A partir do nível 27 da API, o método EditText.getText()
retorna um Editable
. anteriormente
ela retornou um CharSequence
. Essa mudança é
compatível com versões anteriores, já que Editable
implementa
CharSequence
.
A interface Editable
oferece recursos adicionais
valiosos. Por exemplo, como Editable
também
implementa a interface Spannable
, é possível 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
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 dá aos usuários a opção de carregar o URL mesmo assim ou de retornar
a página anterior que seja segura.
No Android 8.1, é possível definir de forma programática como os responde a uma ameaça conhecida:
- É possível controlar se o app reporta as ameaças conhecidas para o Navegação.
- O app pode executar automaticamente uma ação específica, como sempre que encontra um URL que o recurso Navegação segura uma ameaça conhecida.
Observação:para ter a melhor proteção contra ameaças conhecidas, aguarde
antes de inicializar a Navegação segura antes de invocar
método loadUrl()
do objeto WebView
.
Os snippets de código a seguir mostram como você pode instruir as instâncias de
WebView
do app a sempre voltar a um local seguro após encontrar uma
ameaça conhecida:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /manifest
MyWebActivity.java
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!"); } } }); }
MyWebViewClient.java
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 localiza
um frame próximo a uma determinada posição de tempo e retorna um bitmap com a mesma proporção
do frame de origem, mas dimensionado para se ajustar a um retângulo de largura e
altura especificados. 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 ele retorna um bitmap com a mesma resolução do vídeo de origem. Para
exemplo, um frame de um vídeo 4K seria um bitmap de 16 MB, muito maior que você
precisaria de uma imagem de miniatura.
API de memória compartilhada
O Android 8.1 (nível 27 da API) apresenta 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 uma
SharedMemory
para leitura e/ou gravação e, como
SharedMemory
é Parcelable, você pode passá-lo facilmente para outro processo pela AIDL.
A API SharedMemory
interage com a
facilidade ASharedMemory
no NDK.
ASharedMemory
dá 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 cor
informações para a IU do sistema. Para fazer isso, crie um objeto WallpaperColors
de um bitmap, um drawable ou usando três cores selecionadas manualmente.
Você também pode recuperar essas informações de cor.
Para criar um WallpaperColors
, siga um destes procedimentos:
- Para criar um
WallpaperColors
objeto usando três cores, crie uma instância doWallpaperColors
classe passando a cor primária, a secundária e a terciária. O principal a cor não pode ser nula. - Para criar um
WallpaperColors
de um bitmap, chame o métodofromBitmap()
passando a origem do bitmap como parâmetro. - Para criar um objeto
WallpaperColors
de um drawable, chame o métodofromDrawable()
transmitindo a origem do drawable como parâmetro.
Para recuperar os detalhes de cores primárias, secundárias ou terciárias do plano de fundo, chame os seguintes métodos:
getPrimaryColor()
retorna a cor mais representativa visualmente do plano de fundo.getSecondaryColor()
retorna a segunda cor mais preeminente do plano de fundo.- O método
getTertiaryColor()
retorna a terceira cor mais representativa do plano de fundo.
Para notificar o sistema sobre quaisquer mudanças significativas de cor no seu plano de fundo interativo,
chame o método
notifyColorsChanged()
. Esse método aciona um ciclo de vida de onComputeColors()
em que você tem a oportunidade de fornecer um novo objeto WallpaperColors
objeto.
Para adicionar um listener para mudanças de cor, chame o método addOnColorsChangedListener()
. Você pode
também chame o método getWallpaperColors()
.
para recuperar as cores primárias de um plano de fundo.
Atualizações de impressão digital
A classe FingerprintManager
tem
os seguintes códigos de erro:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
: o usuário tentou muitas vezes para desbloquear o dispositivo usando o leitor de impressão digital. -
FINGERPRINT_ERROR_VENDOR
: uma impressão digital específica do fornecedor Ocorreu um erro no leitor.
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 sobre a 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
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 os acessam de forma reflexiva, paliativos foram deixados para
oferecem suporte ao uso anterior, mas alguns detalhes mudaram. Por exemplo, soquetes
antes eram do tipo
OpenSSLSocketImpl
, mas agora são do tipoConscryptFileDescriptorSocket
ouConscryptEngineSocket
, que se estendemOpenSSLSocketImpl
: - Os métodos
SSLSession
usados para gerarIllegalArgumentException
quando uma referência nula era transmitida agora geramNullPointerException
. - O RSA
KeyFactory
não permite mais a geração de chaves de matrizes de bytes maiores que a chave codificada. Chamadas parageneratePrivate()
egeneratePublic()
que oferecemKeySpec
em que a estrutura da chave não preenche o todo o buffer resultará em umaInvalidKeySpecException
. - Quando uma leitura de soquete é interrompida pelo fechamento do soquete, o Conscrypt é usado
para retornar -1 da leitura. A leitura agora gera
SocketException
: - O conjunto de certificados de CA raiz foi alterado, removendo a maioria dos certificados de certificados obsoletos, além da remoção dos certificados raiz WoSign e StartCom. Para mais informações sobre essa decisão, consulte a Postagem do blog sobre segurança, Final remoção da confiança nos certificados da WoSign e da StartCom.