Где найти информацию о команде оболочки Android «service call»?

18

Используя 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). Как я могу использовать эту информацию, чтобы узнать, что я могу сделать с каждой из этих служб?

  • 0
    также спросил на android.stackexchange.com/q/57778/1302
  • 0
    Да, мной. Я не был уверен, какое сообщество лучше ответит на мой вопрос. Я думаю, что обе общины могли бы извлечь из этого пользу.
Теги:
adb
service

3 ответа

10

Вот мой пост о Вызов услуг Android из оболочки ADB. Он включает небольшой bash script, который я использую, чтобы автоматически загрузить правильную версию исходного кода службы для моего конкретного устройства, а затем проанализировать его, чтобы узнать коды транзакций для всех методов.

  • 2
    Это действительно ответ! Жаль, что мне понадобилось 2 года, чтобы найти твой сценарий! Чтобы другие знали, каждый сервисный вызов в значительной степени зависит от AOS / API: чем меньше номер вызова, тем больше вероятность того, что он будет совместим с версиями AOS. Для более высоких номеров, например, service call phone 87 i32 0 i32 1 (для настройки сети на использование только 2G GSM), скорее всего, выйдет из строя на всех других устройствах, для которых он не предназначен.
7

Мой первый ответ здесь, поэтому, надеюсь, вам будет полезно.

Чтобы объяснить эту небольшую загадку, позвольте мне использовать 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.

То же правило применяется для всех служб.

Я уверен, что вы узнаете, как проверить транзакции для службы уведомлений сейчас. Хорошо повеселиться.

  • 1
    Файл Java, на который вы ссылаетесь, не является частью официального дерева исходного кода. Он генерируется из файла AIDL - android.googlesource.com/platform/frameworks/base/+/… . Мне тоже легче разбирать
  • 0
    @AlexP Не хватает смысла - информация, которая вам необходима для этого, находится в скомпилированном файле. Исходный файл AIDL вообще не имеет номеров транзакций, так как они генерируются при компиляции.
Показать ещё 2 комментария
2

Короче

Код, относящийся к команде вызова службы, является просто аргументами функции и порядка, в котором функция встречается в файле 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.

  • 0
    «В моем случае это android-8.1.0_r50»: Вы имеете в виду версию Android на отдельном устройстве или compileSdkVersion в конфигурации Gradle?
  • 0
    r50 не важен, так как они не будут вводить новую функцию в файл интерфейса между ревизиями. Я отредактировал это.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню