Di mana menemukan deskripsi dari semua panggilan "/ system / bin / service"?

12

Dalam satu jawaban saya disarankan untuk menggunakannya service call phone 2 s16 "$number". Ini berfungsi, tetapi dalam service listsaya melihat hal-hal berguna lainnya saya tidak tahu cara menggunakan dan tidak dapat dengan mudah menemukan informasi di Internet.

Saya tidak melihat adanya introspeksi serviceselain service listuntuk mencari tahu sendiri ...

Di mana menemukan deskripsi yang lebih lengkap tentang panggilan "layanan" dan parameternya?

Vi0
sumber
1
Pertanyaan yang bagus ...
Android Quesito

Jawaban:

5

Pendeknya

Kode yang terkait dengan perintah panggilan layanan hanyalah argumen dari fungsi dan urutan di mana fungsi tersebut muncul di file helpl layanan tersebut. Berikut adalah sintaksisnya

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>

Secara rinci
saya menghadapi banyak masalah untuk mengetahuinya dan karenanya saya akan membagikan solusinya dengan bantuan layanan clipboard.
Pertama, Anda perlu tahu tentang layanan yang Anda minati -
Untuk itu Anda perlu mencari semua layanan yang ada untuk sistem android tertentu dengan mengetik

adb shell service list

Inilah yang akan Anda dapatkan -

.
.
.
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]
.
.
.

Karena saya tertarik dengan layanan clipboard, berikut tampilannya

70  clipboard: [android.content.IClipboard]

Jadi dari sini kita dapat meringkas bahwa nama layanan adalah layanan clipboard dan jalur paket adalah android.content.IClipboard

Maka Anda perlu tahu jalur lengkap di mana IClipboard.aidl berada.
Untuk mengetahui bahwa Anda perlu mencari di IClipboard.aidl google.
Anda perlu mencari sesuatu dari situs web android.googlesource.com dalam hasil, seperti dalam case- saya

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl

Jadi setelah + / android-4.2.2_r1 di mana jalur Anda berada. Biarkan jalur itu menjadi path_of_clipboard.aidl =

/core/java/android/content/IClipboard.aidl

Karena kode panggilan layanan ini tergantung pada sistem android, maka Anda perlu tahu nama os android Anda - Dalam kasus saya adalah 8.1.0
Jadi saya akan pergi ke situs web berikut di mana google meletakkan kode di sana dan memilih versi os saya dari sisi kiri untuk halaman -

https://android.googlesource.com/platform/frameworks/base/

Dalam kasus saya ini adalah android-8.1.0_r50. Saya akan mengkliknya dan kemudian setelah itu url saya akan terlihat seperti ini

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51

Dan kemudian setelah menambahkan path_of_clipboard.aidl, url lengkap saya akan terlihat seperti

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl

Di sini akan ada banyak metode dalam antarmuka. Seperti dalam kasus saya

    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);

Jadi kode untuk metode pertama yaitu setPrimaryClip akan menjadi 1 seperti yang terjadi di tempat pertama dan bahwa untuk metode terakhir yaitu hasClipboardText akan menjadi 7 seperti yang terjadi di tempat ketujuh dalam file Aidl. Demikian pula untuk metode lainnya.
Jadi jika saya ingin memanggil metode ketujuh saya akan mengetik

adb shell service call clipboard 7 

Seperti yang Anda mungkin telah melihat bahwa saya belum memasukkan nama callingPackage karena tidak diperlukan.

Jika metode ini membutuhkan argumen, maka Anda dapat meneruskannya seperti yang ditunjukkan pada contoh ini.
Mari kita asumsikan metode yang kodenya 8 di clipboard dan terlihat seperti ini -

getDemo(String arg1, int arg2, boolean arg3)

Jadi saya akan menyebutnya seperti ini

adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1

Di sini i32 berarti integer 32 bit dan s16 untuk string. Kita dapat, bahkan meneruskan nilai boolean sebagai integer seperti yang ditunjukkan dalam contoh.
Dalam boolean integer 1 berarti true dan 0 untuk false.

TIP Biarkan logcat tetap terbuka (seperti di android studio) untuk memeriksa kesalahan yang terjadi saat menjalankan perintah adb itu.
Sumber

royatirek
sumber
6

Masalah sebenarnya service calladalah bahwa kode transaksi tidak hanya tidak terdokumentasi, tetapi juga tidak dijamin stabil - kode tersebut dapat diubah secara diam-diam di antara versi Android. Karena itu, service callperintah tidak boleh digunakan kecuali untuk debugging pribadi, ketika Anda tahu versi Android apa yang digunakan.

Contoh:

(Di sini FIRST_CALL_TRANSACTION = 1, jadi kode transaksi aktual yang harus digunakan dalam service call phoneperintah adalah angka yang terlihat di sumber ditambah 1.)

Perhatikan bahwa dalam versi baru TRANSACTION_supplyPuktelah disisipkan di tengah, dan semua kode berikut sekarang digeser oleh 1. Apa pun yang digunakan service call phoneuntuk melakukan transaksi tersebut akan rusak parah ketika digunakan pada Android 4.2.2 - kode yang sama akan menghasilkan memanggil metode yang sama sekali berbeda , mungkin dengan hasil bencana.

Sergey Vlasov
sumber
Apakah ada beberapa hal yang sedikit lebih tinggi daripada levelnya service call, namun masih memungkinkan banyak hal dilakukan dari konsol superuser?
Vi0
4

Tidak ada dokumentasi. Tetapi Anda dapat menemukan semua informasi yang Anda cari dalam kode sumber android. service listmemberi Anda nama paket. Jadi untuk phonelayanannya com.android.internal.telephony.ITelephony. Anda akan menemukan semua parameter yang mungkin untuk service call phonedicantumkan di com/android/internal/telephony/ITelephony.javaversi Android Anda.


sumber