Где найти информацию о командной оболочке Android "service call"?
С помощью adb shell
или эмулятор терминала на устройстве, ввод этого удалит все уведомления (требуется su
)
service call notification 1
Это отправит смс (не требует 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
). Как я могу использовать эту информацию, чтобы узнать, что я могу сделать с каждой из этих служб?
5 ответов
Короче
Код, относящийся к команде вызова службы, является просто аргументами функции и порядка, в котором функция встречается в файле 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 - ложь.
Источник
Вот мой пост о вызове сервисов Android из оболочки ADB. Он включает в себя небольшой скрипт bash, который я использую, чтобы автоматически загрузить правильную версию исходного кода службы для моего конкретного устройства, а затем проанализировать его, чтобы выяснить коды транзакций для всех методов.
Мой первый ответ здесь, так что я надеюсь, будет полезен для вас.
Чтобы объяснить эту маленькую загадку, позвольте мне использовать Android 4.3.1. Эта ссылка может быть важной в вашем случае. Прокрутите код Java до строки 669. Там вас ждет блок TRANSACTION, строго связанный с 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
,
Это же правило применяется ко всем услугам.
Я уверен, что вы узнаете, как проверить транзакции для службы уведомлений сейчас. Хорошо повеселиться.
Как вы уже поняли, запуск
Затем вы можете найти исходный код такого пакета, если ваша версия Android — AOSP или близка к ней. Там у вас есть список всех команд, доступных для этой службы. Вы вызываете конкретную команду по ее номеру.
Проблема в том, что команды зависят от версии Android. Алекс П. поделился скриптом bash ( /questions/37218467/gde-najti-informatsiyu-o-komandnoj-obolochke-android-service-call/37218475#37218475), который ищет служебные коды для конкретной версии Android, на которой работает ваше устройство. Скрипт проверяет версию Android вашего телефона и имя java-пакета службы, которое вы указали в качестве параметра. Затем скрипт загружает служебный файл для версии Android вашего телефона с https://android.googlesource.com и анализирует его. Его связанный bash-скрипт великолепен, хотя и устарел по сравнению с текущими версиями Android. Я обновил его сценарий и разместил его здесь: https://pastebin.com/xQ21EZJh
Работает нормально с A10 и A11 по крайней мере! Но я думаю, что он отлично работает и с последними выпусками.
Например, я использовал его, чтобы перехватить номер вызова службы, чтобы увеличить лимит фоновых процессов, с помощью следующей команды на A11:
service call activity 43 i32 xxx
Скрипту нужна рабочая среда adb и ваше устройство подключено.
Все кредиты Алексу П., спасибо, Алекс!
С помощью
service call notification 1
и т.д. небезопасно, так как он может делать что-то совершенно другое на любом устройстве, на котором вы его запускаете.
Вместо этого вы можете использовать android-svc. Например, чтобы набрать номер (без звонка):
android-svc --adb call 'phone.dial("555-0199")'
Он также дает вам информацию о типах данных. Например
android-svc --adb method-signature 'phone.dial'
Напечатаем:
void dial(String number);
Он также может в первую очередь перечислять методы для данной службы...
Эта гифка взята из репозитория:
Обратите внимание, что ваш isms-вызов для отправки SMS больше не будет работать в последних версиях Android, поскольку
isms
сервис не имеет
sendText
метод больше. Вероятно, сейчас вам придется использовать sendTextForSubscriber, который труднее вызвать, потому что он принимает гораздо больше параметров.
Кроме того, чтобы напрямую ответить на ваш вопрос. Где найти информацию о команде оболочки Android "service call"? :Посмотрите исходный код.
Usage: service [-h|-?]
service list
service check SERVICE
service call SERVICE CODE [i32 N | i64 N | f N | d N | s16 STR | null | fd f | nfd n | afd f ] ...
Options:
i32: Write the 32-bit integer N into the send parcel.
s16: Write the UTF-16 string STR into the send parcel.
ДОСТУПНО С ANDROID 6:
i64: Write the 64-bit integer N into the send parcel.
f: Write the 32-bit single-precision number N into the send parcel.
d: Write the 64-bit double-precision number N into the send parcel.
ДОСТУПНО С ANDROID 11:
null: Write a null binder into the send parcel.
fd: Write a file descriptor for the file f to the send parcel.
nfd: Write file descriptor n to the send parcel.
afd: Write an ashmem file descriptor for a region containing the data from file f to the send parcel.
СКРЫТЫЙ ВАРИАНТ, КОТОРЫЙ ВСЕГДА ДОСТУПЕН:
intent: Write and Intent int the send parcel. ARGS can be action=STR data=STR type=STR launchFlags=INT component=STR categories=STR[,STR,...]