Короче говоря
Код, относящийся к команде вызова службы, является просто аргументами функции и порядка, в котором функция встречается в файле aidl этой службы. Вот синтаксис
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>
Подробно
я столкнулся с множеством проблем, чтобы узнать об этом, и поэтому я поделюсь решением с помощью сервиса буфера обмена.
Для начала вам нужно узнать об интересующей вас услуге -
для этого вам нужно найти все службы, доступные для конкретной системы Android, набрав
adb shell service list
Вот что вы получите -
.
.
.
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]
.
.
.
Как я заинтересован в буфере обмена, вот как это выглядит
70 clipboard: [android.content.IClipboard]
Итак, отсюда мы можем подвести итог, что имя службы - это служба буфера обмена, а путь к пакету - android.content.IClipboard.
Затем вам нужно знать полный путь к IClipboard.aidl.
Чтобы узнать, что вам нужно искать в Google для IClipboard.aidl.
Вам нужно искать что-то с сайта android.googlesource.com в результатах, как в моем случае-
https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl
Поэтому после + / android-4.2.2_r1 находится ваш путь. Пусть этот путь будет path_of_clipboard.aidl =
/core/java/android/content/IClipboard.aidl
Поскольку эти коды вызовов службы зависят от системы Android, следовательно, вам необходимо знать имя вашего Android OS - в моем случае это 8.1.0.
Поэтому я пойду на следующий веб-сайт, где Google помещает туда код и выберите мою версию ОС из левая сторона страницы -
https://android.googlesource.com/platform/frameworks/base/
В моем случае это Android-8.1.0_r50. Я нажму на него, и после этого мой URL будет выглядеть так
https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51
И тогда после добавления path_of_clipboard.aidl мой полный URL будет выглядеть
https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl
Здесь будет много методов в интерфейсе. Как и в моем случае
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);
Таким образом, код для первого метода, т.е. setPrimaryClip, будет равен 1, как это произошло на первом месте, а код для последнего метода, т.е. hasClipboardText, будет равен 7, как это произошло на седьмом месте в файле aidl. Аналогично для других методов.
Поэтому, если я хочу вызвать седьмой метод, я наберу
adb shell service call clipboard 7
Как вы могли заметить, я не указывал имя вызывающего пакета, так как оно не требуется.
Если метод нуждается в аргументах, вы можете передать его, как показано в этом примере.
Давайте предположим метод, код которого равен 8 в буфере обмена и который выглядит следующим образом:
getDemo(String arg1, int arg2, boolean arg3)
Так я буду называть это так
adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1
Здесь i32 обозначает 32-разрядное целое число, а s16 - строку. Мы можем даже передать логическое значение как целое число, как показано в примере.
В булевом целом числе 1 обозначает истину, а 0 - ложь.
СОВЕТ Держите logcat открытым (как в android studio), чтобы проверить наличие ошибок, возникших при выполнении этой команды adb.
Источник