14 votes

Où trouver la description de tous les appels "/system/bin/service" ?

une réponse On m'a conseillé d'utiliser service call phone 2 s16 "$number" . Cela fonctionne, mais dans service list Je vois d'autres choses utiles que je ne sais pas utiliser et dont je ne trouve pas facilement l'information sur Internet.

Je ne vois aucune introspection dans service à l'exception de service list pour le découvrir moi-même...

Où trouver une description plus complète des appels de "service" et de leurs paramètres ?

7voto

royatirek Points 188

En bref

Les codes liés à la commande d'appel de service sont juste les arguments de la fonction et l'ordre à dans lequel la fonction apparaît dans le fichier aidl du service en question.

service call <your_service_name> <number at which the function appears in your_service_name.aidl> <type of the argument like i32 or i64> <argument>

En détail
J'ai rencontré beaucoup de problèmes pour le savoir et je vais donc partager la solution avec l'aide du service de presse-papier.
Tout d'abord, vous devez connaître le service qui vous intéresse.
Pour cela, vous devez rechercher tous les services qui existent pour un système Android particulier en tapant

adb shell service list

Voici ce que vous recevrez -

.
.
.
59  ethernet: [android.net.IEthernetManager]
60  wifip2p: [android.net.wifi.p2p.IWifiP2pManager]
61  rttmanager: [android.net.wifi.IRttManager]
62  wifiscanner: [android.net.wifi.IWifiScanner]
63  wifi: [android.net.wifi.IWifiManager]
64  overlay: [android.content.om.IOverlayManager]
65  netpolicy: [android.net.INetworkPolicyManager]
66  netstats: [android.net.INetworkStatsService]
67  network_score: [android.net.INetworkScoreService]
68  textservices: [com.android.internal.textservice.ITextServicesManager]
69  network_management: [android.os.INetworkManagementService]
70  clipboard: [android.content.IClipboard]
71  statusbar: [com.android.internal.statusbar.IStatusBarService]
.
.
.

Comme je suis intéressé par le service de presse-papiers, voici comment il se présente

70  clipboard: [android.content.IClipboard]

Nous pouvons donc résumer que le nom du service est le service de presse-papiers et que le chemin du paquetage est Android.content.IClipboard.

Vous devez alors connaître le chemin complet où se trouve le fichier IClipboard.aidl.
Pour le savoir, il faut chercher sur google IClipboard.aidl.
Vous devez chercher quelque chose du site Android.googlesource.com dans les résultats, comme dans mon cas

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl

Donc après +/Android-4.2.2_r1, c'est là que se trouve votre chemin, que ce chemin soit path_of_clipboard.aidl=.

/core/java/android/content/IClipboard.aidl

Comme ces codes d'appel de service dépendent du système Android, vous devez connaître le nom de votre système Android. Dans mon cas, c'est 8.1.0.
Je vais donc me rendre sur le site suivant, où Google place son code, et sélectionner ma version du système d'exploitation dans la partie gauche de la page.

https://Android.googlesource.com/platform/frameworks/base/

Dans mon cas, il s'agit d'Android-8.1.0_r50. Je vais cliquer dessus et après cela, mon url ressemblera à ceci

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51

Et après avoir ajouté path_of_clipboard.aidl, mon url complète ressemblera à ceci

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl

Ici, il y aura plusieurs méthodes dans l'interface, comme dans mon cas.

    void setPrimaryClip(in ClipData clip, String callingPackage);
    ClipData getPrimaryClip(String pkg);
    ClipDescription getPrimaryClipDescription(String callingPackage);
    boolean hasPrimaryClip(String callingPackage);
    void addPrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener,
            String callingPackage);
    void removePrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener);
    /**
     * Returns true if the clipboard contains text; false otherwise.
     */
    boolean hasClipboardText(String callingPackage);

Ainsi, le code de la première méthode, c'est-à-dire setPrimaryClip, sera 1, car il est apparu au premier endroit, et celui de la dernière méthode, c'est-à-dire hasClipboardText, sera 7, car il est apparu au septième endroit du fichier aidl. De même pour les autres méthodes.
Donc si je veux appeler la septième méthode, je vais taper

adb shell service call clipboard 7 

Comme vous avez pu le constater, je n'ai pas mis le nom du callingPackage car il n'est pas nécessaire.

Si la méthode a besoin d'arguments, alors vous pouvez les passer comme indiqué dans cet exemple.
Supposons une méthode dont le code est 8 dans le presse-papiers et qui ressemble à ceci -

getDemo(String arg1, int arg2, boolean arg3)

Je vais donc l'appeler comme ceci

adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1

Ici, i32 représente un entier de 32 bits et s16 une chaîne de caractères. Nous pouvons même passer la valeur booléenne comme un entier comme le montre l'exemple.
Dans un nombre entier booléen, 1 correspond à vrai et 0 à faux.

TIP Gardez le logcat ouvert (comme dans Android studio) pour vérifier toute erreur qui s'est produite lors de l'exécution de cette commande adb.
Source :

6voto

Sergey Vlasov Points 2739

Le vrai problème avec service call est que les codes de transaction sont non seulement non documentés, mais aussi que leur stabilité n'est pas garantie - ils peuvent être modifiés silencieusement entre les versions d'Android. Pour cette raison, service call ne doivent jamais être utilisées, sauf pour un débogage privé, lorsque vous savez quelle version d'Android est utilisée.

Exemple :

(Ici FIRST_CALL_TRANSACTION  = 1, de sorte que le code de transaction réel qui doit être utilisé dans le message service call phone est le nombre vu dans la source plus 1).

Notez que dans la nouvelle version TRANSACTION_supplyPuk a été inséré au milieu, et tous les codes suivants sont maintenant décalés de 1. Tout ce qui utilisait le code service call phone pour effectuer ces transactions se briseront terriblement lorsqu'elles seront utilisées sur Android 4.2.2 - les mêmes codes entraîneront l'appel de méthodes complètement différentes, avec éventuellement des résultats désastreux.

4voto

Il n'y a pas de documentation. Mais vous pouvez trouver toutes les informations que vous recherchez dans le code source d'Android. service list vous donne le nom du paquet. Ainsi, pour le phone service qu'il est com.android.internal.telephony.ITelephony . Vous trouverez tous les paramètres possibles pour service call phone répertorié dans com/android/internal/telephony/ITelephony.java pour votre version d'Android.

0voto

Forivin Points 317

Android-svc rend la chose plus facile.

Services de liste :

android-svc --adb list-packages'

Lister toutes les méthodes d'un service :

android-svc --adb list-methods clipboard'

Obtenir la signature d'une méthode de service :

android-svc --adb method-signature 'clipboard.setPrimaryClip'

Appelez une méthode de service :

android-svc --adb call 'phone.dial("555-0199")'

Vous pouvez également utiliser le nom long à la place. Par exemple android.content.IClipboard au lieu de clipboard

Et si vous omettez --adb, vous pouvez même l'exécuter directement sur votre téléphone (dans Termux).

Ce gif est tiré de le dépôt : demo.gif

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X