Де знайти опис усіх дзвінків “/ system / bin / service”?


12

В одній відповіді мені рекомендували користуватися service call phone 2 s16 "$number". Це працює, але service listя бачу інші корисні речі, які я не знаю, як користуватися, і не можу легко знайти інформацію в Інтернеті.

Я не бачу ніякої самоаналізу, serviceкрім того, service listщоб знайти себе ...

Де знайти більш повний опис "службових" дзвінків та їх параметри?


1
Приємне запитання ...
Android Quesito

Відповіді:


5

Коротко

Код, пов'язаний із командою виклику служби, - це лише аргументи функції та порядку, в яких функція виникає у файлі helpl цієї служби. Тут є синтаксис

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>

У деталях
я зіткнувся з багатьма проблемами, щоб дізнатися про це, і тому я поділюсь цим рішенням за допомогою сервісу буфера обміну.
Спочатку вам потрібно дізнатися про сервіс, який вас цікавить -
для цього вам потрібно шукати всю службу, яка існує для конкретної андроїд-системи, набравши текст

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 os- У моєму випадку це 8.1.0.
Тому я перейду на наступний веб-сайт, де google вводить там код і виберу свою версію os з ліва сторона сторінки -

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, як він відбувся на сьомому місці у файлі helpl. Аналогічно з іншими методами.
Тож якщо я хочу зателефонувати на сьомий метод, я наберу

adb shell service call clipboard 7 

Як ви могли бачити, що я не поставив ім'я callPackage, оскільки це не потрібно.

Якщо методу потрібні аргументи, ви можете передати його як показано в цьому прикладі.
Припустимо метод, код якого 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 відкритим (як в андроїд-студії), щоб перевірити наявність помилок, які виникали під час виконання цієї команди adb.
Джерело


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.