Gdzie znaleźć opis wszystkich połączeń „/ system / bin / service”?

12

W jednej odpowiedzi zalecono mi użycie service call phone 2 s16 "$number". Działa, ale service listwidzę inne przydatne rzeczy, których nie umiem używać i nie mogę łatwo znaleźć informacji w Internecie.

Nie widzę żadnej introspekcji servicepoza tym, service listżeby się dowiedzieć ...

Gdzie znaleźć pełniejszy opis połączeń „serwisowych” i ich parametrów?

Vi0
źródło
1
Ładne pytanie ...
Android Quesito

Odpowiedzi:

5

W skrócie

Kod związany z poleceniem wywołania usługi to tylko argumenty funkcji i kolejność, w jakiej funkcja występuje w pliku pomocniczym tej usługi. Oto składnia

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>

Szczegółowo
napotkałem wiele problemów, aby o tym wiedzieć i dlatego podzielę się rozwiązaniem za pomocą usługi schowka.
Najpierw musisz wiedzieć o usłudze, którą jesteś zainteresowany - w
tym celu poszukaj całej usługi dostępnej dla konkretnego systemu Android, wpisując

adb shell service list

Oto, co dostaniesz -

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

Ponieważ jestem zainteresowany usługą schowka, oto jak to wygląda

70  clipboard: [android.content.IClipboard]

Stąd możemy podsumować, że nazwa usługi to usługa schowka, a ścieżka pakietu to android.content.IClipboard

Następnie musisz znać pełną ścieżkę do pliku IClipboard.aidl.
Aby wiedzieć, że musisz wyszukać w Google IClipboard.aidl.
Musisz poszukać czegoś na stronie android.googlesource.com w wynikach, tak jak w moim przypadku-

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

Więc po + / android-4.2.2_r1 jest tam, gdzie leży twoja ścieżka. Niech ścieżka będzie ścieżką do clipboard.aidl =

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

Ponieważ te kody połączeń serwisowych zależą od systemu Android, dlatego musisz znać swoją nazwę systemu operacyjnego Android. W moim przypadku jest to
wersja 8.1.0. Więc przejdę do następującej witryny, w której Google umieszcza kod i wybieram wersję systemu operacyjnego z lewa strona strony -

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

W moim przypadku jest to Android-8.1.0_r50. Kliknę na niego, a następnie mój adres URL będzie wyglądał tak

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

A potem po dodaniu path_of_clipboard.aidl mój pełny adres URL będzie wyglądał

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

W interfejsie będzie wiele metod, podobnie jak w moim przypadku

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

Zatem kod dla pierwszej metody, tj. SetPrimaryClip, będzie wynosił 1, tak jak pojawił się na pierwszym miejscu, a dla ostatniej metody, tj. HasClipboardText, będzie wynosił 7, tak jak pojawił się na siódmym miejscu w pliku aidl. Podobnie w przypadku innych metod.
Więc jeśli chcę wywołać siódmą metodę, wpiszę

adb shell service call clipboard 7 

Jak mogłeś zauważyć, nie wstawiłem nazwy pakietu wywołującego, ponieważ nie jest on wymagany.

Jeśli metoda potrzebuje argumentów, możesz przekazać ją tak, jak pokazano w tym przykładzie.
Załóżmy metodę, której kod ma w schowku kod 8 i wygląda następująco -

getDemo(String arg1, int arg2, boolean arg3)

Nazwie to tak

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

I32 oznacza 32-bitową liczbę całkowitą, a s16 oznacza ciąg. Możemy nawet przekazać wartość logiczną jako liczbę całkowitą, jak pokazano w przykładzie.
W logicznych liczbach całkowitych 1 oznacza true, a 0 false.

WSKAZÓWKA Trzymaj logcat otwarty (jak w Android Studio), aby sprawdzić, czy wystąpił błąd, który wystąpił podczas wykonywania tego polecenia adb.
Źródło

Royatirek
źródło
6

Prawdziwy problem service callpolega na tym, że kody transakcji są nie tylko nieudokumentowane, ale również nie są stabilne - można je cicho zmieniać między wersjami Androida. Z tego powodu service callnigdy nie należy używać poleceń , z wyjątkiem prywatnego debugowania, gdy wiadomo, która wersja Androida jest używana.

Przykład:

(Tutaj FIRST_CALL_TRANSACTION = 1, więc rzeczywisty kod transakcji, który powinien zostać użyty w service call phonepoleceniu, to liczba widoczna w źródle plus 1.)

Zauważ, że w nowej wersji TRANSACTION_supplyPukzostał wstawiony w środku, a wszystkie następujące kody są teraz przesunięte o 1. Wszystko, co zostało użyte service call phonedo przeprowadzenia tej transakcji, będzie strasznie zepsute, gdy zostanie użyte na Androidzie 4.2.2 - te same kody spowodują wywołanie zupełnie innych metod , prawdopodobnie z katastrofalnymi skutkami.

Siergiej Własow
źródło
Czy jest coś, co jest nieco wyższe niż poziom service call, a jednocześnie pozwala na wiele rzeczy do zrobienia z konsoli superużytkownika?
Vi0
4

Brak dokumentacji. Ale wszystkie potrzebne informacje można znaleźć w kodzie źródłowym Androida. service listdaje ci nazwę pakietu. Tak jest w przypadku phoneusługi com.android.internal.telephony.ITelephony. Znajdziesz wszystkie możliwe parametry dla service call phonewymienionych w com/android/internal/telephony/ITelephony.javawersji dla Androida.


źródło