简而言之
与服务调用命令相关的代码只是函数的参数和顺序
该函数出现在该服务的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所在的完整路径。
要知道您需要在谷歌上搜索 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
所以我会去下面的网站,谷歌在那里放代码,然后从页面的左侧选择我的操作系统版本-
https://android.googlesource.com/platform/frameworks/base/
就我而言,它是 android-8.1.0_r50。这里 r50 并不重要。您可以选择任何修订。现在我将点击链接,然后我的网址将如下所示
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)的代码将是 7,因为它出现在aidl 文件中的第七位。对于其他方法也是如此。
所以如果我想调用第七个方法,我会输入
adb shell service call clipboard 7
您可能已经看到,我没有输入调用包名称,因为它不是必需的。
如果方法需要参数,那么您可以像本例所示那样传递它。
让我们假设一个方法,其代码为 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 命令时发生的任何错误。