Android 8.1 (niveau d'API 27) introduit plusieurs 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 en ligne dans le monde entier. À partir d'Android 8.1, nous faisons d'Android une excellente plate-forme pour les appareils d'entrée de gamme. Voici les fonctionnalités de la configuration Android Oreo (édition Go) :
- Optimisations de la mémoire. Amélioration de l'utilisation de la mémoire sur la plate-forme pour garantir que les applications peuvent s'exécuter efficacement sur les appareils disposant de 1 Go de RAM ou moins.
- Options de ciblage flexibles Nouvelles constantes de fonctionnalités matérielles pour vous permettre de cibler la distribution de vos applications sur des appareils avec une RAM normale ou faible via Google Play.
- Google Play. Toutes les applications seront toutefois disponibles sur les appareils équipés d'Android Oreo. (édition Go), Google Play donnera de la visibilité aux applications spécifiquement optimisées par les développeurs offrir une expérience optimale à des milliards de personnes grâce à la construction pour des milliards consignes.
Nous avons mis à jour les Consignes pour la création de milliards d'applications avec des conseils supplémentaires sur l'optimisation de votre application pour les appareils exécutant Android Oreo (édition Go). Pour la plupart des développeurs, optimiser votre APK existant ou utiliser la fonctionnalité Multiple APK de Google Play pour cibler une version de votre APK sur les appareils à faible RAM est le meilleur moyen de se préparer aux appareils équipés d'Android Oreo (édition Go). N'oubliez pas qu'il est important 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 un calcul et une inférence 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), ainsi que Caffe2 et d'autres. Pour télécharger et consulter la documentation, consultez le dépôt Open Source de TensorFlow Lite. TensorFlow Lite fonctionne avec l'API Neural Networks pour exécuter des modèles MobileNets Inception v3, et la fonctionnalité Réponse suggérée sur votre appareil mobile.
Mises à jour du framework de saisie automatique
Android 8.1 (niveau d'API 27) apporte plusieurs améliorations au framework de saisie automatique que vous pouvez intégrer à vos applications.
BaseAdapter
La classe inclut désormais setAutofillOptions()
, qui vous permet de fournir des représentations sous forme de chaîne des valeurs d'une
adaptateur secteur. Cela est utile pour les commandes de sélecteur qui génèrent dynamiquement les valeurs dans leurs adaptateurs. Par exemple, vous pouvez utiliser la méthode setAutofillOptions()
pour fournir une représentation de chaîne de la liste des années que les utilisateurs peuvent choisir dans le cadre d'une date d'expiration de carte de crédit. Les services de saisie automatique peuvent utiliser la représentation de chaîne pour remplir correctement les vues qui nécessitent les données.
De plus, le AutofillManager
La classe inclut la méthode notifyViewVisibilityChanged(View, int, boolean)
.
que vous pouvez appeler pour avertir le framework des changements dans la visibilité
dans une structure virtuelle. La méthode est également surchargée
des structures virtuelles. Cependant, 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
View
.
Android 8.1 permet également aux services de saisie automatique de personnaliser davantage l'UI d'enregistrement.
affordance en ajoutant la prise en charge de CustomDescription
and
Validator
.
dans un délai de SaveInfo
.
Les descriptions personnalisées aident le service de saisie automatique à clarifier
en cours d'enregistrement ; Par exemple, lorsque l'écran contient
une carte de crédit, il pourrait
le logo de la banque et les quatre derniers chiffres de la carte de crédit ;
et son numéro d'expiration. Pour en savoir plus, consultez le
CustomDescription
.
Validator
sont utilisés pour éviter d'afficher l'UI de sauvegarde de saisie automatique lorsque l'outil de validation
condition n'est pas remplie. Pour en savoir plus, consultez les
Validator ainsi que ses sous-classes,
LuhnChecksumValidator et RegexValidator.
Notifications
Android 8.1 apporte les modifications suivantes aux notifications:
- Les applications ne peuvent désormais émettre une alerte de notification qu'une seule fois par seconde. Les sons d'alerte qui dépassent cette fréquence 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.
-
NotificationListenerService
et LesConditionProviderService
ne sont pas prises en charge avec une mémoire RAM faible Les appareils Android qui renvoienttrue
lorsqueActivityManager.isLowRamDevice()
est appelé.
Mise à jour d'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, puisque Editable
implémente
CharSequence
L'interface Editable
offre des fonctionnalités supplémentaires
de Google Cloud. Par exemple, comme Editable
implémente également l'interface Spannable
, vous pouvez appliquer du balisage au contenu d'une instance de EditText
.
Actions de navigation sécurisée programmatique
En utilisant l'implémentation WebView
de l'API Safe Browsing, votre application peut détecter quand 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 de toute façon 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éagit à une menace connue :
- Vous pouvez contrôler si votre application signale les menaces connues à Safe Navigation.
- Vous pouvez faire en sorte que votre application effectue automatiquement une action particulière, comme à la sécurité. Chaque fois qu'il tombe sur une URL vers laquelle la navigation sécurisée est classé comme une menace connue.
Remarque:Pour une protection optimale contre les menaces connues, attendez
tant que vous n'avez pas initialisé la navigation sécurisée avant d'appeler une
la méthode loadUrl()
de l'objet WebView
.
Les extraits de code suivants montrent comment indiquer aux instances de votre application
WebView
pour toujours revenir en sécurité après avoir rencontré un
menace connue:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /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
dispose d'une nouvelle méthode, getScaledFrameAtTime()
, qui trouve
une image à proximité d'une position temporelle donnée et renvoie un bitmap ayant le même aspect
comme le cadre source, mais mis à l'échelle pour s'adapter à un rectangle de largeur et
hauteur. Cela s'avère utile pour générer des miniatures à partir d'une vidéo.
Nous vous recommandons d'utiliser cette méthode plutôt que getFrameAtTime()
, qui peut gaspiller de la mémoire
car il renvoie un bitmap ayant la même résolution que la vidéo source. Pour
Par exemple, l'image d'une vidéo 4K correspond à un bitmap de 16 Mo, soit beaucoup plus
une image miniature.
API de mémoire partagée
Android 8.1 (niveau d'API 27) introduit une nouvelle
SharedMemory
API. Cette classe vous permet de créer, de mapper et de gérer
SharedMemory
Compute Engine. 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 parcellable, vous pouvez facilement le transmettre à un autre processus via AIDL.
SharedMemory
L'API interagit avec
ASharedMemory
dans le NDK.
ASharedMemory
permet d'accéder à un descripteur de fichier, qui peut ensuite être mappé en lecture et en é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 Fond d'écranColors
Android 8.1 (niveau d'API 27) permet d'afficher des couleurs sur votre fond d'écran animé
à l'UI du système. Pour ce faire, créez un objet WallpaperColors
à partir d'un bitmap, d'un drawable ou en utilisant trois couleurs sélectionnées manuellement.
Vous pouvez également récupérer ces informations sur la couleur.
Pour créer un objet WallpaperColors
, procédez comme suit :
- Pour créer un
WallpaperColors
à l'aide de trois couleurs, créez une instance deWallpaperColors
en transmettant la couleur primaire, secondaire et tertiaire. L'instance principale color ne doit pas avoir une valeur nulle. - Pour créer un objet
WallpaperColors
à partir d'un bitmap, appelez la méthodefromBitmap()
en transmettant la source du bitmap comme paramètre. - Pour créer un objet
WallpaperColors
à partir d'un élément drawable, appelez la méthodefromDrawable()
en transmettant la source drawable comme paramètre.
Pour récupérer les détails de la couleur primaire, secondaire ou tertiaire de la fond d'écran, appelez les méthodes suivantes:
getPrimaryColor()
affiche la couleur la plus représentative du fond d'écran.getSecondaryColor()
renvoie la deuxième couleur la plus importante du fond d'écran.getTertiaryColor()
renvoie la troisième couleur la plus éminente du fond d'écran.
Pour informer le système de toute modification de couleur importante dans votre fond d'écran animé, appelez la méthode notifyColorsChanged()
. Cette méthode déclenche un événement de cycle de vie onComputeColors()
dans lequel vous pouvez fournir un nouvel objet WallpaperColors
.
Pour ajouter un écouteur pour les modifications de couleur, vous pouvez appeler la méthode addOnColorsChangedListener()
. Vous pouvez
appeler également la méthode getWallpaperColors()
pour récupérer les couleurs primaires d'un fond d'écran.
Mises à jour des empreintes digitales
La classe FingerprintManager
comporte
introduit les codes d'erreur suivants:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
: l'utilisateur a essayé pour déverrouiller son appareil à l’aide du lecteur d’empreinte digitale. -
FINGERPRINT_ERROR_VENDOR
: empreinte propre au fournisseur erreur de lecteur.
Mises à jour concernant la cryptographie
Un certain nombre de modifications apportées à la cryptographie ont été apportées avec Android 8.1:
- De nouveaux algorithmes ont été implémentés dans Conscrypt. L'implémentation Conscrypt est préférée à l'implémentation Bouncy Castle existante. Les nouveaux algorithmes incluent:
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)
non fonctionne plus longtemps pour les algorithmes qui utilisent GCM. Utilisez plutôtgetParameterSpec(GCMParameterSpec.class)
- De nombreuses classes internes Conscrypt associées à TLS ont été refactorisées. Depuis
développeurs y accèdent parfois de manière réfléchie, les shims ont été laissés en place pour
prend en charge une utilisation antérieure, mais certains détails ont changé. Par exemple, les sockets
qui étaient auparavant de type
OpenSSLSocketImpl
, mais désormais de typeConscryptFileDescriptorSocket
ouConscryptEngineSocket
, qui étendentOpenSSLSocketImpl
- Méthodes
SSLSession
utilisées pour générerIllegalArgumentException
lorsqu'une référence nulle est transmise, envoyezNullPointerException
. - Le
KeyFactory
RSA ne permet plus de générer de clés à partir d'un tableau d'octets plus volumineux que la clé encodée. Les appels àgeneratePrivate()
etgeneratePublic()
qui fournissent unKeySpec
où la structure de clé ne remplit pas l'ensemble du tampon génèrent unInvalidKeySpecException
. - Lorsqu'une lecture de socket est interrompue par la fermeture du socket, Conscrypt utilise
pour renvoyer -1 pour la lecture. La lecture génère désormais une exception
SocketException
. - L'ensemble des certificats d'autorité de certification racine a été modifié, en supprimant principalement un grand nombre de certificats obsolètes, mais aussi les certificats racine de WoSign et StartCom. Pour en savoir plus sur cette décision, consultez l'article de blog Google Security Suppression définitive de la confiance à l'égard des certificats WoSign et StartCom.