Коротко
Код, пов'язаний із командою виклику служби, - це лише аргументи функції та порядку, в яких функція виникає у файлі helpl цієї служби. Тут є синтаксис
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>
У деталях
я зіткнувся з багатьма проблемами, щоб дізнатися про це, і тому я поділюсь цим рішенням за допомогою сервісу буфера обміну.
Спочатку вам потрібно дізнатися про сервіс, який вас цікавить -
для цього вам потрібно шукати всю службу, яка існує для конкретної андроїд-системи, набравши текст
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 os- У моєму випадку це 8.1.0.
Тому я перейду на наступний веб-сайт, де google вводить там код і виберу свою версію os з ліва сторона сторінки -
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, як він відбувся на сьомому місці у файлі helpl. Аналогічно з іншими методами.
Тож якщо я хочу зателефонувати на сьомий метод, я наберу
adb shell service call clipboard 7
Як ви могли бачити, що я не поставив ім'я callPackage, оскільки це не потрібно.
Якщо методу потрібні аргументи, ви можете передати його як показано в цьому прикладі.
Припустимо метод, код якого 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 відкритим (як в андроїд-студії), щоб перевірити наявність помилок, які виникали під час виконання цієї команди adb.
Джерело