Funzionalità e API di Android 8.1

Android 8.1 (livello API 27) introduce una serie di nuove funzioni per utenti e sviluppatori. Questo documento mette in evidenza le novità per gli sviluppatori.

Android Oreo (Go edition)

Android Go è la nostra iniziativa volta a ottimizzare l'esperienza Android per miliardi di persone che accedono online in tutto il mondo. A partire da Android 8.1, stiamo rendendo Android un'ottima piattaforma per i dispositivi di fascia base. Funzionalità in Android Oreo Le configurazioni (Go edition) includono:

  • Ottimizzazioni della memoria. Miglioramento dell'utilizzo della memoria in tutta la piattaforma per garantire che le app possano essere eseguite in modo efficiente su dispositivi con massimo 1 GB di RAM.
  • Opzioni di targeting flessibili. Nuovi funzionalità hardware per consentirti di scegliere come target della distribuzione delle app i dispositivi normali o con RAM ridotta tramite su Google Play.
  • Google Play. Tutte le app saranno disponibili sui dispositivi con Android Oreo. (Versione Go), Google Play darà visibilità alle app specificamente ottimizzate dagli sviluppatori per offrire un'esperienza eccezionale a miliardi di persone, con l'obiettivo di creare . linee guida.

Abbiamo aggiornato l'edificio per miliardi di persone linee guida con ulteriori indicazioni su come . ottimizzare l'app per i dispositivi in esecuzione Android Oreo (Go Edition). Per la maggior parte degli sviluppatori, ottimizzare l'APK esistente o usare di Google Play Più funzionalità degli APK per scegliere come target di una versione dell'APK i dispositivi con RAM bassa è il modo migliore per prepararsi ai dispositivi con Android Oreo (Go edition). Ricorda che rendere app più leggera ed efficiente a vantaggio di tutto il pubblico, indipendentemente dal dispositivo.

API Neural Networks

L'API Neural Networks fornisce calcolo e inferenza accelerati per i computer sul dispositivo di machine learning come TensorFlow Lite, la libreria ML multipiattaforma di Google per dispositivi mobili, così come Caffe2 e altri. Visita TensorFlow Lite open source un repository completo per i download e i documenti. TensorFlow Lite funziona con l'API Neural Networks per eseguire modelli come MobileNet Inception v3, e Risposta rapida in modo efficiente sul tuo dispositivo mobile.

Aggiornamenti del framework di compilazione automatica

Android 8.1 (livello API 27) offre diversi miglioramenti alla funzionalità il framework che puoi integrare nelle tue app.

BaseAdapter ora include il setAutofillOptions() che ti consente di fornire rappresentazioni in formato stringa dei valori in un dell'adattatore. È utile per lo spinner che generano dinamicamente i valori negli adattatori. Ad esempio: puoi usare il metodo setAutofillOptions() per fornire una stringa una rappresentazione dell'elenco di anni che gli utenti possono scegliere nell'ambito data di scadenza della carta di credito. I servizi di compilazione automatica possono utilizzare la rappresentazione stringa per compilare in modo appropriato le viste che richiedono i dati.

Inoltre, AutofillManager include il metodo notifyViewVisibilityChanged(View, int, boolean) che puoi chiamare per notificare al framework le modifiche alla visibilità di un in una struttura virtuale. C'è anche un sovraccarico del metodo per di strutture virtuali. Tuttavia, le strutture non virtuali di solito non richiedono inviare una notifica esplicita al framework perché il metodo è già richiamato dal View .

Android 8.1 offre inoltre ai servizi di compilazione automatica una maggiore possibilità di personalizzare l'interfaccia utente per il salvataggio invito aggiungendo il supporto per CustomDescription and Validator in SaveInfo.

Le descrizioni personalizzate sono utili per aiutare il servizio di compilazione automatica a chiarire cosa è in fase di salvataggio; ad esempio, se la schermata contiene una carta di credito, mostrare il logo della banca della carta di credito, le ultime quattro cifre della carta e il relativo numero di scadenza. Per saperne di più, consulta il CustomDescription .

Validator vengono utilizzati per evitare di visualizzare l'interfaccia utente di salvataggio della compilazione automatica quando lo strumento non è soddisfatta. Per ulteriori informazioni, consulta la strumento di convalida insieme alle relative sottoclassi, LuhnChecksumValidator e RegexValidator.

Notifiche

Android 8.1 include le seguenti modifiche alle notifiche:

  • Ora le app possono emettere un suono di avviso di notifica solo una volta al secondo. Suoni di avviso che superano questo limite la frequenza non viene messa in coda e viene persa. Questa modifica non influisce su altri aspetti delle notifiche il comportamento e i messaggi di notifica vengono ancora pubblicati come previsto.
  • NotificationListenerService e ConditionProviderService non sono supportati su RAM bassa Dispositivi Android che restituiscono true quando ActivityManager.isLowRamDevice() è stato chiamato.

Aggiornamento di EditText

A partire dal livello API 27, il metodo EditText.getText() restituisce un Editable; in precedenza ha restituito CharSequence. Questa modifica è compatibile con le versioni precedenti, poiché Editable implementa CharSequence.

L'interfaccia Editable offre preziose funzionalità. Ad esempio, perché anche Editable implementa l'interfaccia Spannable, puoi applicare il markup contenuti in un'istanza di EditText.

Azioni di Navigazione sicura programmatica

Utilizzando il WebView dell'API Navigazione sicura, la tua app può rileva quando un'istanza di WebView tenta di navigare a un URL che Google ha classificato come minaccia nota. Per impostazione predefinita, WebView mostra un interstitial che avvisa gli utenti della minaccia nota. Questa schermata offre agli utenti la possibilità di caricare comunque l'URL o di tornare a un pagina precedente sia sicura.

In Android 8.1 puoi definire in modo programmatico il modo in cui risponde a una minaccia nota:

  • Puoi controllare se la tua app segnala minacce note a Safe Navigazione.
  • Puoi impostare l'app in modo che esegua automaticamente una determinata azione, ad esempio tornando nell'area protetta, ogni volta che rileva un URL che la funzione Navigazione sicura classifica come minaccia nota.

Nota:per una protezione ottimale contro le minacce note, attendi finché non avrai inizializzato Navigazione sicura prima di richiamare un Metodo loadUrl() dell'oggetto WebView.

I seguenti snippet di codice mostrano come puoi indicare alle istanze della tua app WebView per tornare sempre in sicurezza dopo aver riscontrato un minaccia nota:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MiaWebActivity.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();
    }
}

Estrattore miniature video

Il corso MediaMetadataRetriever ha un nuovo metodo, getScaledFrameAtTime(), che trova un frame vicino a una determinata posizione temporale e restituisce una bitmap con lo stesso aspetto rapporto come il frame di origine, ma ridimensionato per adattarsi a un rettangolo di una determinata larghezza e altezza. È utile per generare immagini in miniatura a partire da un video.

Ti consigliamo di utilizzare questo metodo anziché getFrameAtTime() perché potrebbe sprecare memoria perché restituisce una bitmap con la stessa risoluzione del video sorgente. Per Ad esempio, un frame di un video 4K sarà una bitmap di 16 MB, molto più grande di quanto un'immagine in miniatura.

API Memoria condivisa

Android 8.1 (livello API 27) introduce una nuova SharedMemory tramite Google Cloud CLI o tramite l'API Compute Engine. Questo corso ti consente di creare, mappare e gestire un SharedMemory in esecuzione in un'istanza Compute Engine. Sei tu a impostare la protezione della memoria su un SharedMemory per la lettura e/o la scrittura e, poiché il SharedMemory: è Parcelable, puoi passarlo facilmente a un altro processo tramite AIDL.

La SharedMemory L'API interagisce con struttura ASharedMemory nella NDK. ASharedMemory concede l'accesso a un descrittore del file, che può quindi essere mappato per la lettura e la scrittura. È un ottimo per condividere ingenti quantità di dati tra app o tra più processi all'interno di una sola app.

API BackgroundColors

Android 8.1 (livello API 27) consente al tuo sfondo animato di fornire colori informazioni alla UI di sistema. Per farlo, crea un WallpaperColors da una bitmap, un drawable o dall'utilizzo di tre colori selezionati manualmente. Puoi anche recuperare queste informazioni sul colore.

Per creare un WallpaperColors esegui una delle seguenti operazioni:

  • Per creare un WallpaperColors utilizzando tre colori, crea un'istanza dell'oggetto WallpaperColors passando il colore primario, secondario e terziario. Il principale il colore non deve essere nullo.
  • Per creare un WallpaperColors da una bitmap, richiama fromBitmap() passando la sorgente bitmap come parametro.
  • Per creare un WallpaperColors oggetto da un drawable, chiama fromDrawable() passando l'origine drawable come parametro.

Per recuperare i dettagli del colore primario, secondario o terziario dal sfondo, richiama i seguenti metodi:

Per notificare al sistema eventuali variazioni di colore significative dello sfondo animato, chiama notifyColorsChanged() . Questo metodo attiva un ciclo di vita onComputeColors() evento in cui hai l'opportunità di fornire un nuovo WallpaperColors .

Per aggiungere un listener per le variazioni di colore, puoi chiamare il metodo addOnColorsChangedListener(). Puoi chiama anche il metodo getWallpaperColors() per recuperare i colori primari di uno sfondo.

Aggiornamenti dell'impronta

Il corso FingerprintManager ha sono stati introdotti i seguenti codici di errore:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT - L'utente ha provato troppe volte per sbloccare il dispositivo con il lettore di impronte digitali.
  • FINGERPRINT_ERROR_VENDOR: una fingerprint specifica del fornitore si è verificato un errore del lettore.

Aggiornamenti sulla crittografia

Con Android 8.1 sono state apportate diverse modifiche alla crittografia:

  • In Conscrypt sono stati implementati nuovi algoritmi. The Conscrypt l'implementazione è preferenzialmente utilizzata rispetto all'attuale Castello gonfiabile implementazione. I nuovi algoritmi includono:
    • 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) no funziona per gli algoritmi che utilizzano GCM. Utilizza invece getParameterSpec(GCMParameterSpec.class).
  • È stato eseguito il refactoring di molte classi Conscrypt interne associate a TLS. Dal giorno a volte gli sviluppatori accedono in modo riflessivo, supportano l'utilizzo precedente, ma alcuni dettagli sono cambiati. Ad esempio, socket in precedenza erano di tipo OpenSSLSocketImpl, mentre ora sono di tipo ConscryptFileDescriptorSocket o ConscryptEngineSocket, entrambi estesi OpenSSLSocketImpl.
  • SSLSession metodi usati per lanciare IllegalArgumentException quando viene passato un riferimento nullo, ora lancia NullPointerException.
  • L'RSA KeyFactory non consente più la generazione di chiavi da array di byte più grandi della chiave codificata. Chiamate a generatePrivate() e generatePublic() che offrono un KeySpec in cui la struttura della chiave non riempie la l'intero buffer genererà un InvalidKeySpecException.
  • Quando la lettura di un socket viene interrotta a causa della chiusura del socket, viene utilizzato Conscrypt per restituire -1 dalla lettura. La lettura ora genera SocketException.
  • L'insieme di certificati CA radice è stato modificato, rimuovendo soprattutto numero di certificati obsoleti, ma anche la rimozione dei certificati radice WoSign e StartCom. Per ulteriori informazioni su questa decisione, consulta le post del blog sulla sicurezza, Finale rimozione dell'attendibilità nei certificati WoSign e StartCom.