Fonctionnalités et API d'Android 8.1

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 Les ConditionProviderService ne sont pas prises en charge avec une mémoire RAM faible Les appareils Android qui renvoient true lorsque ActivityManager.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 de WallpaperColors 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éthode fromBitmap() en transmettant la source du bitmap comme paramètre.
  • Pour créer un objet WallpaperColors à partir d'un élément drawable, appelez la méthode fromDrawable() 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:

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ôt getParameterSpec(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 type ConscryptFileDescriptorSocket ou ConscryptEngineSocket, qui étendent OpenSSLSocketImpl
  • Méthodes SSLSession utilisées pour générer IllegalArgumentException lorsqu'une référence nulle est transmise, envoyez NullPointerException.
  • 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() et generatePublic() qui fournissent un KeySpec où la structure de clé ne remplit pas l'ensemble du tampon génèrent un InvalidKeySpecException.
  • 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.