Android 8.1 (niveau d'API 27) introduit de nombreuses nouvelles fonctionnalités pour les utilisateurs et les développeurs. Ce document présente les nouveautés pour les développeurs.
Android Oreo (édition Go)
Android Go est notre initiative visant à optimiser l'expérience Android pour les milliards de personnes qui se connectent à Internet dans le monde entier. À partir d'Android 8.1, nous faisons d'Android une plate-forme idéale pour les appareils d'entrée de gamme. Voici quelques-unes des fonctionnalités de la configuration Android Oreo (édition Go) :
- Optimisations de la mémoire : Amélioration de l'utilisation de la mémoire sur l'ensemble de la plate-forme pour garantir que les applications peuvent s'exécuter efficacement sur les appareils dotés d'1 Go de RAM ou moins.
- Options de ciblage flexibles : De nouvelles constantes de fonctionnalité matérielle vous permettent de cibler la distribution de vos applications sur les appareils à mémoire vive normale ou faible via Google Play.
- Google Play : toutes les applications seront disponibles sur les appareils exécutant Android Oreo (édition Go). Google Play mettra en avant les applications spécifiquement optimisées par les développeurs pour offrir une expérience optimale à des milliards de personnes, conformément aux consignes pour le développement pour des milliards d'utilisateurs.
Nous avons mis à jour les consignes "Concevoir pour des milliards d'utilisateurs" en ajoutant des conseils sur la façon d' optimiser votre application pour les appareils exécutant Android Oreo (édition Go). Pour la plupart des développeurs, la meilleure façon de se préparer aux appareils équipés d'Android Oreo (édition Go) consiste à optimiser votre APK existant ou à utiliser la fonctionnalité d'APK multiples de Google Play pour cibler une version de votre APK sur les appareils à faible RAM. N'oubliez pas que le fait de rendre votre application plus légère et plus efficace profite à l'ensemble de votre audience, quel que soit l'appareil utilisé.
API Neural Networks
L'API Neural Networks fournit des calculs et des inférences accélérés pour les frameworks de machine learning sur l'appareil, tels que TensorFlow Lite (la bibliothèque ML multiplate-forme de Google pour mobile), Caffe2 et d'autres. Consultez le dépôt Open Source de TensorFlow Lite pour les téléchargements et la documentation. TensorFlow Lite fonctionne avec l'API Neural Networks pour exécuter efficacement des modèles tels que MobileNets, Inception v3 et Smart Reply sur votre appareil mobile.
Mises à jour du framework Autofill
Android 8.1 (niveau d'API 27) apporte plusieurs améliorations à Autofill Framework que vous pouvez intégrer à vos applications.
La classe BaseAdapter inclut désormais la méthode setAutofillOptions(), qui vous permet de fournir des représentations sous forme de chaîne des valeurs dans un adaptateur. Cela est utile pour les commandes spinner qui génèrent dynamiquement les valeurs dans leurs adaptateurs. Par exemple, vous pouvez utiliser la méthode setAutofillOptions() pour fournir une représentation sous forme de chaîne de la liste des années que les utilisateurs peuvent choisir comme date d'expiration d'une carte de crédit. Les services de saisie automatique peuvent utiliser la représentation sous forme de chaîne pour remplir correctement les vues qui nécessitent les données.
De plus, la classe AutofillManager inclut la méthode notifyViewVisibilityChanged(View, int, boolean) que vous pouvez appeler pour informer le framework des modifications apportées à la visibilité d'une vue dans une structure virtuelle. Il existe également une surcharge de la méthode pour les structures non virtuelles. Toutefois, les structures non virtuelles ne vous obligent généralement pas à notifier explicitement le framework, car la méthode est déjà appelée par la classe View.
Android 8.1 permet également aux services de saisie automatique de mieux personnaliser l'affordance de l'UI de sauvegarde en ajoutant la compatibilité avec CustomDescription
and Validator dans SaveInfo.
Les descriptions personnalisées sont utiles pour aider le service de saisie automatique à clarifier ce qui est enregistré. Par exemple, lorsque l'écran contient une carte de crédit, il peut afficher le logo de la banque de la carte de crédit, les quatre derniers chiffres du numéro de la carte de crédit et sa date d'expiration. Pour en savoir plus, consultez la classe
CustomDescription.
Les objets
Validator sont utilisés pour éviter d'afficher l'UI de sauvegarde de saisie automatique lorsque la condition du validateur n'est pas remplie. Pour en savoir plus, consultez la classe
Validator ainsi que ses sous-classes
LuhnChecksumValidator et RegexValidator.
Notifications
Android 8.1 inclut les modifications suivantes concernant les notifications :
- Les applications ne peuvent désormais émettre un son d'alerte de notification qu'une fois par seconde. Les sons d'alerte qui dépassent ce taux ne sont pas mis en file d'attente et sont perdus. Ce changement n'a aucune incidence sur les autres aspects du comportement des notifications. Les messages de notification sont toujours publiés comme prévu.
-
NotificationListenerServiceetConditionProviderServicene sont pas compatibles avec les appareils Android disposant d'une faible quantité de RAM et renvoyanttruelorsqueActivityManager.isLowRamDevice()est appelé.
Mise à jour EditText
À partir du niveau d'API 27, la méthode EditText.getText() renvoie un Editable. Auparavant, elle renvoyait un CharSequence. Cette modification est rétrocompatible, car Editable implémente CharSequence.
L'interface Editable fournit des fonctionnalités supplémentaires intéressantes. Par exemple, comme Editable implémente également l'interface Spannable, vous pouvez appliquer un balisage au contenu d'une instance de EditText.
Actions de navigation sécurisée programmatiques
En utilisant l'
implémentation WebView de l'API Navigation sécurisée, votre application peut détecter lorsqu'une instance de WebView tente d'accéder à une URL que Google a classée comme menace connue. Par défaut, WebView affiche un interstitiel qui avertit les utilisateurs de la menace connue.
Cet écran permet aux utilisateurs de charger l'URL malgré tout ou de revenir à une page précédente sécurisée.
Dans Android 8.1, vous pouvez définir de manière programmatique la façon dont votre application répond à une menace connue :
- Vous pouvez contrôler si votre application signale les menaces connues à la navigation sécurisée.
- Vous pouvez configurer votre application pour qu'elle effectue automatiquement une action spécifique (par exemple, revenir à la page précédente) chaque fois qu'elle rencontre une URL que la navigation sécurisée classe comme menace connue.
Remarque : Pour une protection optimale contre les menaces connues, attendez d'avoir initialisé la navigation sécurisée avant d'appeler la méthode loadUrl() d'un objet WebView.
Les extraits de code suivants montrent comment demander aux instances WebView de votre application de toujours revenir à un état sûr après avoir rencontré une menace connue :
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(); } }
Extracteur de miniatures de vidéos
La classe MediaMetadataRetriever comporte une nouvelle méthode, getScaledFrameAtTime(), qui recherche un frame proche d'une position temporelle donnée et renvoie un bitmap avec le même format que le frame source, mais mis à l'échelle pour s'adapter à un rectangle de largeur et de hauteur données. Cela est utile pour générer des miniatures à partir de vidéos.
Nous vous recommandons d'utiliser cette méthode plutôt que getFrameAtTime(), qui peut gaspiller de la mémoire, car elle renvoie un bitmap avec la même résolution que la vidéo source. Par exemple, une image extraite d'une vidéo 4K serait une bitmap de 16 Mo, soit beaucoup plus volumineuse que nécessaire pour une miniature.
API Shared Memory
Android 8.1 (niveau d'API 27) introduit une nouvelle API SharedMemory. Cette classe vous permet de créer, de mapper et de gérer une instance SharedMemory anonyme. Vous définissez la protection de la mémoire sur un objet SharedMemory pour la lecture et/ou l'écriture. Étant donné que l'objet SharedMemory est Parcelable, vous pouvez facilement le transmettre à un autre processus via AIDL.
L'API SharedMemory interagit avec la fonctionnalité ASharedMemory du NDK.
ASharedMemory donne accès à un descripteur de fichier, qui peut ensuite être mappé pour la lecture et l'écriture. C'est un excellent moyen de partager de grandes quantités de données entre des applications ou entre plusieurs processus au sein d'une même application.
API WallpaperColors
Android 8.1 (niveau d'API 27) permet à votre fond d'écran animé de fournir des informations sur les couleurs à l'UI système. Pour ce faire, créez un objet WallpaperColors à partir d'un bitmap, d'un élément graphique ou en utilisant trois couleurs sélectionnées manuellement.
Vous pouvez également récupérer ces informations sur les couleurs.
Pour créer un objet WallpaperColors, procédez comme suit :
- Pour créer un objet
WallpaperColorsà l'aide de trois couleurs, créez une instance de la classeWallpaperColorsen transmettant la couleur primaire, la couleur secondaire et la couleur tertiaire. La couleur principale ne doit pas être nulle. - Pour créer un objet
WallpaperColorsà partir d'un bitmap, appelez la méthodefromBitmap()en transmettant la source du bitmap en tant que paramètre. - Pour créer un objet
WallpaperColorsà partir d'un élément graphique, appelez la méthodefromDrawable()en transmettant la source de l'élément graphique en tant que paramètre.
Pour récupérer les détails des couleurs primaires, secondaires ou tertiaires du fond d'écran, appelez les méthodes suivantes :
getPrimaryColor()renvoie la couleur la plus représentative visuellement du fond d'écran.getSecondaryColor()renvoie la deuxième couleur la plus prédominante du fond d'écran.- La méthode
getTertiaryColor()renvoie la troisième couleur la plus importante du fond d'écran.
Pour informer le système de toute modification importante des couleurs de votre fond d'écran animé, appelez la méthode notifyColorsChanged(). Cette méthode déclenche un événement de cycle de vie onComputeColors(), qui vous permet de fournir un nouvel objet WallpaperColors.
Pour ajouter un écouteur pour les changements de couleur, vous pouvez appeler la méthode addOnColorsChangedListener(). Vous pouvez également appeler la méthode getWallpaperColors() pour récupérer les couleurs principales d'un fond d'écran.
Mises à jour de l'empreinte digitale
La classe FingerprintManager a introduit les codes d'erreur suivants :
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT: l'utilisateur a essayé de déverrouiller son appareil trop de fois avec le lecteur d'empreinte digitale. -
FINGERPRINT_ERROR_VENDOR: une erreur de lecteur d'empreinte digitale spécifique au fournisseur s'est produite.
Modifications apportées à la cryptographie
Plusieurs modifications ont été apportées à la cryptographie avec Android 8.1 :
- De nouveaux algorithmes ont été implémentés dans Conscrypt. L'implémentation Conscrypt est utilisée de préférence à l'implémentation Bouncy Castle existante. Voici quelques-uns des nouveaux algorithmes :
AlgorithmParameters:GCMKeyGenerator:AESKeyGenerator:DESEDEKeyGenerator:HMACMD5KeyGenerator:HMACSHA1KeyGenerator:HMACSHA224KeyGenerator:HMACSHA256KeyGenerator:HMACSHA384KeyGenerator:HMACSHA512SecretKeyFactory:DESEDESignature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)ne fonctionne plus pour les algorithmes qui utilisent GCM. Utilisez plutôtgetParameterSpec(GCMParameterSpec.class).- De nombreuses classes Conscrypt internes associées à TLS ont été refactorisées. Étant donné que les développeurs accèdent parfois à ces éléments de manière réflexive, des shims ont été laissés en place pour prendre en charge l'utilisation précédente, mais certains détails ont changé. Par exemple, les sockets étaient auparavant de type
OpenSSLSocketImpl, mais ils sont désormais de typeConscryptFileDescriptorSocketouConscryptEngineSocket, qui étendent tous deuxOpenSSLSocketImpl. - Les méthodes
SSLSessionutilisées pour générerIllegalArgumentExceptionlorsqu'une référence nulle est transmise génèrent désormaisNullPointerException. - Le
KeyFactoryRSA ne permet plus de générer des clés à partir de tableaux d'octets plus grands que la clé encodée. Les appels àgeneratePrivate()etgeneratePublic()qui fournissent unKeySpecoù la structure de clé ne remplit pas l'intégralité du tampon généreront unInvalidKeySpecException. - Lorsque la lecture d'un socket est interrompue par la fermeture du socket, Conscrypt renvoyait -1 à partir de la lecture. La lecture génère
SocketException. - L'ensemble des certificats CA racine a été modifié. Un grand nombre de certificats obsolètes ont été supprimés, ainsi que les certificats racine pour WoSign et StartCom. Pour en savoir plus sur cette décision, consultez l'article de blog Google sur la sécurité Suppression définitive de la confiance accordée aux certificats WoSign et StartCom.