web-dev-qa-db-ja.com

Androidの「サービスコール」シェルコマンドに関する情報はどこにありますか?

デバイスで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を実行したところ、ismsnotificationを含む私のデバイス用の78のサービスが返されました。ほとんどのサービスでは、名前空間と思われるものを出力します(com.Android.internal.telephony.ISms for ismsおよびAndroid.app.INotificationManager for notification)。この情報を使用して、これらの各サービスで何ができるかを知るにはどうすればよいですか?

24
Corey Ogburn

これが Calling Android services from ADB Shell に関する私の投稿です。特定のデバイス用の適切なバージョンのサービスソースコードを自動的にダウンロードするために使用する小さなbashスクリプトが含まれています次に、それを解析して、すべてのメソッドのトランザクションコードを見つけます。

12
Alex P.

簡単に言えば

サービス呼び出しコマンドに関連するコードは、関数の引数と、そのサービスの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 systemと入力して、そこにあるすべてのサービスを探す必要があります

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 name-私の場合は8.1.0です。
それで、グーグルがそこにコードを置く次のウェブサイトに行き、ページの左側から私のOSバージョンを選択します-

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は、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を表します。
ソース

[〜#〜] tip [〜#〜]logcatを開いたままにします(Android studio)など)そのadbコマンドの実行中に発生したエラーについて。

12
royatirek

私の最初の答えはここにあるので、あなたに役立つことを願っています。

この小さななぞなぞを説明するには、Android 4.3.1。 This リンクが必要な場合があります。Java = 669行目のコード。com.Android.internal.telephony.ISmsサービスに厳密に関連するTRANSACTIONブロック、そしておそらくあなたがもっとできることの答えを待っています。

あなたのケースでは、TRANSACTION_sendTextを呼び出しています。説明は673行目にあります。

static final int TRANSACTION_sendText = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 4);

コードの最後の部分は数字「4」で構成されています。各トランザクション番号+ 1 =適切な番号。これがservice call isms 5sendTextではなくsendMultipartTextを担当する理由です。

同じルールがすべてのサービスに適用されます。

通知サービスのトランザクションを今すぐ確認する方法を見つけたと思います。楽しい。

7
msobolak