回答:
要するに
サービス呼び出しコマンドに関連するコードは、関数の引数と、そのサービスの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をpath_of_clipboard.aidl =にします
/core/java/android/content/IClipboard.aidl
これらのサービスコールコードはAndroidシステムに依存しているため、Android OS名を知る必要があります。私の場合は8.1.0
なので、Googleがコードを配置する次のWebサイトに移動して、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のコードは、aidlファイルの7番目に発生したときに7になります。他のメソッドについても同様です。
したがって、7番目のメソッドを呼び出す場合は、次のように入力します。
adb shell service call clipboard 7
ご存知かもしれませんが、callingPackageの名前は必須ではないので入れていません。
メソッドに引数が必要な場合は、この例に示すように渡すことができます。
クリップボードのコードが8で、次のようなメソッドであると仮定しましょう-
getDemo(String arg1, int arg2, boolean arg3)
だから私はそれをこのように呼びます
adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1
ここで、i32は32ビット整数を表し、s16は文字列を表します。例に示すように、ブール値を整数として渡すこともできます。
ブール整数では、1はtrueを表し、0はfalseを表します。
ヒント logcatを開いたまま(android studioのように)、そのadbコマンドの実行中に発生したエラーを確認します。
ソース
の本当の問題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
ものがありますが、スーパーユーザーコンソールから多くのことを実行できますか?
ドキュメントはありません。しかし、探しているすべての情報をAndroidのソースコードで見つけることができます。service list
パッケージ名を与えます。したがって、phone
サービスについてはそうですcom.android.internal.telephony.ITelephony
。あなたはあなたのAndroidバージョンのためにservice call phone
リストされたすべての可能なパラメーターを見つけるでしょうcom/android/internal/telephony/ITelephony.java
。