2017-08-12 3 views
1

Comment obtenir la liste complète des serveurs natifs Android. Pour être précis, je demande à propos d'Android 7.1.2. J'essaie plusieurs approches mais à mon avis, les deux ont tort.Liste des serveurs natifs Android

Première:

AOSP$ ls -l out/target/product/generic_x86_64/system/bin/ | grep server 
-rwxrwxr-x 1 gluttton gluttton 13840 сер 7 00:37 audioserver 
-rwxrwxr-x 1 gluttton gluttton 5560 сер 7 00:40 cameraserver 
-rwxrwxr-x 1 gluttton gluttton 124432 сер 7 01:00 drmserver 
-rwxrwxr-x 1 gluttton gluttton 1125788 сер 7 01:00 gdbserver 
-rwxrwxr-x 1 gluttton gluttton 1115512 сер 7 01:00 gdbserver64 
-rwxrwxr-x 1 gluttton gluttton 17936 сер 7 01:05 mediadrmserver 
-rwxrwxr-x 1 gluttton gluttton 9652 сер 7 01:05 mediaserver 

Mais pas tous les serveurs sont appelés <some>server et surfaceflinger est un exemple d'une telle exception.

Deuxième:

AOSP$ grep native frameworks/base/services/java/com/android/server/SystemServer.java 
    private static native void startSensorService(); 
      // libnativehelper's JniInvocation::Init code where we already 
      // Initialize native services. 
        reportWtf("observing native crashes", e); 

Mais il semble que tous les serveurs sont mis en marche par le SystemServer.

Question supplémentaire: y a-t-il une différence entre native server et native service?

+0

Ressemble connexes : http://android-developers.narkive.com/coXimivq/native-daemons-started-by-init. – Gluttton

Répondre

1

Oui. le serveur natif est un programme c/C++ (avec le point d'entrée principal voc (argc, argv) {} qui est complètement indépendant du code Java androïde (ie zygote). Donc, vous pouvez démarrer Android avec juste initd et sans zygote ou serveur système. Et exécutez ces serveurs natifs à partir de init.rc de votre carte. Donc, quand vous cherchez la liste de tous, lisez /init.rc à partir de votre appareil en cours d'exécution. Et recherchez les sections "service ...". Vous aurez peu de fichiers init * .rc. Certains sont de système/core/rootdir/init rc et certains sont de appareil/name_of_the_manufacturer/name_of_board/init rc

Chaque section 'système ...' définit ce qu'il faut commencer par initd après démarrage du noyau.

Service AUDIOSERVER/system/bin/AUDIOSERVER

class main 

user audioserver 

# media gid needed for /dev/fm (radio) and for /data/misc/media (tee) 

group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct 

ioprio rt 4 

writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks 

Dans android 7 vous devez trouver -name * .rc initialisation parce qu'ils sont dispersés Aver l'arbre source.

Donc, pour répondre à votre question: grep Service rn --include = initialisation rc

dans votre répertoire racine de votre arbre source et ignorer ceux de différents périphériques/fabricants/

2

Par «native», on entend «écrit dans un langage de plate-forme native», ce qui signifie C/C++ pour android. Un service signifie généralement «objet en mémoire qui a exposé l'interface liant». Où d'autres processus peuvent appeler son interface dérivée IBinder. Donc, dans l'exemple que audioserver de ps list c'est un serveur lancé par init.rc au démarrage, il est écrit en C++ que vous pouvez appeler un serveur natif. Il a au moins 2 services à l'intérieur: audio_flinger et audio_policy - ce sont aussi des codes C/C++, ce sont des objets qui exposent son interface IBinder pour que vous puissiez les appeler 'services natifs'.

une liste de tous les services est ici: liste des services adb shell

quelques informations à l'intérieur d'exécution si vous aimez la durée d'exécution de débogage:

adb shell dumpsys

Une liste des serveurs/deamons vous faites-le correctement - 'ps' mais pas tous comme 'rild' ou mentionné 'surfaceflinger' a un serveur dans son nom.

Lisez votre /system/core/rootdir/init.rc plus périphérique /// init * .rc dans votre répertoire source android.

+0

Merci pour votre réponse. La plupart de vos suggestions que j'ai faites, mais cela ne m'a pas aidé. Quand je parle de service 'native', je veux dire qu'il n'a pas besoin de' zygote' ou 'system_server' pour être lancé - est-ce correct? – Gluttton

+0

Oui, le serveur natif est un programme c/C++ (avec le point d'entrée principal voc (argc, argv) {}) qui est complètement indépendant du code Java androïde (ie zygote). Donc, vous pouvez démarrer Android avec juste initd et sans zygote ou serveur système. Et exécutez ces serveurs natifs à partir de init.rc de votre carte. Ainsi, lorsque vous cherchez la liste de tous, lisez /init.rc à partir de votre appareil en cours d'exécution. Et cherchez –