Recursos e APIs do Android 8.1

O Android 8.1 (API de nível 27) introduz uma variedade de novos recursos e funcionalidades 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 excelente 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 de forma eficiente em dispositivos com 1 GB ou menos de RAM.
  • Opções de segmentação flexíveis. Novo recurso de hardware para segmentar a distribuição dos apps para dispositivos com memória RAM normal ou baixa usando o 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 a bilhões de pessoas com o edifício para bilhões de pessoas diretrizes.

O edifício foi atualizado para bilhões de pessoas diretrizes com mais orientações sobre como otimizar seu app para dispositivos que executam Android Oreo (versão Go). Para a maioria dos desenvolvedores, otimizar seu APK existente ou usar do Google Play Recurso de vários APKs 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 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 máquinas no dispositivo. de machine learning, como TensorFlow Lite, a biblioteca de ML multiplataforma do Google para dispositivos móveis, assim como Caffe2 e outros. Acesse o site do TensorFlow Lite código aberto de código aberto 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.

O BaseAdapter agora inclui a setAutofillOptions() , que permite fornecer representações de string dos valores em uma por um adaptador. Isso é útil para o ícone de carregamento que geram dinamicamente os valores nos 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 adequadamente as visualizações que precisam dos 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 interface de salvamento funcionalidade adicionando suporte para 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 é 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 .

Validator são usados para evitar a exibição da interface de salvamento do preenchimento automático quando o não é satisfeita. Para saber mais, consulte a Validator e suas 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 da notificação o comportamento e as mensagens de notificação ainda são postados conforme esperado.
  • NotificationListenerService e ConditionProviderService não têm suporte em memória RAM baixa Dispositivos com tecnologia Android que retornam true quando ActivityManager.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 fornece recursos adicionais e valiosos funcionalidade de armazenamento. Por exemplo, como Editable também implementar a interface Spannable, você pode aplicar a marcação a conteúdo em uma instância de EditText.

Ações programáticas de navegação segura

Usando o WebView da API Safe Browsing, seu app poderá detectar quando uma instância de WebView tentar navegar para um URL que o Google classificou como 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 seu aplicativo WebView para sempre voltar a um local seguro depois de encontrar um ameaça conhecida:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</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 encontra um frame próximo a uma determinada posição de tempo e retorna um bitmap com o mesmo aspecto proporção do frame de origem, mas dimensionada para caber em um retângulo de largura especificada e a altura. 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 do que você precisaria de uma imagem de miniatura.

API de memória compartilhada

O Android 8.1 (API de nível 27) introduz uma nova SharedMemory API. Essa classe permite criar, mapear e gerenciar um ambiente SharedMemory instância. Você define a proteção de memória em uma SharedMemory objeto para leitura e/ou gravação e, como SharedMemory é Parcelable, você pode passá-lo facilmente para outro processo pela AIDL.

O SharedMemory A API interopera com a ASharedMemory no NDK. ASharedMemory permite o acesso para um descritor de arquivo, que pode então ser mapeado para leitura e gravação. É um ótimo forma 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 isso, crie um 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 do WallpaperColors 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étodo fromBitmap() passando a origem do bitmap como parâmetro.
  • Para criar um WallpaperColors de um drawable, chame o método fromDrawable() passando 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:

Para notificar o sistema sobre quaisquer alterações significativas de cor no seu plano de fundo interativo: chamar 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 Conscrypt é preferencialmente usada em vez do Bouncy Castle existente implementação. 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 mais funciona para algoritmos que usam o GCM. Em vez disso, use getParameterSpec(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 tipo ConscryptFileDescriptorSocket ou ConscryptEngineSocket, que se estendem OpenSSLSocketImpl:
  • Métodos SSLSession usados para gerar IllegalArgumentException, quando uma referência nula é transmitida, gerar NullPointerException.
  • O RSA KeyFactory não permite mais a geração de chaves de matrizes de bytes maiores que a chave codificada. Chamadas para generatePrivate() e generatePublic() que oferecem KeySpec em que a estrutura da chave não preenche o todo o buffer resultará em uma InvalidKeySpecException.
  • 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.