web-dev-qa-db-fra.com

Où trouver des informations sur la commande Shell «appel de service» d'Android?

En utilisant adb Shell ou un émulateur de terminal sur l'appareil, la saisie effacera toutes les notifications (nécessite su)

service call notification 1

Cela enverra un sms (ne nécessite pas su)

service call isms 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText"

Où puis-je en savoir plus sur service call? J'ai trouvé cette question et j'apprécie la ventilation de la réponse quant à ce que tout signifie. Mais où puis-je trouver des informations sur la méthode notification 2 pourrait essayer d'appeler?

Fonctionnement service call était incomplet et a imprimé cette utilisation:

Usage: service [-h|-?]
       service list
       service check SERVICE
       service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
   i32: Write the integer INT into the send parcel.
   s16: Write the UTF-16 string STR into the send parcel.

L'Iran service list et il est revenu avec 78 services pour mon appareil, notamment isms et notification et pour la plupart des services, ce qui semble être un espace de noms (com.Android.internal.telephony.ISms pour isms et Android.app.INotificationManager pour notification). Comment puis-je utiliser ces informations pour savoir ce que je peux faire avec chacun de ces services?

24
Corey Ogburn

Voici mon article sur Appel de Android d'ADB Shell . Il comprend un petit script bash que j'utilise pour télécharger automatiquement la version appropriée du code source du service pour mon appareil spécifique puis l'analyser pour trouver les codes de transaction pour toutes les méthodes.

12
Alex P.

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 partagerai donc 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 Android 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 pour 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

Comme ces codes d'appel de service dépendent du système Android, vous devez donc connaître votre Android nom de l'OS - Dans mon cas, c'est 8.1.0
Je vais donc aller sur le site Web suivant où google met du 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, c'est Android-8.1.0_r50. Ici, le r50 n'est pas important. Vous pouvez choisir n'importe quelle révision. Maintenant, je clique sur le lien, 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 s'est produit à la première place et que pour la dernière méthode, c'est-à-dire hasClipboardText, il 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.
Source

[~ # ~] astuce [~ # ~] Gardez le logcat ouvert (comme dans Android studio) pour vérifier pour toute erreur survenue lors de l'exécution de cette commande adb.

12
royatirek

Ma première réponse ici, je l'espère, vous sera utile.

Pour expliquer cette petite énigme, permettez-moi d'utiliser Android 4.3.1. Ce lien pourrait être essentiel dans votre cas. Faites défiler vers le bas le Java = code à la ligne 669. Il vous attend un bloc TRANSACTION strictement lié à com.Android.internal.telephony.ISms service et probablement votre réponse ce que vous pouvez faire de plus.

Dans votre cas, vous invoquez TRANSACTION_sendText. L'explication se trouve à la ligne 673 où vous pouvez trouver

static final int TRANSACTION_sendText = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 4);

La dernière partie du code se compose du chiffre "4". Chaque numéro de TRANSACTION + 1 = le bon. C'est pourquoi service call isms 5 est responsable de sendText et non de sendMultipartText.

La même règle s'applique à tous les services.

Je suis sûr que vous découvrez maintenant comment vérifier les TRANSACTIONS pour le service de notification. Bon amusement.

7
msobolak