Где найти информацию о команде оболочки "служба вызова"?
Используя adb shell
или эмулятор терминала на устройстве, введите это, чтобы очистить все уведомления (требуется su
)
service call notification 1
Это отправит sms (не требует su
)
service call isms 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText"
Где я могу узнать больше о service call
? Я нашел этот вопрос и оценил ответ, говоря о том, что все значит. Но где я могу найти информацию о том, какой метод notification 2
может быть вызван?
Запуск service call
был неполным и напечатал это использование:
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.
Я запустил service list
, и он вернулся с 78 услугами для моего устройства, включая isms
и notification
, и для большинства служб будет напечатано то, что кажется пространством имен (com.android.internal.telephony.ISms
для isms
и android.app.INotificationManager
для notification
). Как я могу использовать эту информацию, чтобы узнать, что я могу сделать с каждой из этих служб?
Ответы
Ответ 1
Вот мой пост о Вызов услуг Android из оболочки ADB. Он включает небольшой bash script, который я использую, чтобы автоматически загрузить правильную версию исходного кода службы для моего конкретного устройства, а затем проанализировать его, чтобы узнать коды транзакций для всех методов.
Ответ 2
Мой первый ответ здесь, поэтому, надеюсь, вам будет полезно.
Чтобы объяснить эту небольшую загадку, позвольте мне использовать android 4.3.1. Эта ссылка может быть существенной в вашем случае. Прокрутите код Java до строки 669. Ожидается, что блок транзакции строго связан с сервисом com.android.internal.telephony.ISms
и, возможно, ваш ответ, что вы можете сделать больше.
В вашем случае вы вызываете TRANSACTION_sendText. Объяснение приведено в строке 673, где вы можете найти
static final int TRANSACTION_sendText = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
Последняя часть кода состоит из цифры "4". Каждый номер транзакции + 1 = правильный. Вот почему service call isms 5
отвечает за sendText
, а не за sendMultipartText
.
То же правило применяется для всех служб.
Я уверен, что вы узнаете, как проверить транзакции для службы уведомлений сейчас. Хорошо повеселиться.
Ответ 3
Короче
Код, относящийся к команде вызова службы, является просто аргументами функции и порядка, в котором функция встречается в файле 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 в результатах, как в моем case-
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 name- В моем случае это 8.1.0
Так что я пойду на следующий веб-сайт, где Google помещает туда код и выбираю мою версию ОС с левой стороны для страницы -
https://android.googlesource.com/platform/frameworks/base/
В моем случае это android-8.1.0_r50. Здесь 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.