Hibernation des applications

Si votre application cible Android 11 (niveau d'API 30) ou une version ultérieure et que l'utilisateur n'interagit pas avec votre application pendant quelques mois, le système place votre application en hibernation. Le système optimise l'espace de stockage plutôt que les performances et protège les données utilisateur. Ce comportement est semblable à celui qui se produit lorsque l'utilisateur force manuellement l'arrêt de votre application depuis les paramètres système.

Effets de l'hibernation

Comme le montre le tableau 1, les effets de l'hibernation dépendent de la version du SDK cible de votre application, ainsi que de l'appareil qui l'exécute :

Tableau 1. Effets de l'hibernation sur votre application
Version du SDK cible Caractéristiques de l'appareil Effets d'hibernation
Android 12 ou version ultérieure Tourne sur Android 12 ou version ultérieure

Les autorisations d'exécution de votre application sont réinitialisées. Cette action a le même effet que si l'utilisateur avait affiché une autorisation dans les paramètres système et modifié le niveau d'accès de votre application sur Refuser.

Votre appli ne peut pas exécuter de tâches ni d'alertes en arrière-plan.

Votre application ne peut pas recevoir de notifications push, y compris les messages à priorité élevée qui sont envoyés via Firebase Cloud Messaging.

Tous les fichiers présents dans le cache de votre application sont supprimés.

Android 11 Tourne sur Android 11 Les autorisations d'exécution de votre appli sont réinitialisées.
Android 11 Fonctionne sous Android 6.0 (niveau d'API 23) à Android 10 (niveau d'API 29) inclus et est fourni par les services Google Play.

Les autorisations d'exécution de votre appli sont réinitialisées.

Ce comportement sera effectif en décembre 2021. Pour en savoir plus, consultez cet article de blog sur la réinitialisation automatique des autorisations pour des milliards d'appareils.

Comportement du système lorsqu'une application quitte le mode hibernation

Lorsque l'utilisateur interagit ensuite avec votre application, celle-ci quitte le mode hibernation et peut à nouveau créer des tâches, des alertes et des notifications.

Toutefois, le système n'effectue pas les actions suivantes pour votre application :

  1. Accorder à nouveau les autorisations d'exécution de votre application.

    L'utilisateur doit accorder de nouveau ces autorisations pour votre application.

  2. Reprogrammer toutes les tâches, alertes et notifications planifiées avant le passage en hibernation de votre application

    Pour faciliter ce workflow, utilisez WorkManager. Vous pouvez également ajouter une logique de replanification dans le broadcast receiver ACTION_BOOT_COMPLETED, qui est appelé lorsque votre application quitte l'hibernation et après le démarrage de l'appareil.

Utilisation de l'application

Les sections suivantes fournissent des exemples d'utilisation des applications, ainsi que des actions que le système ne considère pas comme liées à l'utilisation des applications.

Exemples d'utilisation de l'application

Lorsqu'une activité est réactivée dans votre application, le système considère cet événement comme une interaction utilisateur. Par conséquent, le système prolonge la durée pendant laquelle votre application passe en hibernation.

Sur Android 11 et versions ultérieures, les comportements suivants sont également considérés comme des interactions utilisateur :

  • L'utilisateur interagit avec un widget.
  • L'utilisateur interagit avec une notification, sauf pour ignorer la notification.

Il convient de noter que l'utilisation d'une application pour l'hibernation ne nécessite pas explicitement une interaction de l'utilisateur. Tant qu'un composant du package est appelé, il est toujours considéré comme une utilisation de l'application. Ces types de contenu incluent, par exemple :

  • Applications dont le fournisseur de services ou de contenus est lié à une autre application sur l'appareil ou le système d'exploitation (éditeurs de mode de saisie ou gestionnaires de mots de passe, par exemple).
  • Les broadcast receivers du package reçoivent une diffusion explicite d'un package externe.

Non exemples

Si votre application ne présente que les comportements décrits dans la liste suivante, elle entre en hibernation après quelques mois :

Exceptions système de l'hibernation

Android offre des exceptions au niveau du système pour l'hibernation des applications dans certains cas d'utilisation. Si votre application appartient à l'une des catégories suivantes, elle est exemptée des normes d'utilisation de l'application et n'hiberne pas.

Applications non affichées dans le lanceur d'applications
Toute application qui ne dispose pas d'une vignette de raccourci active dans le lanceur d'applications
Applications du profil professionnel
Toute application installée par un utilisateur sur un profil professionnel Notez que si la même application se trouve également sur un profil personnel, seule l'application du profil professionnel est exemptée.
Outils de contrôle des règles relatives aux appareils
Applications qui contrôlent les règles relatives aux appareils locaux et les applications système sur les appareils.
Applis privilégiées par l'opérateur
Toute application préchargée par les opérateurs de téléphonie mobile sur les appareils et jugée nécessaire pour les obligations de service contractuelles, telles que les applications de messagerie vocale ou de service client.
Applications d'installation tierces
Si nécessaire, les plates-formes d'applications tierces effectuent les mises à jour automatiques des applications installées.

Exceptions des utilisateurs de l'hibernation

Si vous pensez qu'un cas d'utilisation principal de votre application est affecté par l'hibernation, vous pouvez demander à l'utilisateur de vous exempter de ce mode. Cette exception est utile dans les cas où l'utilisateur s'attend à ce que votre application fonctionne principalement en arrière-plan, même lorsqu'il n'interagit pas avec votre application, par exemple lorsque votre application effectue l'une des opérations suivantes :

  • Assurer la sécurité des membres de la famille en indiquant régulièrement la position des membres de la famille.
  • Synchroniser les données entre un appareil et le serveur de votre application.
  • Communiquer avec des appareils connectés, comme un téléviseur.
  • Appairer avec des appareils associés, tels qu'une montre.

Pour demander une exception, procédez comme indiqué dans les sections suivantes.

Vérifier si l'utilisateur a déjà désactivé l'hibernation pour votre application

Pour vérifier si l'utilisateur a déjà désactivé l'hibernation pour votre application, utilisez l'API getUnusedAppRestrictionsStatus().

Pour en savoir plus sur l'utilisation de cette API dans votre application, consultez l'exemple de code d'API sur cette page.

Demander à l'utilisateur de désactiver l'hibernation pour votre application

Si l'utilisateur n'a pas déjà désactivé l'hibernation pour votre application, vous pouvez lui envoyer une requête. Pour ce faire, procédez comme suit :

  1. Affichez une UI qui explique à l'utilisateur pourquoi il doit désactiver l'hibernation pour votre application.
  2. Appelez l'API createManageUnusedAppRestrictionsIntent(), comme indiqué dans l'exemple de code de l'API. Cette API crée un intent qui charge l'écran Informations de l'application dans les paramètres. L'utilisateur peut alors désactiver le mode hibernation de votre application.

    Lorsque vous envoyez cet intent, il est important d'appeler startActivityForResult(), et non startActivity().

    Comme indiqué dans le tableau 2, l'emplacement et le nom de l'option dépendent des caractéristiques de l'appareil sur lequel votre application est installée :

    Tableau 2. Option qui désactive l'hibernation pour votre application
    Caractéristiques de l'appareil Page sur laquelle apparaît l'option Nom de l'option permettant de la désactiver
    Tourne sur Android 13 ou version ultérieure Informations sur les applications Suspendre activité appli si inutilisée
    Tourne sur Android 12 Informations sur les applications Supprimer autorisations et libérer espace
    Tourne sur Android 11 Informations sur les applications > Autorisations Supprimer les autorisations si l'appli n'est pas utilisée
    Tourne sur Android 6.0 à Android 10 inclus et est fourni par les services Google Play. Application Play > Menu > Play Protect > Autorisations pour les applis inutilisées Supprimer les autorisations si l'appli n'est pas utilisée

Exemple de code d'API

Cet exemple de code montre comment vérifier si l'hibernation est activée pour votre application et comment demander aux utilisateurs de la désactiver pour votre application.

Kotlin

val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

Ancienne API de plate-forme

Le système d'exploitation comprend également une API permettant d'interagir avec la fonctionnalité d'hibernation. Toutefois, elle ne fonctionne que sur les appareils équipés d'Android 11 ou version ultérieure. Elle ne gère pas les fonctionnalités d'hibernation rétroportées sur les versions antérieures d'Android. Par conséquent, nous vous déconseillons d'utiliser l'API.

Si vous devez continuer à utiliser l'API temporairement à des fins de compatibilité, la liste suivante indique comment procéder :

Invoquer manuellement un comportement d'hibernation

Pour tester le comportement de votre application une fois qu'elle est passée en hibernation, procédez comme suit :

  1. (Android 12 et versions ultérieures uniquement) Activez le comportement d'hibernation sur votre appareil :

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Définissez le délai d'attente pour que le système passe en hibernation. Vous pourrez ainsi le restaurer après le test :

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Réduisez le temps d'attente du système. Dans l'exemple suivant, le système est modifié de sorte que votre application entre en hibernation une seconde après que vous cessez d'interagir avec elle :

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Attendez que les diffusions au démarrage se terminent sur l'appareil de test en exécutant la commande suivante :

    adb shell am wait-for-broadcast-idle
    

    Une fois les diffusions terminées, la commande suivante renvoie le message : All broadcast queues are idle!

  5. Appelez manuellement le processus d'hibernation de l'application :

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android 12 et versions ultérieures uniquement) Vérifiez que l'application est en hibernation à l'aide de l'une des méthodes suivantes :

    • Notez que l'appareil de test affiche désormais une notification indiquant que les applications inutilisées sont en hibernation.
    • Exécutez la commande suivante :

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Restaurez la durée par défaut pendant laquelle le système attend que votre application passe en hibernation :

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold