Lorsque vous importez un fichier APK, il doit respecter le niveau d'API cible requis par Google Play.
À partir du 31 août 2024 :
- Les nouvelles applications et mises à jour d'application doivent cibler Android 14 (niveau d'API 34) ou version ultérieure pour être envoyées à Google Play, à l'exception des applications Wear OS et Android TV, qui doivent cibler Android 13 (niveau d'API 33) ou version ultérieure.
- Les applications existantes doivent cibler Android 13 (niveau d'API 33) ou version ultérieure pour rester accessibles aux nouveaux utilisateurs se servant d'appareils équipés d'une version de l'OS Android supérieure au niveau d'API cible de votre application. Les applications qui ciblent Android 12 (niveau d'API 31) ou version antérieure (Android 10 (niveau d'API 29) ou version antérieure pour Wear OS et Android 11 (niveau d'API 30) ou version antérieure pour Android TV) ne seront disponibles que sur les appareils équipés d'un OS Android identique ou antérieur au niveau d'API cible de votre application.
Si vous avez besoin de plus de temps pour mettre à jour votre application, vous pourrez demander un délai supplémentaire jusqu'au 1er novembre 2024. Vous trouverez les formulaires de demande pour votre application dans la Play Console plus tard dans l'année.
Il existe quelques exceptions à ces exigences :
- Applications définitivement privées limitées aux utilisateurs d'une organisation spécifique et destinées à une distribution interne uniquement
- Applications qui ciblent Android Automotive OS ou qui sont empaquetées avec des APK ciblant Android Automotive OS
Pourquoi cibler des SDK plus récents ?
Chaque nouvelle version d'Android apporte des modifications qui renforcent la sécurité, améliorent les performances et optimisent l'expérience utilisateur Android. Certaines de ces modifications ne concernent que les applications qui déclarent explicitement la compatibilité via leur attribut de manifeste targetSdkVersion
(connu également sous le nom de niveau d'API cible).
En configurant votre application pour qu'elle cible un niveau d'API récent, vous permettez aux utilisateurs de bénéficier de ces améliorations, et votre application peut toujours s'exécuter sur les anciennes versions d'Android. Cibler un niveau d'API récent permet également à votre application de tirer parti des dernières fonctionnalités de la plate-forme pour satisfaire vos utilisateurs. De plus, à partir d'Android 10 (niveau d'API 29), les utilisateurs voient un avertissement lorsqu'ils lancent une application pour la première fois si celle-ci cible Android 5.1 (niveau d'API 22) ou version antérieure.
Ce document met en évidence les points importants dont vous devez tenir compte lors de la mise à jour du niveau d'API cible afin de répondre aux exigences de Google Play. Consultez les instructions des sections suivantes, selon la version vers laquelle vous effectuez la migration.
Passer d'Android 12 ou version ultérieure (niveau d'API 31) à une version plus récente
Pour mettre à jour votre application afin qu'elle cible une version plus récente d'Android, suivez la liste des modifications de comportement appropriée:
Passer d'Android 11 (niveau d'API 30) à Android 12 (niveau d'API 31)
Sécurité et autorisations
- Bluetooth: vous devez remplacer les déclarations pour les autorisations
BLUETOOTH
etBLUETOOTH_ADMIN
par les autorisationsBLUETOOTH_SCAN
,BLUETOOTH_ADVERTISE
ouBLUETOOTH_CONNECT
. Vous n'avez plus besoin de demander des autorisations d'exécutionLOCATION
pour les opérations Bluetooth. - Localisation: les utilisateurs peuvent demander aux applications de récupérer uniquement des informations de localisation approximatives. Vous devez demander l'autorisation
ACCESS_COARSE_LOCATION
chaque fois que vous demandezACCESS_FINE_LOCATION
.- Filtres d'intent: si votre application contient des activités, des services ou des broadcast receivers qui utilisent des filtres d'intent, vous devez déclarer explicitement l'attribut android:exported pour ces composants.
- Hibernation: les applications peuvent passer en mode hibernation si elles ne sont pas utilisées au cours d'une période donnée. En mode hibernation, les autorisations d'exécution et le cache de votre application sont réinitialisés, et vous ne pouvez pas exécuter de tâches ni d'alertes. Vous pouvez vérifier l'état d'hibernation de votre application.
- Mutabilité de l'intent en attente: vous devez spécifier la mutabilité de chaque objet PendingIntent que votre application crée.
Expérience utilisateur
- Notifications personnalisées: les notifications avec des vues de contenu personnalisées n'utilisent plus la zone de notification complète. Le système applique à la place un modèle standard. Ce modèle garantit que les notifications personnalisées ont la même décoration que les autres notifications, quel que soit l'état. Ce comportement est presque identique à celui de
Notification.DecoratedCustomViewStyle
. - Modifications apportées à la validation Android App Links: lorsque vous utilisez la validation Android App Links, assurez-vous que vos filtres d'intent incluent la catégorie BROWSABLE et qu'ils sont compatibles avec le schéma HTTPS.
Performances
Restrictions de lancement des services de premier plan: pour cibler Android 12 ou version ultérieure, votre application ne peut pas démarrer de services de premier plan lorsqu'elle s'exécute en arrière-plan, sauf dans quelques cas particuliers. Si une application tente de démarrer un service de premier plan pendant l'exécution en arrière-plan, une exception se produit (sauf dans les quelques cas particuliers mentionnés).
Envisagez d'utiliser WorkManager pour planifier et démarrer des tâches prioritaires pendant que votre application s'exécute en arrière-plan. Pour effectuer des actions urgentes demandées par l'utilisateur, démarrez les services de premier plan dans une alarme exacte.
Restrictions liées aux trampolines de notification: lorsque les utilisateurs appuient sur les notifications, certaines applications déclenchent un composant qui lance l'activité que l'utilisateur voit et avec laquelle il interagit. Ce composant d'application est appelé "trampoline de notification".
Les applications ne doivent pas démarrer d'activités à partir de services ni de broadcast receivers utilisés comme trampolines de notification. Lorsqu'un utilisateur appuie sur une notification ou sur un bouton d'action dans une notification, votre application ne peut pas appeler
startActivity()
au sein d'un service ou d'un broadcast receiver.
Consultez l'ensemble complet des modifications qui affectent les applications ciblant Android 12 (niveau d'API 31).
Effectuer une migration depuis une version antérieure à Android 11 (niveau d'API 30)
Sélectionnez la version d'Android à partir de laquelle vous souhaitez effectuer la migration :
Passer à Android 5 (niveau d'API 21)
Consultez la page relative aux modifications de comportement de chacune des versions suivantes pour vous assurer que votre application a pris en compte les modifications qui y ont été apportées :
Pour continuer, conformez-vous aux instructions de la section suivante.
Passer à Android 6 (niveau d'API 23)
Les considérations suivantes concernent les applications qui ciblent Android 6.0 et les versions ultérieures de la plate-forme :
-
-
Les autorisations dangereuses ne sont accordées qu'au moment de l'exécution. Les chemins de navigation de l'UI doivent fournir des affordances pour l'octroi de ces autorisations.
-
Dans la mesure du possible, assurez-vous que votre application est prête à traiter le refus des demandes d'autorisation. Par exemple, si un utilisateur refuse une demande d'accès au GPS de l'appareil, votre application doit disposer d'une autre façon de procéder.
-
Pour obtenir la liste exhaustive des modifications introduites dans Android 6.0 (niveau d'API 23), consultez la page Changements de comportement de cette version de la plate-forme.
Pour continuer, conformez-vous aux instructions de la section suivante.
Passer à Android 7 (niveau d'API 24)
Les considérations suivantes concernent les applications qui ciblent Android 7.0 et les versions ultérieures de la plate-forme :
-
Sommeil et Mise en veille des applications
Lors de la conception, vous devez tenir compte des comportements décrits dans la section Adapter votre application aux fonctionnalités Sommeil et Mise en veille des applications, ce qui comprend les modifications incrémentielles introduites dans plusieurs versions de la plate-forme.
Lorsqu'un appareil est en mode Sommeil et Mise en veille des applications, le système adopte le comportement suivant :
- Il limite l'accès au réseau.
- Il diffère les alarmes, les synchronisations et les tâches.
- Il limite les recherches de réseaux Wi-Fi et de signaux GPS.
- Il limite les messages Firebase Cloud Messaging de priorité normale.
-
Modifications des autorisations
- Le système limite l'accès aux répertoires privés des applications.
-
L'exposition d'un URI
file://
en dehors de votre application déclenche une erreurFileUriExposedException
. Si vous devez partager des fichiers en dehors de votre application, implémentezFileProvider
.
-
Le système interdit la liaison avec des bibliothèques non NDK.
Pour obtenir la liste exhaustive des modifications introduites dans Android 7.0 (niveau d'API 24), consultez la page Changements de comportement de cette version de la plate-forme.
Pour continuer, conformez-vous aux instructions de la section suivante.
Passer à Android 8 (niveau d'API 26)
Les considérations suivantes concernent les applications qui ciblent Android 8.0 et les versions ultérieures de la plate-forme :
- Limites d'exécution en arrière-plan
-
Le système limite les services pour les applications qui ne s'exécutent pas au premier plan.
-
startService()
génère désormais une exception lorsqu'une application tente de l'appeler alors questartService()
est interdit. -
Pour démarrer les services de premier plan, une application doit utiliser
startForeground()
etstartForegroundService()
. - Examinez attentivement les modifications apportées à l'API JobScheduler, comme indiqué sur la page Changements de comportement d'Android 8.0 (niveau d'API 26).
- Firebase Cloud Messaging nécessite la version 10.2.1 ou ultérieure du SDK des services Google Play.
- Lorsque vous utilisez Firebase Cloud Messaging, la distribution des messages est soumise aux limites d'exécution en arrière-plan. Si des tâches en arrière-plan sont nécessaires lors de la réception du message (pour effectuer une synchronisation des données en arrière-plan, par exemple), votre application doit les planifier à l'aide de Firebase Job Dispatcher ou JobIntentService. Pour en savoir plus, consultez la documentation de Firebase Cloud Messaging.
-
- Diffusions implicites
-
Les diffusions implicites sont limitées. Pour en savoir plus sur la gestion des événements en arrière-plan, consultez la documentation de l'API
JobScheduler
.
-
Les diffusions implicites sont limitées. Pour en savoir plus sur la gestion des événements en arrière-plan, consultez la documentation de l'API
- Limites de localisation en arrière-plan
-
Les applications exécutées en arrière-plan ont un accès limité aux données de localisation.
- Sur les appareils équipés des services Google Play, utilisez l'API Fused Location Provider pour obtenir des notifications de position périodiques.
-
Les applications exécutées en arrière-plan ont un accès limité aux données de localisation.
-
Le système limite les services pour les applications qui ne s'exécutent pas au premier plan.
- Canaux de notification
- Vous devez définir des propriétés d'interruption de notification pour chaque canal.
- Vous devez attribuer les notifications à un canal pour qu'elles s'affichent.
-
Cette version de la plate-forme est compatible avec
NotificationCompat.Builder
.
- Confidentialité
- L'accès à ANDROID_ID s'effectue par clé de signature d'application.
Pour obtenir la liste exhaustive des modifications introduites dans Android 8.0 (niveau d'API 26), consultez la page Changements de comportement de cette version de la plate-forme.
Passer d'Android 8 (niveau d'API 26) à Android 9 (niveau d'API 28)
- Gestion de l'alimentation
- Les buckets de mise en veille des applications apportent de nouvelles restrictions en arrière-plan basées sur l'engagement avec les applications, telles que les tâches différées, les alarmes et les quotas sur les messages à priorité élevée
- Les améliorations de l'économiseur de batterie optimisent les limites associées aux applications de mise en veille d'application
-
Autorisation de service de premier plan
- Besoin de demander l'autorisation normale
FOREGROUND_SERVICE
(et non l'autorisation d'exécution)
- Besoin de demander l'autorisation normale
-
Modifications des paramètres de confidentialité
- Accès limité aux capteurs en arrière-plan
- Accès limité aux journaux d'appels désormais dans le groupe d'autorisations
CALL_LOG
- Restriction d'accès aux numéros de téléphone, qui nécessite l'autorisation
READ_CALL_LOG
- Restriction d'accès aux informations Wi-Fi
Pour obtenir la liste exhaustive des modifications introduites dans Android 9.0 (niveau d'API 28), consultez la page Changements de comportement.
Passer d'Android 9 (niveau d'API 28) à Android 10 (niveau d'API 29)
-
Notifications avec un intent plein écran
-
Besoin de demander l'autorisation normale
USE_FULL_SCREEN_INTENT
(et non l'autorisation d'exécution)
-
Besoin de demander l'autorisation normale
-
Compatibilité avec les appareils pliables et les grands écrans
-
Plusieurs activités peuvent désormais être réactivées en même temps, mais une seule est ciblée
-
Cette modification affecte le comportement de
onResume()
et deonPause()
-
Nouveau concept de cycle de vie ("application la plus réactivée") que vous pouvez détecter en vous abonnant à
onTopResumedActivityChanged()
- Seule une seule activité peut être l'activité la plus réactivée
-
Cette modification affecte le comportement de
-
Lorsque
resizeableActivity
est défini surfalse
, les applications peuvent également spécifier un élémentminAspectRatio
qui applique automatiquement un format letterbox à l'application avec des proportions plus étroites.
-
Plusieurs activités peuvent désormais être réactivées en même temps, mais une seule est ciblée
-
Modifications des paramètres de confidentialité
- Espace de stockage cloisonné
- L'accès au stockage externe est limité à un répertoire spécifique à l'application et à des types de supports spécifiques créés par l'application.
-
Accès limité à la position lorsque l'application est exécutée en arrière-plan, ce qui nécessite l'autorisation
ACCESS_BACKGROUND_LOCATION
. - Accès limité à des identifiants non réinitialisables tels que le code IMEI et le numéro de série.
-
Accès limité à des informations sur l'activité physique telles que le nombre de pas de l'utilisateur, ce qui nécessite l'autorisation
ACTIVITY_RECOGNITION
. -
Restriction de l'accès à certaines API de téléphonie, Bluetooth et Wi-Fi, nécessitant l'autorisation
ACCESS_FINE_LOCATION
. -
Restriction de l'accès aux paramètres Wi-Fi
- Les applications ne peuvent plus activer ni désactiver directement le Wi-Fi et doivent le faire à l'aide des panneaux de paramètres.
-
Restrictions concernant l'établissement d'une connexion à un réseau Wi-Fi, qui nécessite l'utilisation de
WifiNetworkSpecifier
ou deWifiNetworkSuggestion
.
- Espace de stockage cloisonné
Passer d'Android 10 (niveau d'API 29) à Android 11 (niveau d'API 30)
-
Confidentialité
- Application de l'espace de stockage cloisonné : les applis doivent adopter le modèle d'espace de stockage cloisonné, dans lequel les types de fichiers spécifiques aux applis, aux contenus multimédias et aux autres types de fichiers sont enregistrés et accessibles à l'aide d'emplacements dédiés.
- Annulation automatique des autorisations: si les utilisateurs n'ont pas interagi avec une application depuis plusieurs mois, le système réinitialise automatiquement les autorisations sensibles de l'application. Cela ne devrait pas affecter la plupart des applications. Si votre application fonctionne principalement en arrière-plan sans interaction avec les utilisateurs, vous pouvez demander aux utilisateurs de désactiver la réinitialisation automatique.
- Accès aux données de localisation en arrière-plan: les applications doivent demander séparément l'autorisation d'accéder à la position en arrière-plan et au premier plan. L'autorisation d'accéder aux données de localisation en arrière-plan ne peut être accordée que dans les paramètres de l'application, et non dans les boîtes de dialogue d'autorisation d'exécution.
-
Visibilité des packages: lorsqu'une application interroge la liste des applications et services installés sur l'appareil, la liste renvoyée est filtrée.
- Si vous utilisez les services de synthèse vocale ou de reconnaissance vocale, vous devez ajouter des éléments de requête pour ces services au fichier manifeste.
-
Sécurité
- Les fichiers "resource.arsc" compressés ne sont plus acceptés.
- APK Signature Scheme v2 est désormais obligatoire. Pour des raisons de rétrocompatibilité, les développeurs doivent également continuer à proposer la signature avec APK Signature Scheme v1.
- Restriction des interfaces autres que les SDK. L'utilisation d'interfaces autres que les SDK n'est pas recommandée pour les applications ciblant le niveau d'API 30, car certaines de ces interfaces sont désormais bloquées. Consultez la section Interfaces non SDK désormais bloquées dans Android 11 pour obtenir une liste complète des interfaces bloquées.
Pour obtenir la liste exhaustive des modifications introduites dans Android 11 (niveau d'API 30), consultez la page Changements de comportement.
Pour poursuivre la mise à jour vers l'API 31, suivez les instructions de la section précédente.
Moderniser vos applications
Lorsque vous mettez à jour le niveau d'API cible de vos applis, pensez à adopter les fonctionnalités récentes de la plate-forme afin de moderniser vos applis et d'offrir une expérience utilisateur optimale.
- Pensez à utiliser CameraX, qui est en version bêta, pour exploiter tout le potentiel de la fonctionnalité de caméra/appareil photo.
- Utilisez les composants Jetpack afin de suivre les bonnes pratiques, d'éviter l'écriture de code récurrent et de simplifier les tâches complexes. Vous pouvez ainsi vous concentrer sur le code qui fait la différence.
- Utilisez Kotlin pour écrire des applications plus performantes plus rapidement, avec moins de code.
- Veillez à respecter les bonnes pratiques et les exigences en matière de confidentialité.
- Ajoutez le thème sombre à vos applications.
- Ajoutez la navigation par gestes à vos applications.
- Faites migrer votre application de Google Cloud Messaging (GCM) vers la dernière version de Firebase Cloud Messaging.
- Profitez de la fonctionnalité de gestion avancée des fenêtres.
- Acceptez de plus grands formats (supérieurs à 16:9) pour bénéficier des progrès récents sur le plan matériel. Assurez-vous que votre application redimensionne l'affichage pour occuper l'espace disponible à l'écran. Ne déclarez un format maximum qu'en dernier recours. Pour en savoir plus sur les formats maximums, consultez la section Déclarer une compatibilité d'écran limitée.
- Proposez le mode multifenêtre pour contribuer à améliorer la productivité de votre application et gérer plusieurs écrans.
- Si l'utilisation d'une taille d'application réduite est susceptible d'améliorer l'expérience utilisateur, ajoutez la prise en charge du Picture-in-picture.
- Optimisez l'application pour les appareils avec encoche pour écran.
- Ne laissez pas la hauteur de la barre d'état au hasard. Utilisez plutôt
WindowInsets
etView.OnApplyWindowInsetsListener
. Pour en savoir plus, regardez la vidéo de la conférence droidcon NYC 2017. - Ne partez pas du principe que l'application occupe la totalité de la fenêtre. Confirmez plutôt son emplacement à l'aide de
View.getLocationInWindow()
, et non deView.getLocationOnScreen()
. * Lors du traitement deMotionEvent
, utilisezMotionEvent.getX()
etMotionEvent.getY()
, et nonMotionEvent.getRawX()
niMotionEvent.getRawY()
.
Vérifier et mettre à jour vos SDK et vos bibliothèques
Assurez-vous que vos dépendances de SDK tierces sont compatibles avec l'API 31. Certains fournisseurs de SDK la publient dans leur fichier manifeste. Pour d'autres, un examen complémentaire est nécessaire. Si vous utilisez un SDK qui n'est pas compatible avec l'API 31, il est essentiel de collaborer avec le fournisseur du SDK pour résoudre le problème.
Notez également que l'attribut targetSdkVersion
de votre application ou de votre jeu peut limiter l'accès à des bibliothèques de plate-forme Android privées. Pour plus d'informations, reportez-vous à la section Association d'applications NDK à des bibliothèques de plate-forme.
Vous devez également vérifier les restrictions qui peuvent exister dans la version d'Android Support Library que vous utilisez. Comme toujours, vous devez vous assurer de la compatibilité entre la version principale d'Android Support Library et la version compileSdkVersion
de votre application.
Nous vous recommandons de choisir une version targetSdkVersion
inférieure ou égale à la version principale de la bibliothèque d'assistance. Nous vous invitons à effectuer une mise à jour vers une version récente et compatible d'Android Support Library afin de bénéficier des dernières fonctionnalités de compatibilité et des corrections de bugs.
Tester votre application
Après avoir mis à jour les fonctionnalités et le niveau d'API de votre application, vous devez tester quelques scénarios d'utilisation principaux. Les suggestions suivantes ne sont pas exhaustives, mais visent à vous guider dans votre processus de test. pour réaliser votre processus de test :
- Vérifiez que la compilation de votre application avec l'API 29 s'effectue sans erreurs ni avertissements.
Vérifiez que votre application dispose d'une stratégie pour les cas où l'utilisateur refuse les demandes d'autorisation et qu'elle demande des autorisations à l'utilisateur. Pour ce faire :
- Accédez à l'écran "Infos sur l'appli" de votre application et désactivez chaque autorisation.
- Ouvrez l'application et vérifiez l'absence de plantages.
- Effectuez des tests de cas d'utilisation principaux et assurez-vous que les autorisations requises sont à nouveau demandées.
Vérifiez que la fonctionnalité Sommeil génère les résultats attendus et ne provoque aucune erreur.
- À l'aide d'adb, mettez votre appareil de test en mode Sommeil pendant l'exécution de votre application.
- Testez les scénarios d'utilisation qui déclenchent des messages Firebase Cloud Messaging, le cas échéant.
- Testez les scénarios d'utilisation qui font appel à des alarmes ou des tâches, le cas échéant.
- Éliminez toute dépendance sur les services en arrière-plan.
- Définissez votre application en mode Mise en veille des applications.
- Testez les scénarios d'utilisation qui déclenchent des messages Firebase Cloud Messaging, le cas échéant.
- Testez les scénarios d'utilisation qui font appel à des alarmes, le cas échéant.
- À l'aide d'adb, mettez votre appareil de test en mode Sommeil pendant l'exécution de votre application.
Vérifiez l'enregistrement de nouvelles photos/vidéos
- Vérifiez que votre application gère correctement les diffusions
ACTION_NEW_PICTURE
etACTION_NEW_VIDEO
restreintes (qui devraient être déplacées vers les tâches JobScheduler). - Assurez-vous que tous les cas d'utilisation critiques qui dépendent de ces événements continuent de fonctionner.
- Vérifiez que votre application gère correctement les diffusions
Gère le partage de fichiers avec d'autres applications. - Testez tout scénario d'utilisation dans lequel des fichiers sont partagés avec d'autres applications (y compris une autre application du même développeur).
- Vérifiez si le contenu est visible dans l'autre application et ne provoque pas de plantages.
Informations supplémentaires
Activez les e-mails dans la console Google Play afin que nous puissions vous envoyer des mises à jour et des annonces importantes depuis Android et Google Play, y compris notre newsletter mensuelle pour les partenaires.