web-dev-qa-db-fra.com

Liste de tous les processus en cours d'exécution dans Android

Comment obtenir la liste des processus Android Tous les processus en cours du système, y compris les processus lancés par le système?

J'ai essayé d'obtenir la liste en utilisant le code ci-dessous:

ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();

Cela m'a donné la liste des processus tels que com.Android.phone, com.Android.chrome, Etc.

Mais lorsque j'exécute une commande ps dans mon adb Shell, Je peux voir tout un tas de processus en cours d'exécution. Je joins la capture d'écran de tous ces processus en cours d'exécution sur mon système. Running processes in my devices

Comme on peut le voir, il existe plusieurs Android Les processus du système fonctionnent également comme /system/bin/vold Et /system/bin/installed, Etc.

Cependant, ceux-ci ne sont pas signalés par getRunningAppProcesses() API. Dans ses documents, il indique que cette API:

Renvoie une liste des processus d'application qui s'exécutent sur le périphérique.

Cela signifie-t-il qu'il ne renverra pas le "processus système"? Et si tel est le cas, quelle option le développeur peut-il avoir à parcourir le processus "TOUS" fonctionnant sur Android?

- Quoi d'autre j'ai essayé: J'ai essayé avec 2 autres API de ActivityManager:

  1. getRecentTasks(int maxNum) et sa variante.

Mais Android docs met en garde contre son utilisation comme ci-dessous:

Cette méthode est déconseillée au niveau 21 de l'API.

Depuis Lollipop, cette méthode n'est plus disponible pour les applications tierces

  1. getRunningServices(int maxNum)

Mais ces deux-là ne pouvaient pas me donner de noms comme /system/bin/debuggerd, Etc.

REMARQUE: j'utilise Jellybean Android-4.2 sur un appareil non rooté.

19
AADProgramming

En appelant une API à partir de ActivityManager, vous obtenez uniquement les applications qui s'y sont inscrites - c'est-à-dire les activités de l'interface utilisateur - et pas toutes les processus. Ceux que vous voyez avec un nom DNS non inversé, mais un chemin d'accès (par exemple /system/bin/*) sont des démons natifs, démarrés par init et exclus du ActivityManager.

Une solution consiste à obtenir la liste des processus directement à partir de /proc (comme le fait la boîte à outils ps). Cela nécessite une itération par programme sur les répertoires, (par exemple /proc/[0-9]*), et l'élagage des threads du noyau. Les threads du noyau sont ceux avec un PPID de 2, ils sont donc faciles. Les démons natifs auront un PPID de 1. Les applications auront un PPID de Zygote.

Référence: NewAndroidBook.com

6
Technologeeks