La bibliothèque Jetpack WindowManager permet aux développeurs d'applications d'accepter de nouveaux facteurs de forme d'appareils et environnements multifenêtres.
Les extensions WindowManager (Extensions) sont un module de plate-forme Android activable qui permet d'utiliser diverses fonctionnalités de Jetpack WindowManager. Le module est implémenté dans AOSP dans frameworks/base/libs/WindowManager/Jetpack
et est fourni sur les appareils compatibles avec les fonctionnalités WindowManager.
Distribution du module Extensions
Les extensions sont compilées dans une bibliothèque .jar
et placées dans la partition system_ext
d'un appareil si les extensions sont activées dans le fichier makefile de l'appareil.
Pour activer les extensions sur un appareil, ajoutez ce qui suit au fichier makefile de l'appareil du produit :
$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk)
Cela active les packages androidx.window.extensions
et androidx.window.sidecar
sur l'appareil et définit la propriété persist.wm.extensions.enabled
.
L'inclusion de ces packages dans le fichier make place également des déclarations dans etc/permissions/
, ce qui les rend disponibles pour les processus d'application. Normalement, les modules sont chargés et exécutés dans le cadre du processus d'application au moment de l'exécution lorsqu'ils sont utilisés par la bibliothèque Jetpack WindowManager. Son fonctionnement est donc semblable au code du framework côté client, comme illustré dans la figure suivante:
Le module androidx.window.extensions
est le module Extensions actuellement en cours de développement. Le module androidx.window.sidecar
est un ancien module inclus pour assurer la compatibilité avec les premières versions de Jetpack WindowManager, mais le side-car n'est plus activement maintenu.
La figure suivante montre la logique permettant de déterminer l'utilisation de androidx.window.extensions
ou de androidx.window.sidecar
.
Modules d'extension
Les extensions fournissent des fonctionnalités de fenêtrage pour les appareils pliables à grand écran et les appareils compatibles avec le fenêtrage sur les écrans externes. Les domaines de fonctionnalité incluent les suivants :
Les implémentations OEM des extensions peuvent fournir des composants nuls ou des composants avec des implémentations par défaut ou des bouchons des méthodes dans l'interface WindowExtensions
si le matériel de l'appareil n'est pas compatible avec les fonctionnalités correspondantes, sauf si la fonctionnalité est spécifiquement demandée dans le document de définition de la compatibilité (CDD) 7.1.1.1.
Extensions et API Jetpack
Le module d'extensions WindowManager fournit sa propre surface d'API en plus des API de plate-forme publique. Le module Extensions est développé publiquement dans une bibliothèque Jetpack androidx.window.extensions
non destinée aux développeurs, afin que Jetpack WindowManager (androidx.window
) puisse s'y associer au moment de la compilation. La surface de l'API Extensions fournit généralement des API de niveau inférieur.
Les API fournies par les extensions ne sont destinées qu'à la bibliothèque Jetpack WindowManager. Les API Extensions ne sont pas destinées à être appelées directement par les développeurs d'applications. La bibliothèque Extensions ne doit pas être ajoutée en tant que dépendance d'une application dans le fichier de compilation Gradle pour garantir un fonctionnement correct. Évitez de précompiler directement la bibliothèque Extensions dans une application. Utilisez plutôt le chargement au moment de l'exécution pour éviter de charger un mélange de classes Extensions précompilées et fournies par le moment de l'exécution.
Jetpack WindowManager (androidx.window
) est destiné à être ajouté en tant que dépendance d'application et fournit les API publiques destinées aux développeurs, y compris celles des fonctionnalités des extensions WindowManager. La bibliothèque WindowManager charge automatiquement les extensions dans le processus de l'application et encapsule les API Extensions de niveau inférieur dans des abstractions de niveau supérieur et des interfaces plus ciblées. Les API Jetpack WindowManager respectent les normes de développement d'applications Android modernes et sont conçues pour offrir une interopérabilité pratique en s'intégrant bien aux codebases qui utilisent d'autres bibliothèques AndroidX.
Versions et mises à jour des extensions
Le module Extensions peut être mis à jour en même temps que les mises à jour annuelles ou trimestrielles de la plate-forme Android. Les mises à jour trimestrielles permettent d'augmenter le niveau de l'API Extensions entre les mises à jour de l'API de la plate-forme Android, ce qui permet d'accélérer l'itération et d'offrir aux OEM la possibilité d'ajouter un accès API officiel aux nouvelles fonctionnalités à proximité des lancements de matériel.
Le tableau suivant répertorie les versions de l'API androidx.window.extensions
pour différentes versions d'Android.
Version de la plate-forme Android | Niveau d'API WindowManager Extensions | Version de l'API androidx.window.extensions |
---|---|---|
Android 15 | 6 | 1.5.0 (bientôt disponible) |
Android 14 QPR3 | 5 | 1.4.0 (bientôt disponible) |
Android 14 QPR1 | 4 | 1.3.0 |
Android 14 | 3 | 1.2.0 |
Android 13 QPR3 | 2 | 1.1.0 |
Android 13 | 1 | 1.0.0 |
Android 12L | 1 | 1.0.0 |
Le niveau de l'API Extensions (colonne centrale) est augmenté chaque fois qu'un ajout est effectué à la surface d'API stable existante (colonne de droite).
Rétrocompatibilité.
Jetpack WindowManager gère la complexité de la gestion des mises à jour fréquentes au niveau de l'API, de l'évolution rapide de l'API et de la rétrocompatibilité. Lorsque le code de la bibliothèque est exécuté dans le processus d'application, la bibliothèque vérifie le niveau de l'API Extensions déclaré et fournit l'accès aux fonctionnalités en fonction du niveau déclaré.
Pour empêcher une application de planter au moment de l'exécution, WindowManager effectue également une vérification Java de réflexion des API Extensions disponibles au niveau de l'API Extensions déclaré. En cas de non-concordance, WindowManager peut désactiver l'utilisation des extensions (en partie ou complètement) et signaler que les fonctionnalités pertinentes ne sont pas disponibles pour l'application.
Les extensions WindowManager sont implémentées en tant que module system_ext
qui utilise des API de plate-forme privées pour appeler le noyau WindowManager, DeviceStateManager
et d'autres services système lors de l'implémentation des fonctionnalités d'extension.
La compatibilité ne peut pas être maintenue avec les versions préliminaires des extensions avant la version trimestrielle ou annuelle de la plate-forme Android avec laquelle les versions sont finalisées. L'historique complet des API Extensions est disponible dans les fichiers texte de l'API window:extensions:extensions
de la branche de version.
Les versions plus récentes des extensions doivent continuer à fonctionner avec les anciennes versions de WindowManager compilées dans des applications afin de maintenir la compatibilité ascendante. Pour ce faire, toute nouvelle version de l'API Extensions n'ajoute que les nouvelles API et ne supprime pas les anciennes. Par conséquent, les applications avec d'anciennes versions de WindowManager peuvent continuer à utiliser les anciennes API Extensions avec lesquelles les applications ont été compilées.
La vérification CTS garantit que pour toute version déclarée des API Extensions sur l'appareil, toutes les API de cette version et des versions précédentes sont présentes et fonctionnelles.
Performances
À partir d'Android 14 (niveau d'API 34), le module Extensions est mis en cache dans les chargeurs de classe système non bootclasspath par défaut. Par conséquent, le chargement du module en mémoire au démarrage de l'application n'a aucun impact sur les performances. L'utilisation de fonctionnalités de module individuelles peut avoir une légère influence sur les caractéristiques de performances des applications lorsque des appels IPC supplémentaires sont effectués entre le client et le serveur.
Modules
Intégration d'activités
Le composant Intégration d'activités fournit un ensemble de fonctionnalités permettant aux applications d'organiser la présentation des fenêtres d'activités dans les limites de l'application parente. Cela inclut l'affichage simultané de deux activités côte à côte dans une mise en page multi-volets, ce qui facilite l'optimisation pour les grands écrans des anciennes applications.
Le composant d'intégration d'activités doit être disponible sur tous les appareils dotés d'un écran intégré d'une taille supérieure ou égale à sw600 dp
.
L'intégration d'activités doit également être activée sur les appareils compatibles avec les connexions d'écrans externes, car l'application peut s'afficher dans une taille plus grande lorsque des écrans externes sont connectés au moment de l'exécution.
Configuration de l'appareil
Aucune configuration d'appareil spécifique n'est nécessaire, sauf pour activer le module Extensions, comme décrit dans la section Distribution du module Extensions. Il est judicieux d'activer les extensions sur tous les appareils compatibles avec le mode multifenêtre. Les futures versions d'Android rendront probablement les extensions obligatoires pour les configurations d'appareils portables et à grand écran courantes.
Informations sur la mise en page des fenêtres
Le composant d'informations sur la mise en page des fenêtres identifie la position et l'état de la charnière sur un appareil pliable lorsque celle-ci traverse une fenêtre d'application. Les informations de mise en page des fenêtres permettent aux applications de répondre aux mises en page optimisées et de les afficher en mode sur table sur les appareils pliables. Pour en savoir plus sur l'utilisation, consultez la section Adapter votre application aux appareils pliables.
Les appareils Android pliables qui incluent une charnière reliant des zones de panneau d'affichage distinctes ou continues doivent mettre les informations sur la charnière à la disposition des applications via WindowLayoutComponent
.
La position et les limites de la charnière doivent être indiquées par rapport à la fenêtre de l'application identifiée par un Context
transmis à l'API. Si les limites de la fenêtre de l'application n'ont pas d'intersection avec les limites de la charnière, l'élément DisplayFeature
de la charnière ne doit pas être signalé. Il est également acceptable de ne pas signaler les fonctionnalités d'affichage lorsque leur position ne peut pas être signalée de manière fiable, par exemple lorsqu'une fenêtre d'application peut être déplacée librement par l'utilisateur en mode multifenêtre ou en mode letterbox de compatibilité.
Pour les fonctionnalités de pliage, les mises à jour de l'état doivent être signalées lorsque la position de la charnière passe d'un état stable à un autre. Par défaut, dans un état d'affichage plat, l'API doit signaler FoldingFeature.State.FLAT
.
Si le matériel de l'appareil peut être laissé en mode demi-plié dans un état stable, l'API doit signaler FoldingFeature.State.HALF_OPENED
.
Il n'y a pas d'état fermé dans l'API, car dans ce cas, la fenêtre de l'application ne serait pas visible ou ne franchirait pas les limites de la charnière.
Configuration de l'appareil
Pour permettre l'implémentation de la fonctionnalité de pliage, les OEM doivent procéder comme suit:
Configurez les états des appareils dans
device_state_configuration.xml
à utiliser parDeviceStateManagerService
. Pour en savoir plus, consultezDeviceStateProviderImpl.java
.Si les implémentations par défaut de
DeviceStateProvider
ou deDeviceStatePolicy
ne conviennent pas à l'appareil, une implémentation personnalisée peut être utilisée.Activez le module Extensions comme décrit dans la section Distribution du module Extensions.
Spécifiez l'emplacement des fonctionnalités d'affichage dans la ressource de chaîne
com.android.internal.R.string.config_display_features
(généralement dansframeworks/base/core/res/res/values/config.xml
en superposition d'appareil).Le format attendu pour la chaîne est le suivant :
<type>-[<left>,<top>,<right>,<bottom>]
Le
type
peut êtrefold
ouhinge
. Les valeurs deleft
,top
,right
etbottom
sont des coordonnées entières en pixels dans l'espace de coordonnées de l'écran selon l'orientation naturelle de l'affichage. La chaîne de configuration peut contenir plusieurs caractéristiques d'affichage séparées par un point-virgule.Exemple :
<!-- Jetpack WindowManager display features --> <string name="config_display_features" translatable="false">fold-[1000,0,1000,2000]</string>
Définissez le mappage entre les identifiants d'état de l'appareil interne utilisés dans
DeviceStateManager
et les constantes d'état publiques envoyées aux développeurs danscom.android.internal.R.array.config_device_state_postures
.Le format attendu pour chaque entrée est le suivant :
<device_specific_state_identifier>:<Jetpack WindowManager state identifier>
Les identifiants d'état acceptés sont les suivants:
COMMON_STATE_NO_FOLDING_FEATURES = 1
: l'état ne comporte aucune fonctionnalité de pliage à signaler. Par exemple, il peut s'agir de l'état fermé d'un appareil pliable classique avec l'écran principal du côté intérieur.COMMON_STATE_HALF_OPENED = 2
: la fonctionnalité de pliage est à moitié ouverte.COMMON_STATE_FLAT = 3
: la fonctionnalité de pliage est plate. Il peut s'agir, par exemple, de l'état ouvert d'un appareil pliable classique, avec l'écran principal à l'intérieur.COMMON_STATE_USE_BASE_STATE = 1000
: dans Android 14, valeur pouvant être utilisée pour les états émulés où l'état de la charnière est dérivé à l'aide de l'état de base, comme défini dansCommonFoldingFeature.java
Pour en savoir plus, consultez
DeviceStateManager.DeviceStateCallback#onBaseStateChanged(int)
.Exemple :
<!-- Map of System DeviceState supplied by DeviceStateManager to WindowManager posture.--> <string-array name="config_device_state_postures" translatable="false"> <item>0:1</item> <!-- CLOSED : COMMON_STATE_NO_FOLDING_FEATURES --> <item>1:2</item> <!-- HALF_OPENED : COMMON_STATE_HALF_OPENED --> <item>2:3</item> <!-- OPENED : COMMON_STATE_FLAT --> <item>3:1</item> <!-- REAR_DISPLAY : COMMON_STATE_NO_FOLDING_FEATURES --> <item>4:1000</item> <!-- CONCURRENT : COMMON_STATE_USE_BASE_STATE --> </string-array>
Zone de la fenêtre
Le composant "Zone de fenêtre" fournit un ensemble de fonctionnalités qui permettent aux applications d'accéder à des écrans et des zones d'affichage supplémentaires sur certains appareils pliables et multi-écrans.
Le mode d'affichage arrière permet à une application d'afficher l'UI d'aperçu de l'appareil photo sur l'écran de couverture d'un appareil pliable afin d'utiliser la caméra principale de l'appareil pour les selfies et les vidéos. Les appareils dont l'écran est compatible avec Android (tel que défini par le CDD Android en termes d'attributs tels que la taille, la densité et les affordances de navigation disponibles) couvrent l'écran qui s'aligne sur les caméras arrière, et doivent permettre l'accès au mode d'affichage arrière.
Sous Android 14, le mode Dual Screen permet aux applications exécutées sur l'écran intérieur d'un appareil pliable d'afficher du contenu supplémentaire sur l'écran externe visible par les autres utilisateurs. Par exemple, l'écran externe peut afficher l'aperçu de l'appareil photo pour la personne photographiée ou filmée.
Configuration de l'appareil
Pour permettre l'implémentation de la fonctionnalité de pliage, les OEM doivent procéder comme suit:
Configurez les états des appareils dans
device_state_configuration.xml
à utiliser parDeviceStateManagerService
. Pour en savoir plus, consultezDeviceStateProviderImpl.java
.Si l'implémentation par défaut de
DeviceStateProvider
ou deDeviceStatePolicy
n'est pas adaptée à l'appareil, une implémentation personnalisée peut être utilisée.Pour les appareils pliables compatibles avec le mode ouvert ou plat, spécifiez les identifiants d'état correspondants dans
com.android.internal.R.array.config_openDeviceStates
.Pour les appareils pliables compatibles avec les états pliés, listez les identifiants d'état correspondants dans
com.android.internal.R.array.config_foldedDeviceStates
.Pour les appareils pliables qui acceptent un état à moitié plié (la charnière est à moitié ouverte, comme un ordinateur portable), listez les états correspondants dans
com.android.internal.R.array.config_halfFoldedDeviceStates
.Pour les appareils compatibles avec le mode d'affichage arrière:
- Répertoriez les états correspondants dans
com.android.internal.R.array.config_rearDisplayDeviceStates
pourDeviceStateManager
. - Spécifiez l'adresse d'affichage physique de l'écran arrière dans
com.android.internal.R.string.config_rearDisplayPhysicalAddress
. - Spécifiez l'identifiant d'état dans
com.android.internal.R.integer.config_deviceStateRearDisplay
qui sera utilisé par les extensions. - Ajoutez l'identifiant d'état dans
com.android.internal.R.array.config_deviceStatesAvailableForAppRequests
pour le mettre à la disposition des applications.
- Répertoriez les états correspondants dans
Sur Android 14, pour les appareils compatibles avec le mode d'affichage double (concurremment) :
- Définissez
com.android.internal.R.bool.config_supportsConcurrentInternalDisplays
surtrue
. - Indiquez l'adresse physique d'affichage de l'écran arrière dans le champ
com.android.internal.R.config_deviceStateConcurrentRearDisplay
. - Spécifiez l'identifiant d'état dans
com.android.internal.R.integer.config_deviceStateConcurrentRearDisplay
à utiliser par les extensions si l'identifiant doit être mis à la disposition des applications. - Ajoutez l'identifiant d'état dans
com.android.internal.R.array.config_deviceStatesAvailableForAppRequests
pour le rendre disponible pour les applications.
- Définissez
Validation
Les OEM doivent vérifier leurs implémentations pour s'assurer du comportement attendu dans les scénarios courants. Les tests CTS et les tests utilisant Jetpack WindowManager sont disponibles pour les OEM afin de tester les implémentations.
Tests CTS
Pour exécuter les tests CTS, consultez la section Exécuter des tests CTS. Les tests CTS liés à Jetpack WindowManager se trouvent sous cts/tests/framework/base/windowmanager/jetpack/
.
Le nom du module de test est CtsWindowManagerJetpackTestCases
.
Tests WindowManager
Pour télécharger les tests Jetpack WindowManager, suivez les instructions pour Android Jetpack.
Les tests se trouvent dans la bibliothèque de fenêtres, sous le module window:window
: window/window/src/androidTest/
.
Pour exécuter les tests d'appareil pour le module window:window
à partir de la ligne de commande, procédez comme suit:
- Branchez un appareil sur lequel les options pour les développeurs et le débogage USB sont activés.
- Autorisez l'ordinateur à déboguer l'appareil.
- Ouvrez une interface système dans le répertoire racine du dépôt androidx.
- Remplacez le répertoire par
framework/support
. - Exécutez la commande suivante :
./gradlew window:window:connectedAndroidTest
. - Analysez les résultats.
Pour exécuter les tests à partir d'Android Studio, procédez comme suit :
- Ouvrez Android Studio.
- Branchez un appareil sur lequel les options pour les développeurs et le débogage USB sont activés.
- Autorisez l'ordinateur à déboguer l'appareil.
- Accédez à un test dans la bibliothèque de fenêtres du module de fenêtre.
- Ouvrez une classe de test et exécutez-la à l'aide des flèches vertes sur le côté droit de l'éditeur.
Vous pouvez également créer une configuration dans Android Studio pour exécuter une méthode de test, une classe de test ou tous les tests d'un module.
Les résultats peuvent être analysés manuellement en examinant la sortie de l'interface système. Certains tests sont ignorés si l'appareil ne répond pas à certaines hypothèses. Les résultats sont enregistrés dans un emplacement standard, et les analystes peuvent écrire un script pour automatiser l'analyse des résultats.