Em resumo
O código relacionado ao comando de chamada de serviço são apenas os argumentos da função e a ordem em que a função ocorre no arquivo de ajuda desse serviço. A seguir, há uma sintaxe
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>
Em detalhes
, enfrentei muitos problemas para saber sobre isso e, portanto, compartilharei a solução com a ajuda do serviço de área de transferência.
Primeiro, você precisa saber sobre o serviço em que está interessado -
Para isso, você precisa procurar por todo o serviço disponível para um sistema Android específico, digitando
adb shell service list
Aqui está o que você receberá -
.
.
.
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]
.
.
.
Como estou interessado no serviço da área de transferência, aqui está como
70 clipboard: [android.content.IClipboard]
Portanto, a partir daqui, podemos resumir que o nome do serviço é serviço da área de transferência e o caminho do pacote é android.content.IClipboard
Então você precisa conhecer o caminho completo onde está o IClipboard.aidl.
Para saber que você precisa pesquisar no google por IClipboard.aidl.
Você precisa procurar algo no site android.googlesource.com nos resultados, como no meu caso-
https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl
Então, após + / android-4.2.2_r1, é onde está o seu caminho. Deixe esse caminho ser path_of_clipboard.aidl =
/core/java/android/content/IClipboard.aidl
Como esses códigos de chamada de serviço são dependentes do sistema Android, portanto, você precisa saber o nome do seu sistema operacional Android. No meu caso, é 8.1.0.
Então irei ao site a seguir, onde o Google coloca o código lá e seleciona a versão do sistema operacional no lado esquerdo da página -
https://android.googlesource.com/platform/frameworks/base/
No meu caso, é android-8.1.0_r50.I clicarei nele e, depois disso, meu URL ficará assim
https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51
E depois de adicionar path_of_clipboard.aidl, meu URL completo terá a aparência de
https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl
Aqui haverá muitos métodos na interface. Como no meu caso
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);
Portanto, o código para o primeiro método, por exemplo, setPrimaryClip, será 1, como ocorreu no primeiro lugar, e, para o último método, hasClipboardText, será 7, como ocorreu no sétimo lugar no arquivo aidl. Da mesma forma para os outros métodos.
Então, se eu quiser chamar o sétimo método, digitarei
adb shell service call clipboard 7
Como você deve ter visto, eu não coloquei o nome chamandoPackage, pois não é necessário.
Se o método precisar de argumentos, você poderá transmiti-lo como mostra este exemplo.
Vamos assumir um método cujo código é 8 na área de transferência e que se parece com isso -
getDemo(String arg1, int arg2, boolean arg3)
Então eu vou chamar assim
adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1
Aqui i32 significa número inteiro de 32 bits e s16 para a string. Podemos até passar o valor booleano como um número inteiro, como mostrado no exemplo.
No número inteiro booleano 1 significa verdadeiro e 0 como falso.
DICA Mantenha o logcat aberto (como no android studio) para verificar se há algum erro que ocorreu ao executar esse comando adb.
Fonte