代码之家  ›  专栏  ›  技术社区  ›  Beyondo

以编程方式获取要在服务调用连接中使用的服务代码?[副本]

  •  0
  • Beyondo  · 技术社区  · 6 年前

    使用 adb shell 或设备上的终端模拟器,输入此命令将清除所有通知(需要 su )

    service call notification 1
    

    这将发送一条短信(不需要 )

    service call isms 5 s16 "PhoneNumber" i32 0 i32 0 s16 "BodyText"
    

    我在哪里可以了解更多 service call ? 我发现了 this question 感谢你对答案的理解。但是我在哪里可以找到关于什么方法的信息 notification 2 可能在打电话?

    跑步 服务电话 不完整并打印此用法:

    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 它为我的设备提供了78项服务,包括 isms notification 对于大多数服务来说,都会打印一个名称空间( com.android.internal.telephony.ISms 对于 isms系统 android.app.INotificationManager 对于 通知 ). 我如何使用这些信息来了解我可以使用这些服务做些什么?

    0 回复  |  直到 6 年前
        1
  •  12
  •   Alex P.    10 年前

    这是我的帖子 Calling Android services from ADB shell . 它包括一个小bash脚本,我使用它自动下载特定设备的正确版本的服务源代码,然后对其进行解析,找出所有方法的事务代码。

        2
  •  8
  •   royatirek    6 年前

    简而言之

    与服务调用命令相关的代码只是函数的参数和 函数出现在服务的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>
    

    详细
    我在了解它时遇到了很多问题,因此我将在剪贴板服务的帮助下分享解决方案。
    首先你需要知道你感兴趣的服务-
    为此,您需要通过键入

    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所在的完整路径。
    要知道你需要在谷歌上搜索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就是你的路径所在=

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

    由于这些服务调用代码依赖于android系统,因此需要知道android操作系统的名称- 在我看来是8.1.0
    所以我将转到下面的网站,google在那里输入代码,然后在页面的左侧选择我的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。其他方法也一样。
    所以如果我想调用第七个方法,我将键入

    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代表真,0代表假。
    Source

    小费 保持logcat打开(就像在android studio中一样),以检查在执行adb命令时发生的任何错误。

        3
  •  7
  •   msobolak    11 年前

    我在这里的第一个回答是希望对你有用。

    为了解释这个小谜团,让我使用android 4.3.1。 This 在您的情况下,链接可能是必不可少的。向下滚动java代码至第669行。有一个与 com.android.internal.telephony.ISms 服务,也许你的答案你能做的更多。

    在您的例子中,您正在调用TRANSACTION_sendText。说明在第673行

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

    代码的最后一部分由数字“4”组成。每个交易号+1=正确的交易号。这就是为什么 service call isms 5 负责 sendText 而不是为了 sendMultipartText .

    同样的规则适用于所有服务。

    我确信您现在知道了如何检查通知服务的事务。很有趣。