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 per ottimizzare l'esperienza Android per miliardi di persone che accedono a internet in tutto il mondo. A partire da Android 8.1, stiamo rendendo Android un'ottima piattaforma per i dispositivi di fascia base. Le funzionalità nella configurazione di Android Oreo (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. Sebbene tutte le app saranno disponibili sui dispositivi con Android Oreo (versione Go), Google Play darà visibilità alle app ottimizzate specificamente dagli sviluppatori per offrire un'esperienza eccezionale a miliardi di persone con le linee guida per la creazione per miliardi di persone.
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 (versione Go). 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 la tua app meno ingombrante ed efficiente è un vantaggio per 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 MobileNets, Inception v3 e Smart Reply 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.
La classe BaseAdapter
ora include il metodo setAutofillOptions()
, che consente di fornire rappresentazioni di stringa dei valori in un
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, la classe AutofillManager
include il metodo notifyViewVisibilityChanged(View, int, boolean)
che puoi chiamare per notificare al framework le modifiche alla visibilità di una vista 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 riprodurre 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
eConditionProviderService
non sono supportati su RAM bassa Dispositivi Android che restituisconotrue
quandoActivityManager.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 una pagina precedente 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 Navigazione sicura.
- 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 di aver inizializzato Navigazione sicura prima di invocare il metodo loadUrl()
di un 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:valu>e=&qu<ot;true">;< / /a>pplication /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. Questo è utile per generare miniature dai video.
Ti consigliamo di utilizzare questo metodo anziché getFrameAtTime()
perché potrebbe sprecare memoria
perché restituisce una bitmap con la stessa risoluzione del video sorgente. Ad esempio, un fotogramma di un video 4K è un bitmap di 16 MB, molto più grande di quanto necessario per un'immagine in miniatura.
API Memoria condivisa
Android 8.1 (livello API 27) introduce una nuova API
SharedMemory
. Questo corso ti consente di creare, mappare e gestire un
SharedMemory
in esecuzione in un'istanza Compute Engine. Imposti la protezione della memoria su un oggetto SharedMemory
per la lettura e/o la scrittura e, poiché l'oggetto SharedMemory
è Parcelable, puoi passarlo facilmente a un altro processo tramite AIDL.
L'API SharedMemory
interopera con la funzionalità
ASharedMemory
nell'NDK.
ASharedMemory
consente di accedere
a un descrittore di file, che può essere mappato in lettura e scrittura. È un ottimo modo per condividere grandi quantità di dati tra app o tra più processi all'interno di un'unica app.
API WallpaperColors
Android 8.1 (livello API 27) consente allo sfondo animato di fornire informazioni sul colore all'interfaccia utente 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'oggettoWallpaperColors
passando il colore primario, secondario e terziario. Il principale il colore non deve essere nullo. - Per creare un
WallpaperColors
da una bitmap, richiamafromBitmap()
passando la sorgente bitmap come parametro. - Per creare un
WallpaperColors
oggetto da un drawable, chiamafromDrawable()
passando l'origine drawable come parametro.
Per recuperare i dettagli dei colori principali, secondari o terziari dall'sfondo, chiama i seguenti metodi:
getPrimaryColor()
restituisce il colore più rappresentativo visivamente dello sfondo.getSecondaryColor()
restituisce il secondo colore più preminente della carta da parati.- Il metodo
getTertiaryColor()
restituisce il terzo colore più predominante dello sfondo.
Per notificare al sistema eventuali variazioni significative di colore nello sfondo animato, chiama il metodo notifyColorsChanged()
. Questo metodo attiva un evento di ciclo di vita onComputeColors()
in cui hai la possibilità di fornire un nuovo oggetto 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 a sbloccare il dispositivo utilizzando il lettore di impronte. -
FINGERPRINT_ERROR_VENDOR
: una fingerprint specifica del fornitore si è verificato un errore del lettore.
Aggiornamenti sulla crittografia
In 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 invecegetParameterSpec(GCMParameterSpec.class)
.- È stato eseguito il refactoring di molte classi Conscrypt interne associate a TLS. Poiché
gli sviluppatori a volte accedono a questi elementi in modo riflessivo, gli shim sono stati mantenuti per supportare l'utilizzo precedente, ma alcuni dettagli sono cambiati. Ad esempio, le socket
in precedenza erano di tipo
OpenSSLSocketImpl
, ma ora sono di tipoConscryptFileDescriptorSocket
oConscryptEngineSocket
, che estendono entrambeOpenSSLSocketImpl
. - I metodi
SSLSession
che generavano unIllegalArgumentException
quando veniva passato un riferimento nullo ora generano unNullPointerException
. - L'RSA
KeyFactory
non consente più la generazione di chiavi da array di byte più grandi della chiave codificata. Le chiamate ageneratePrivate()
egeneratePublic()
che forniscono unKeySpec
in cui la struttura della chiave non riempie l'intero buffer produrranno unInvalidKeySpecException
. - 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 principalmente un gran numero di certificati obsoleti, ma anche i certificati radice per WoSign e StartCom. Per ulteriori informazioni su questa decisione, leggi il post del blog Google Security Rimossione definitiva della attendibilità dei certificati WoSign e StartCom.