Где найти описание всех вызовов «/ system / bin / service»?

12

В одном ответе мне посоветовали использовать service call phone 2 s16 "$number". Это работает, но service listя вижу другие полезные вещи, которые я не знаю, как использовать и не могу легко найти информацию в Интернете.

Я не вижу никакого самоанализа, serviceкроме service listкак выяснить себя ...

Где найти более полное описание «сервисных» звонков и их параметров?

VI0
источник
1
Хороший вопрос ...
Android Quesito

Ответы:

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 - ложь.

СОВЕТ Держите logcat открытым (как в android studio), чтобы проверить наличие ошибок, возникших при выполнении этой команды adb.
Источник

royatirek
источник
6

Реальная проблема service callзаключается в том, что коды транзакций не только недокументированы, но и не гарантированы как стабильные - их можно молча менять между версиями Android. Из-за этого service callкоманды никогда не должны использоваться, за исключением частной отладки, когда вы знаете, какая версия Android используется.

Пример:

(Здесь FIRST_CALL_TRANSACTION = 1, поэтому фактический код транзакции, который должен использоваться в service call phoneкоманде, равен числу, указанному в источнике плюс 1.)

Обратите внимание, что в новой версии TRANSACTION_supplyPukбыла вставлена ​​посередине, и все последующие коды теперь сдвинуты на 1. Все, что использовалось service call phoneдля выполнения этих транзакций, ужасно сломается при использовании на Android 4.2.2 - одни и те же коды приведут к вызову совершенно разных методов возможно с катастрофическими результатами.

Сергей Власов
источник
Есть ли какая-то вещь, которая немного более высокого уровня service call, но все же позволяет многое сделать с консоли суперпользователя?
Vi0
4

Там нет документации. Но вы можете найти всю информацию, которую вы ищете в исходном коде Android. service listдает вам имя пакета. Так что для phoneслужбы это так com.android.internal.telephony.ITelephony. Вы найдете все возможные параметры для service call phoneперечисленных в com/android/internal/telephony/ITelephony.javaвашей версии Android.


источник