Android – Comment décider d’exécuter un service dans un processus distinct?

Je travaille sur une application Android qui collecte des données de capteur sur plusieurs heures. Pour cela, nous avons un service qui collecte les données de capteur (par exemple, accélération, GPS, ..), effectue un traitement et les stocke à distance sur un serveur.

Actuellement, ce service s’exécute dans un processus distinct (utilisant android: service = “: background” dans le manifeste). Cela complique la communication entre les activités et le service, mais mes prédécesseurs ont créé l’application de cette manière car ils pensaient que la séparation du service des activités le rendrait plus stable.

Je voudrais des raisons plus factuelles pour l’effort d’exécuter un processus séparé. Quels sont les avantages? Est-ce que ça marche vraiment plus stable? Le service est-il moins susceptible d’être tué par le système d’exploitation (pour libérer des ressources) s’il se trouve dans un processus distinct?

Notre application utilise startForeground () et des amis pour minimiser les risques de se faire tuer par le système d’exploitation.

Les documents Android ne sont pas très précis à ce sujet, le plus souvent que cela dépend de l’objective de l’application 😉

TL; DR Quelles sont les raisons objectives de placer un service de longue durée dans un processus distinct (sous Android)?

La première étape consiste à lire la description des cycles de vie des composants . L’absence de cela est que vous n’êtes vraiment pas garanti qu’un Service ou autre composant sera autorisé à fonctionner pendant une longue période.

Cependant, cela ressemble à un Service est le bon choix pour la fonctionnalité que vous décrivez. Cela est dû au fait que vous effectuez des opérations qui ne sont pas confrontées à l’utilisateur. En revenant à la description du cycle de vie, chaque fois qu’une activité n’est pas au premier plan, elle est essentiellement un candidat pour être tué.

Ce que vous devez envisager, c’est d’utiliser AlarmManager pour déclencher périodiquement votre Service . Vous pourriez également vouloir utiliser la bibliothèque WakefulIntent créée par @CommonsWare.

Il existe un bon article décrivant le multitâche et les processus sur le blog Android intitulé Multitasking the Android Way, qui pourrait fournir quelques détails sur les processus qui vous intéressent. Par exemple:

La différence entre un processus et une application est un malentendu courant à propos du multitâche Android. Dans Android, il ne s’agit pas d’entités étroitement liées: les applications peuvent sembler présentes à l’utilisateur sans processus en cours d’exécution de l’application; plusieurs applications peuvent partager des processus, ou une application peut utiliser plusieurs processus en fonction de ses besoins; les processus d’une application peuvent être conservés par Android même si cette application ne fait pas activement quelque chose.

Utilisation de RAM réduite

La documentation du développeur Android suggère que cela pourrait être approprié pour maintenir l’utilisation de la RAM du service.

De la gestion de la mémoire de votre application: utilisez plusieurs processus :

Un exemple de processus multiples peut être approprié lors de la création d’un lecteur de musique qui lit de la musique à partir d’un service pendant une longue période. Si l’intégralité de l’application s’exécute dans un processus, la plupart des allocations effectuées pour son interface utilisateur d’activité doivent être conservées tant qu’il joue de la musique, même si l’utilisateur se trouve actuellement dans une autre application et que le service contrôle la lecture. Une application comme celle-ci peut être divisée en deux processus: l’un pour son interface utilisateur et l’autre pour le travail qui continue à s’exécuter dans le service d’arrière-plan.

Par conséquent, l’exécution du service dans un processus distinct pourrait réduire l’impact des performances de l’application tout en réduisant la probabilité que le service soit tué lorsque le système manque de mémoire vive.

Impact réduit sur les performances

De la gestion de la mémoire de votre application: Changement d’applications :

Si votre application dispose d’un processus mis en cache et qu’elle conserve la mémoire dont elle n’a pas besoin, votre application, même si l’utilisateur ne l’utilise pas, limite les performances globales du système. Donc, comme le système manque de mémoire, il peut tuer des processus dans le cache LRU en commençant par le processus le moins récemment utilisé, mais en prenant également en compte les processus qui consumnt le plus de mémoire.

Probabilité réduite d’être tué

De la gestion de la mémoire de votre application: libérez de la mémoire lorsque la mémoire devient trop serrée :

Remarque: Lorsque le système commence à tuer des processus dans le cache LRU, bien qu’il fonctionne principalement de manière ascendante, il prend en compte les processus consommant davantage de mémoire et fournit ainsi au système un gain de mémoire supplémentaire en cas de suppression. Donc, moins vous consumz de mémoire dans la liste LRU en général, meilleures sont vos chances de restr dans la liste et de pouvoir reprendre rapidement.

Ainsi, votre service est moins susceptible d’être tué lorsqu’il se trouve dans un processus distinct, car l’utilisation de la RAM du processus sera moins importante car le service ne partage pas les ressources de l’interface utilisateur.

Quand faire cela

Si votre service n’utilise pas startForeground() , j’ai trouvé qu’Android le tuerait juste quand il aurait besoin de libérer de la RAM, de sorte que la consommation de RAM du service n’est pas trop importante. Donc, si vous considérez l’impact des performances sur le système d’exploitation et les autres applications, je ne pense pas que cela vaille la peine d’exécuter le service dans un processus séparé.

Cependant, si vous utilisez startForeground() , Android essaiera de maintenir votre service en vie autant que possible, de sorte que toute mémoire vive utilisée par le processus aura un impact sur le système d’exploitation et les autres applications. Donc, dans ce cas, je recommande d’utiliser un processus distinct, qui pourrait économiser au moins 10 Mo de RAM, afin de ne pas ralentir les périphériques de vos utilisateurs.

De plus, notez que rendre votre application multi-process n’est pas facile; SharedPreferences d’Android ne prend pas en charge plusieurs processus. J’ai réalisé une implémentation SharedPreferences dans l’un de mes projets , mais je ne l’ai pas encore publié pour le réutiliser.

L’exécution d’un service dans son propre processus présente les petits avantages que le ramasse-miettes pour le service n’affecte pas votre application et que l’empreinte mémoire du service est un peu moindre si elle s’exécute seule.

Si la consommation du service par d’autres applications n’est pas une exigence pour vous, préférez un service local. Sinon, vous pouvez toujours exécuter le service dans son propre processus et utiliser des communications différentes avec votre application, par exemple via un récepteur de diffusion. Voir le tutoriel du service Android pour plus de détails.

Séparer le service pour qu’il s’exécute dans un processus différent ne le rend pas plus stable, mais dans certains cas, il rend votre application plus stable, car si ce service tombe en panne, votre application ne se bloquera pas et pourra être restaurée.

Eli