Answers:
简而言之
与服务调用命令相关的代码只是该函数的参数和该函数在该服务的辅助文件中出现的顺序。这里是一种语法
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命令时发生的任何错误。
资源
真正的问题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
。您会找到适用service call phone
于com/android/internal/telephony/ITelephony.java
您的Android版本的所有可能参数。