Используя 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
). Как я могу использовать эту информацию, чтобы узнать, что я могу сделать с каждой из этих служб?
Вот мой пост о Вызов услуг Android из оболочки ADB. Он включает небольшой bash script, который я использую, чтобы автоматически загрузить правильную версию исходного кода службы для моего конкретного устройства, а затем проанализировать его, чтобы узнать коды транзакций для всех методов.
service call phone 87 i32 0 i32 1
(для настройки сети на использование только 2G GSM), скорее всего, выйдет из строя на всех других устройствах, для которых он не предназначен.
Мой первый ответ здесь, поэтому, надеюсь, вам будет полезно.
Чтобы объяснить эту небольшую загадку, позвольте мне использовать 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
.
То же правило применяется для всех служб.
Я уверен, что вы узнаете, как проверить транзакции для службы уведомлений сейчас. Хорошо повеселиться.
Короче
Код, относящийся к команде вызова службы, является просто аргументами функции и порядка, в котором функция встречается в файле 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.