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)

<ph type="x-smartling-placeholder"></ph> Android Go est notre initiative visant à optimiser l'expérience Android pour des milliards de personnes qui se connectent à Internet dans le monde. À partir d'Android 8.1, nous faisons d'Android une excellente plate-forme pour les appareils d'entrée de gamme. Fonctionnalités d'Android Oreo (édition Go) incluent:

  • Optimisations de la mémoire. Une meilleure utilisation de la mémoire sur la plate-forme que les applications peuvent fonctionner efficacement sur des appareils avec 1 Go de RAM ou moins.
  • Options de ciblage flexibles : Nouveau fonctionnalité matérielle constantes pour cibler la distribution de vos applications sur des appareils à mémoire RAM normale ou faible 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 <ph type="x-smartling-placeholder"></ph> consignes.

Nous avons mis à jour le bâtiment pour des milliards d'utilisateurs <ph type="x-smartling-placeholder"></ph> Consignes ainsi que des informations supplémentaires sur la façon de <ph type="x-smartling-placeholder"></ph> optimiser votre application pour les appareils en cours d'exécution Android Oreo (édition Go) Pour la plupart des développeurs, optimiser leur APK existant ou utiliser de Google Play Fonctionnalité d'APK multiples 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 des calculs et des inférences accélérés pour les machines sur l'appareil. de machine learning tels que TensorFlow Lite, la bibliothèque de ML multiplate-forme de Google pour mobile, ainsi que Caffe2 et d’autres. Consulter le guide TensorFlow Lite Open Source pour les téléchargements et la documentation. 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 de Autofill Framework

Android 8.1 (niveau d'API 27) offre plusieurs améliorations de la saisie automatique Framework que vous pouvez intégrer dans 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. Ceci est utile pour spinner. qui génèrent dynamiquement les valeurs dans leurs adaptateurs. Par exemple : vous pouvez utiliser la méthode setAutofillOptions() pour fournir une chaîne représentation de la liste des années que les utilisateurs peuvent choisir dans le cadre d'une la date d'expiration de la carte de crédit. Les services de saisie automatique peuvent utiliser la représentation sous forme de chaîne pour remplir de manière appropriée les vues qui ont besoin des 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 fois par seconde. Sons d'alerte dépassant cette ne sont pas mis en file d’attente et sont perdus. Cette modification n'a aucune incidence sur les autres aspects des notifications et les messages de notification continuent à s'afficher normalement.
  • NotificationListenerService et ConditionProviderService ne sont pas pris 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. précédemment il a renvoyé un résultat 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 l'interface Spannable, vous pouvez appliquer un balisage contenu dans une instance de EditText.

Actions de navigation sécurisée programmatique

En utilisant le WebView de l'API Safe Browsing, votre application peut détecter quand une instance de WebView tente de naviguer à 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 quand même l'URL ou de revenir page précédente sans risque.

Sous Android 8.1, vous pouvez définir de manière programmatique la façon dont vos l'application à 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: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 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 SharedMemory pour la lecture et/ou l'écriture. SharedMemory est Parcelable, vous pouvez facilement le transmettre à un autre processus via AIDL.

SharedMemory L'API interagit avec ASharedMemory dans le NDK. ASharedMemory autorise l'accès à un descripteur de fichier, qui peut ensuite être mappé en lecture et en écriture. C'est une de partager de grandes quantités 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 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 de couleur.

Pour créer un WallpaperColors , effectuez l'une des opérations suivantes:

  • 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 WallpaperColors à partir d'un bitmap, appelez la méthode fromBitmap() en transmettant la source bitmap comme paramètre.
  • Pour créer un WallpaperColors à partir d'un drawable, appelez la méthode fromDrawable() en transmettant la source du drawable en tant que 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 avertir le système de tout changement de couleur significatif sur votre fond d'écran animé, procédez comme suit : appeler notifyColorsChanged() . Cette méthode déclenche un cycle de vie d'une onComputeColors() événement au cours duquel vous avez la possibilité de proposer un nouveau WallpaperColors .

Pour ajouter un écouteur pour les changements 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. Conscrypt est de préférence utilisée pour la mise en œuvre la mise en œuvre. Les nouveaux algorithmes incluent: <ph type="x-smartling-placeholder">
      </ph>
    • 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 Conscrypt internes 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 de tableaux d'octets plus grands que la clé encodée. Appels vers generatePrivate() et generatePublic() qui fournissent KeySpec, où la structure de clé ne remplit pas l'intégralité du tampon génère une 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 maintenant SocketException
  • L’ensemble des certificats CA racine a été modifié, principalement en supprimant un le nombre de certificats obsolètes, mais aussi en supprimant les certificats racine WoSign et StartCom. Pour plus d'informations sur cette décision, consultez le Article de blog sur la sécurité, Fin Suppression de la confiance envers les certificats WoSign et StartCom.