Onde encontrar a descrição de todas as chamadas "/ system / bin / service"?


12

Em uma resposta, fui aconselhado a usar service call phone 2 s16 "$number". Funciona, mas service listvejo outras coisas úteis que não sei usar e não consigo encontrar facilmente as informações na Internet.

Não vejo nenhuma introspecção servicealém de service listme descobrir ...

Onde encontrar uma descrição mais completa das chamadas de "serviço" e seus parâmetros?


1
Boa pergunta ...
Android Quesito

Respostas:


5

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


6

O verdadeiro problema service callé que os códigos de transação não apenas não são documentados, mas também não são garantidos como estáveis ​​- eles podem ser alterados silenciosamente entre as versões do Android. Por esse service callmotivo , os comandos nunca devem ser usados, exceto para depuração privada, quando você souber qual versão do Android é usada.

Exemplo:

(Aqui FIRST_CALL_TRANSACTION = 1, o código de transação real que deve ser usado no service call phonecomando é o número visto na fonte mais 1.)

Observe que na nova versão TRANSACTION_supplyPukfoi inserida no meio e todos os códigos a seguir foram alterados para 1. Qualquer coisa que costumava service call phoneexecutar essas transações seria horrivelmente interrompida quando usada no Android 4.2.2 - os mesmos códigos resultariam na chamada de métodos completamente diferentes , possivelmente com resultados desastrosos.


Existe algo que é um pouco mais alto do que service call, mas ainda permite que muitas coisas sejam feitas no console do superusuário?
Vi0

4

Não há documentação. Mas você pode encontrar todas as informações que procura no código-fonte do Android. service listfornece o nome do pacote. Então, pelo phoneserviço que é com.android.internal.telephony.ITelephony. Você encontrará todos os parâmetros possíveis service call phonelistados na com/android/internal/telephony/ITelephony.javasua versão do Android.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.