在哪里可以找到所有“ / system / bin / service”调用的描述?


12

一个答案中,建议我使用service call phone 2 s16 "$number"。它可以工作,但是在service list其他有用的东西中,我不知道如何使用并且无法轻松地在Internet上找到信息。

service除了发现service list自己之外,我没有内省。

在哪里可以找到有关“服务”调用及其参数的更完整描述?


1
尼斯问题...
Android Quesito

Answers:


5

简而言之

与服务调用命令相关的代码只是该函数的参数和该函数在该服务的辅助文件中出现的顺序。这里是一种语法

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_of_clipboard.aidl =

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

由于这些服务调用代码取决于android系统,因此您需要知道您的android操作系统名称-在我的情况下为8.1.0,
所以我将转到以下网站,其中google将代码放在该网站上,然后从页面的左侧-

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

在我的情况下是android-8.1.0_r50。我将点击它,然后我的网址将如下所示

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

然后添加path_of_clipboard.aidl后,我的完整网址将如下所示

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个文件中位于第七位的代码出现。其他方法类似。
因此,如果我想调用第七种方法,我将输入

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命令时发生的任何错误。
资源


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,但仍然允许通过超级用户控制台完成许多事情?
2013年

4

没有文档。但是您可以在android源代码中找到所需的所有信息。service list给您包名称。因此对于phone服务而言com.android.internal.telephony.ITelephony。您会找到适用service call phonecom/android/internal/telephony/ITelephony.java您的Android版本的所有可能参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.