Android 8.1 (livello API 27) introduce una serie di nuove funzionalità e capacità per utenti e sviluppatori. Questo documento evidenzia le novità per gli sviluppatori.
Android Oreo (Go edition)
Android Go è la nostra iniziativa per ottimizzare l'esperienza Android per miliardi di persone che si connettono a internet in tutto il mondo. A partire da Android 8.1, stiamo trasformando Android in una piattaforma ideale per i dispositivi entry-level. Le funzionalità nella configurazione di Android Oreo (Go Edition) includono:
- Ottimizzazioni della memoria. Utilizzo della memoria migliorato sulla piattaforma per garantire che le app possano essere eseguite in modo efficiente su dispositivi con 1 GB o meno di RAM.
- Opzioni di targeting flessibili. Nuove costanti delle funzionalità hardware per consentirti di indirizzare la distribuzione delle tue app a dispositivi con RAM normale o bassa tramite Google Play.
- Google Play.Sebbene tutte le app saranno disponibili sui dispositivi con Android Oreo (Go Edition), Google Play darà visibilità alle app ottimizzate in modo specifico dagli sviluppatori per offrire un'esperienza ottimale a miliardi di persone con le linee guida per la creazione per miliardi di persone.
Abbiamo aggiornato le linee guida per la creazione di app per miliardi di utenti con ulteriori indicazioni su come ottimizzare l'app per i dispositivi con Android Oreo (Go Edition). Per la maggior parte degli sviluppatori, l'ottimizzazione dell'APK esistente o l'utilizzo della funzionalità APK multipli di Google Play per scegliere come target una versione dell'APK per i dispositivi con poca RAM è il modo migliore per prepararsi ai dispositivi che eseguono Android Oreo (Go Edition). Ricorda che rendere la tua app più leggera ed efficiente avvantaggia tutto il tuo pubblico, indipendentemente dal dispositivo.
API Neural Networks
L'API Neural Networks fornisce calcoli e inferenze accelerati per framework di machine learning on-device come TensorFlow Lite, la libreria ML multipiattaforma di Google per il mobile, nonché Caffe2 e altri. Visita il repository open source di TensorFlow Lite per download e documentazione. TensorFlow Lite funziona con l'API Neural Networks per eseguire in modo efficiente modelli come MobileNets, Inception v3 e Risposte rapide sul tuo dispositivo mobile.
Aggiornamenti del framework di compilazione automatica
Android 8.1 (livello API 27) offre diversi miglioramenti al framework di compilazione automatica che puoi incorporare nelle tue app.
La classe BaseAdapter ora include il metodo setAutofillOptions(), che ti consente di fornire rappresentazioni di stringa dei valori in un adattatore. Questo è utile per i controlli spinner
che generano dinamicamente i valori nei relativi adattatori. Ad esempio,
puoi utilizzare il metodo setAutofillOptions() per fornire una rappresentazione
stringa dell'elenco degli anni che gli utenti possono scegliere come parte di una
data di scadenza della carta di credito. I servizi di compilazione automatica possono utilizzare la rappresentazione di stringa
per compilare in modo appropriato le visualizzazioni che richiedono i dati.
Inoltre, la classe AutofillManager
include il metodo notifyViewVisibilityChanged(View, int, boolean)
che puoi chiamare per comunicare al framework le modifiche alla visibilità di una
visualizzazione in una struttura virtuale. Esiste anche un sovraccarico del metodo per le strutture non
virtuali. Tuttavia, le strutture non virtuali in genere non richiedono di
notificare esplicitamente il framework perché il metodo viene già chiamato dalla
classe View.
Android 8.1 offre inoltre ai servizi di compilazione automatica una maggiore capacità di personalizzare l'interfaccia utente di salvataggio
aggiungendo il supporto per CustomDescription
and Validator
all'interno di SaveInfo.
Le descrizioni personalizzate sono utili per aiutare il servizio di compilazione automatica a chiarire cosa viene salvato. Ad esempio, quando la schermata contiene una carta di credito, potrebbe visualizzare un logo della banca della carta di credito, le ultime quattro cifre del numero della carta di credito e la data di scadenza. Per saperne di più, consulta il corso
CustomDescription.
Gli oggetti
Validator
vengono utilizzati per evitare di mostrare l'interfaccia utente di salvataggio del completamento automatico quando la condizione del validatore
non è soddisfatta. Per saperne di più, consulta la classe
Validator 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. I suoni di avviso che superano questa velocità non vengono messi in coda e vengono persi. Questa modifica non influisce su altri aspetti del comportamento delle notifiche e i messaggi di notifica vengono comunque pubblicati come previsto.
-
NotificationListenerServiceeConditionProviderServicenon sono supportati su dispositivi Android con poca RAM che restituisconotruequando viene chiamatoActivityManager.isLowRamDevice().
Aggiornamento EditText
A partire dal livello API 27, il metodo EditText.getText() restituisce un Editable; in precedenza
restituiva un CharSequence. Questa modifica è
compatibile con le versioni precedenti, in quanto Editable implementa
CharSequence.
L'interfaccia Editable fornisce funzionalità aggiuntive
utili. Ad esempio, poiché Editable implementa anche l'interfaccia Spannable, puoi applicare il markup ai contenuti all'interno di un'istanza di EditText.
Azioni di Navigazione sicura programmatica
Utilizzando l'
implementazione WebView dell'API Navigazione sicura, la tua app può rilevare quando un'istanza di WebView tenta di accedere a un URL che Google ha classificato come minaccia nota. Per impostazione predefinita, il
WebView mostra un interstitial che avvisa gli utenti della minaccia nota.
Questa schermata offre agli utenti la possibilità di caricare comunque l'URL o tornare a una pagina precedente sicura.
In Android 8.1, puoi definire a livello di programmazione il modo in cui la tua app risponde a una minaccia nota:
- Puoi controllare se la tua app segnala minacce note a Navigazione sicura.
- Puoi fare in modo che la tua app esegua automaticamente una determinata azione, ad esempio tornare alla sicurezza, ogni volta che rileva un URL che Navigazione sicura classifica come minaccia nota.
Nota:per una protezione ottimale dalle minacce note, attendi
di aver 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 di
WebView di tornare sempre alla sicurezza dopo aver rilevato una
minaccia nota:
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(); } }
Estrattore di miniature video
La classe MediaMetadataRetriever ha un nuovo metodo, getScaledFrameAtTime(), che trova
un frame vicino a una determinata posizione temporale e restituisce una bitmap con le stesse proporzioni
del frame di origine, ma scalata per adattarsi a un rettangolo di larghezza e
altezza specificate. Ciò è utile per generare immagini in miniatura dai video.
Ti consigliamo di utilizzare questo metodo anziché getFrameAtTime(), che può sprecare memoria
perché restituisce una bitmap con la stessa risoluzione del video sorgente. Ad esempio, un fotogramma di un video in 4K sarebbe una bitmap di 16 MB, molto più grande di quanto ti servirebbe per una miniatura.
API Shared Memory
Android 8.1 (livello API 27) introduce una nuova API
SharedMemory. Questa classe consente di creare, mappare e gestire un'istanza
SharedMemory
anonima. 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 fornisce l'accesso
a un descrittore del file, che può essere mappato per la lettura e la scrittura. È un ottimo modo per condividere grandi quantità di dati tra app o tra più processi all'interno di una singola 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 oggetto WallpaperColors
da una bitmap, da una risorsa disegnabile o utilizzando tre colori selezionati manualmente.
Puoi anche recuperare queste informazioni sul colore.
Per creare un oggetto WallpaperColors, esegui una delle seguenti operazioni:
- Per creare un oggetto
WallpaperColorsutilizzando tre colori, crea un'istanza della classeWallpaperColorspassando il colore primario, secondario e terziario. Il colore principale non deve essere null. - Per creare un oggetto
WallpaperColorsda una bitmap, chiama il metodofromBitmap()passando l'origine bitmap come parametro. - Per creare un oggetto
WallpaperColorsda una risorsa disegnabile, chiama il metodofromDrawable()passando l'origine della risorsa disegnabile come parametro.
Per recuperare i dettagli del colore primario, secondario o terziario dallo sfondo, chiama i seguenti metodi:
getPrimaryColor()restituisce il colore più rappresentativo dello sfondo.getSecondaryColor()restituisce il secondo colore più importante dello sfondo.- Il metodo
getTertiaryColor()restituisce il terzo colore più importante dello sfondo.
Per comunicare al sistema eventuali variazioni di colore significative nello sfondo animato,
chiama il metodo notifyColorsChanged(). Questo metodo attiva un evento del ciclo di vita onComputeColors() in cui hai l'opportunità di fornire un nuovo oggetto WallpaperColors.
Per aggiungere un listener per le modifiche del colore, puoi chiamare il metodo addOnColorsChangedListener(). Puoi anche chiamare il metodo getWallpaperColors() per recuperare i colori principali di uno sfondo.
Aggiornamenti delle impronte
La classe FingerprintManager ha
introdotto 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: si è verificato un errore del lettore di impronte specifico del fornitore.
Aggiornamenti alla crittografia
Con Android 8.1 sono state apportate diverse modifiche alla crittografia:
- In Conscrypt sono stati implementati nuovi algoritmi. L'implementazione di Conscrypt
viene utilizzata preferibilmente rispetto all'implementazione esistente di Bouncy Castle. I nuovi algoritmi includono:
AlgorithmParameters:GCMKeyGenerator:AESKeyGenerator:DESEDEKeyGenerator:HMACMD5KeyGenerator:HMACSHA1KeyGenerator:HMACSHA224KeyGenerator:HMACSHA256KeyGenerator:HMACSHA384KeyGenerator:HMACSHA512SecretKeyFactory:DESEDESignature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)non funziona più per gli algoritmi che utilizzano GCM. Utilizza invecegetParameterSpec(GCMParameterSpec.class).- Molte classi Conscrypt interne associate a TLS sono state sottoposte a refactoring. Poiché
a volte gli sviluppatori accedono a questi in modo riflessivo, gli shim sono stati lasciati in posizione per
supportare l'utilizzo precedente, ma alcuni dettagli sono cambiati. Ad esempio, i socket
in precedenza erano di tipo
OpenSSLSocketImpl, ma ora sono di tipoConscryptFileDescriptorSocketoConscryptEngineSocket, entrambi estendonoOpenSSLSocketImpl. - I metodi
SSLSessionutilizzati per generareIllegalArgumentExceptionquando viene passato un riferimento null, ora generanoNullPointerException. - RSA
KeyFactorynon consente più la generazione di chiavi da array di byte più grandi della chiave codificata. Le chiamate ageneratePrivate()egeneratePublic()che forniscono unKeySpecin cui la struttura della chiave non riempie l'intero buffer genereranno unInvalidKeySpecException. - Quando una lettura del socket viene interrotta dalla chiusura del socket, Conscrypt restituiva -1 dalla lettura. La lettura ora genera
SocketException. - Il set di certificati CA radice è stato modificato, principalmente rimuovendo un gran numero di certificati obsoleti, ma anche rimuovendo i certificati radice per WoSign e StartCom. Per saperne di più su questa decisione, leggi il post del blog di Google Security, Rimozione definitiva dell'attendibilità dei certificati WoSign e StartCom.