Wo finde ich die Beschreibung aller "/system/bin/service"-Aufrufe?

In einer Antwort wurde mir empfohlen, service call phone 2 s16 "$number". Es funktioniert, aber service listich sehe andere nützliche Dinge, von denen ich nicht weiß, wie man sie benutzt, und kann die Informationen nicht einfach im Internet finden.

Ich sehe keine Selbstbeobachtung darin , serviceaußer service listmich selbst herauszufinden ...

Wo finde ich eine vollständigere Beschreibung der "Service"-Aufrufe und ihrer Parameter?

Antworten (4)

Zusamenfassend

Code, der sich auf den Dienstaufrufbefehl bezieht, sind nur die Argumente der Funktion und die Reihenfolge, in der die Funktion in der ADL-Datei dieses Dienstes auftritt. Hier ist eine Syntax

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>

Im Detail
hatte ich viele Probleme, darüber Bescheid zu wissen, und daher werde ich die Lösung mit Hilfe des Zwischenablage-Dienstes teilen.
Zuerst müssen Sie wissen, an welchem ​​Dienst Sie interessiert sind.
Dazu müssen Sie nach allen Diensten suchen, die für ein bestimmtes Android-System verfügbar sind, indem Sie sie eingeben

adb shell service list

Hier ist, was Sie bekommen -

.
.
.
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]
.
.
.

Da ich am Klemmbrettdienst interessiert bin, sieht es hier aus

70  clipboard: [android.content.IClipboard]

Von hier aus können wir also zusammenfassen, dass der Dienstname Zwischenablagedienst und der Paketpfad android.content.IClipboard ist

Dann müssen Sie den vollständigen Pfad kennen, in dem sich die IClipboard.aidl befindet.
Um das zu wissen, müssen Sie bei Google nach IClipboard.aidl suchen.
Sie müssen in den Ergebnissen nach etwas von der Website android.googlesource.com suchen, wie in meinem Fall.

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

Nach +/android-4.2.2_r1 liegt also Ihr Pfad. Lassen Sie diesen Pfad path_of_clipboard.aidl= sein

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

Da diese Dienstaufrufcodes vom Android-System abhängig sind, müssen Sie den Namen Ihres Android-Betriebssystems kennen. In meinem Fall ist es 8.1.0.
Ich gehe also zur folgenden Website, auf der Google den Code einfügt, und wähle meine Betriebssystemversion aus linke Seite für die Seite -

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

In meinem Fall ist es android-8.1.0_r50. Ich klicke darauf und danach sieht meine URL so aus

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

Und nach dem Hinzufügen von path_of_clipboard.aidl sieht meine vollständige URL so aus

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

Hier wird es viele Methoden in der Schnittstelle geben. Wie in meinem Fall

    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);

Der Code für die erste Methode, dh setPrimaryClip, wird also 1 sein, da er an erster Stelle vorkam, und der für die letzte Methode, dh hasClipboardText, wird 7 sein, da er an siebter Stelle in der Aidl-Datei vorkam. Ähnlich für die anderen Methoden.
Wenn ich also die siebte Methode aufrufen möchte, tippe ich

adb shell service call clipboard 7 

Wie Sie vielleicht gesehen haben, habe ich den Namen des aufrufenden Pakets nicht angegeben, da er nicht erforderlich ist.

Wenn die Methode Argumente benötigt, können Sie sie wie in diesem Beispiel übergeben.
Nehmen wir eine Methode an, deren Code 8 in der Zwischenablage ist und die so aussieht -

getDemo(String arg1, int arg2, boolean arg3)

Also werde ich es so nennen

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

Hier steht i32 für 32 Bit Integer und s16 für den String. Wir können sogar einen booleschen Wert als Ganzzahl übergeben, wie im Beispiel gezeigt.
Bei booleschen Integer steht 1 für wahr und 0 für falsch.

TIPP Lassen Sie logcat geöffnet (wie in Android Studio), um nach Fehlern zu suchen, die beim Ausführen dieses adb-Befehls aufgetreten sind.
Quelle

Das eigentliche Problem service calldabei ist, dass Transaktionscodes nicht nur undokumentiert sind, sondern auch nicht garantiert stabil sind – sie können stillschweigend zwischen Android-Versionen geändert werden. Aus diesem Grund service callsollten Befehle niemals verwendet werden, außer für privates Debugging, wenn Sie wissen, welche Android-Version verwendet wird.

Beispiel:

(Hier FIRST_CALL_TRANSACTION = 1, also ist der eigentliche Transaktionscode, der im service call phoneBefehl verwendet werden sollte, die Zahl, die in der Quelle plus 1 zu sehen ist.)

Beachten Sie, dass in der neuen Version TRANSACTION_supplyPukin der Mitte eingefügt wurde und alle folgenden Codes jetzt um 1 verschoben sind. Alles, was früher service call phonediese Transaktionen durchgeführt hat, wird schrecklich kaputt gehen, wenn es auf Android 4.2.2 verwendet wird – dieselben Codes führen zum Aufrufen völlig anderer Methoden , möglicherweise mit verheerenden Folgen.

Gibt es etwas, das ein bisschen höher ist als service call, aber dennoch viele Dinge von der Superuser-Konsole aus erledigen kann?

Es gibt keine Dokumentation. Aber Sie können alle Informationen, die Sie suchen, im Android-Quellcode finden. service listgibt Ihnen den Paketnamen. Also für den phoneService com.android.internal.telephony.ITelephony. Sie finden alle möglichen Parameter für service call phoneaufgelistet in com/android/internal/telephony/ITelephony.javafür Ihre Android-Version.

android-svc macht diesen Weg einfacher.

Dienste auflisten:

android-svc --adb list-packages'

Alle Methoden eines Dienstes auflisten:

android-svc --adb list-methods clipboard'

Methodensignatur einer Dienstmethode abrufen:

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

Rufen Sie eine Dienstmethode auf:

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

Sie können stattdessen auch den langen Namen verwenden. ZB android.content.IClipboardstattclipboard

Und wenn Sie --adb weglassen, können Sie es sogar direkt auf Ihrem Telefon ausführen (in Termux).

Dieses GIF stammt aus dem Repository :demo.gif