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

12

Dans une réponse, on m'a conseillé d'utiliser service call phone 2 s16 "$number". Cela fonctionne, mais service listje vois d'autres choses utiles que je ne sais pas utiliser et que je ne trouve pas facilement les informations sur Internet.

Je ne vois aucune introspection en servicedehors de service listme découvrir ...

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

Vi0
la source
1
Belle question ...
Android Quesito

Réponses:

5

En bref

Le code lié à la commande d'appel de service n'est que les arguments de la fonction et l'ordre dans lequel la fonction se produit dans le fichier aidl de ce service. Voici une syntaxe

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-papiers.
Vous devez d'abord connaître le service qui vous intéresse -
Pour cela, vous devez rechercher tous les services disponibles pour un système Android particulier en tapant

adb shell service list

Voici ce que vous obtiendrez -

.
.
.
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 à quoi il ressemble

70  clipboard: [android.content.IClipboard]

Donc, à partir d'ici, nous pouvons résumer que le nom du service est service de presse-papiers et que le chemin du package est android.content.IClipboard

Ensuite, vous devez connaître le chemin complet où se trouve IClipboard.aidl.
Pour savoir que vous devez rechercher sur google IClipboard.aidl.
Vous devez rechercher quelque chose sur le 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 se trouve votre chemin. Que ce chemin soit path_of_clipboard.aidl =

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

Étant donné que ces codes d'appel de service dépendent du système Android, vous devez donc connaître le nom de votre système d'exploitation Android. Dans mon cas, il s'agit de la version 8.1.0.
Je vais donc aller sur le site Web suivant où Google met du code et sélectionner ma version de système d'exploitation dans le côté gauche de la page -

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

Dans mon cas, c'est android-8.1.0_r50.Je clique dessus, puis mon URL ressemblera à ceci

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

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

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

Ici, il y aura de nombreuses 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 comme il est apparu à la première place et celui de la dernière méthode, c'est-à-dire hasClipboardText, sera 7 comme il est apparu à la septième place dans le 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 l'avez peut-être vu, je n'ai pas mis le nom de callingPackage car il n'est pas requis.

Si la méthode a besoin d'arguments, vous pouvez la 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)

Donc je l'appellerai comme ça

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

Ici, i32 signifie entier 32 bits et s16 pour la chaîne. Nous pouvons même passer la valeur booléenne sous forme d'entier comme le montre l'exemple.
En entier booléen 1 signifie vrai et 0 pour faux.

CONSEIL Gardez le logcat ouvert (comme dans Android Studio) pour vérifier toute erreur survenue lors de l'exécution de la commande adb.
La source

royatirek
la source
6

Le vrai problème service callest que les codes de transaction ne sont pas seulement non documentés, mais ne sont pas non plus garantis pour être stables - ils peuvent être modifiés en silence entre les versions d'Android. Pour cette raison, les service callcommandes ne doivent jamais être utilisées, sauf pour le débogage privé, lorsque vous savez quelle version d'Android est utilisée.

Exemple:

(Ici FIRST_CALL_TRANSACTION = 1, donc le code de transaction réel qui devrait être utilisé dans la service call phonecommande est le nombre vu dans la source plus 1.)

Notez que dans la nouvelle version a TRANSACTION_supplyPukété insérée au milieu, et tous les codes suivants sont maintenant décalés de 1. Tout ce qui utilisé service call phonepour effectuer ces transactions se cassera horriblement lorsqu'il est utilisé sur Android 4.2.2 - les mêmes codes entraîneront l'appel de méthodes complètement différentes , peut-être avec des résultats désastreux.

Sergey Vlasov
la source
Y a-t-il quelque chose qui est un peu plus élevé que service call, tout en permettant encore beaucoup de choses à faire à partir de la console superutilisateur?
Vi0
4

Il n'y a pas de documentation. Mais vous pouvez trouver toutes les informations que vous recherchez dans le code source Android. service listvous donne le nom du package. Donc pour le phoneservice c'est com.android.internal.telephony.ITelephony. Vous trouverez tous les paramètres possibles pour service call phonerépertoriés dans com/android/internal/telephony/ITelephony.javavotre version Android.


la source