14 votos

¿Dónde encontrar la descripción de todas las llamadas "/system/bin/service"?

En una respuesta Me aconsejaron usar service call phone 2 s16 "$number" . Funciona, pero en service list Veo otras cosas útiles que no sé cómo utilizar y no puedo encontrar fácilmente la información en Internet.

No veo ninguna introspección en service aparte de service list para averiguarlo yo mismo...

¿Dónde encontrar una descripción más completa de las llamadas de "servicio" y sus parámetros?

7voto

royatirek Puntos 168

En resumen

El código relacionado con el comando de llamada al servicio son sólo los argumentos de la función y el orden en de la función en el archivo aidl de ese servicio.Aquí hay una sintaxis

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>

En detalle
Me enfrenté a un montón de problemas para saber sobre él y por lo tanto voy a compartir la solución con la ayuda del servicio de portapapeles.
En primer lugar, debe conocer el servicio que le interesa.
Para ello es necesario buscar todo el servicio que hay para el sistema Android en particular escribiendo

adb shell service list

Esto es lo que obtendrá -

.
.
.
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 estoy interesado en el servicio de portapapeles, así es como se ve

70  clipboard: [android.content.IClipboard]

Así que de aquí podemos resumir que el nombre del servicio es clipboard service y la ruta del paquete es Android.content.IClipboard

Entonces necesitas saber la ruta completa donde está el IClipboard.aidl.
Para saber eso tienes que buscar en google IClipboard.aidl.
Tienes que buscar algo del sitio web Android.googlesource.com en los resultados, como en mi caso.

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl

Así que después de +/Android-4.2.2_r1 es donde se encuentra su ruta.Que esa ruta sea path_of_clipboard.aidl=

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

Como estos códigos de llamada de servicio dependen del sistema Android, por lo que necesitas saber el nombre de tu sistema operativo Android. En mi caso es 8.1.0
Así que voy a ir a la siguiente página web donde google pone el código y seleccionar mi versión de os de la mano izquierda para la página -

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

En mi caso es Android-8.1.0_r50.Voy a hacer clic en él y después de que mi url se verá así

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

Y después de añadir path_of_clipboard.aidl, mi url completa será como

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl

Aquí habrá muchos métodos en la interfaz.Como en mi 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);

Así que el código para el primer método, es decir, setPrimaryClip será 1, ya que se produjo en el primer lugar y que para el último método, es decir, hasClipboardText será 7, ya que se produjo en el séptimo lugar en el archivo aidl. Lo mismo ocurre con los demás métodos.
Así que si quiero llamar al séptimo método escribiré

adb shell service call clipboard 7 

Como habrás visto no he puesto el nombre del callingPackage ya que no es necesario.

Si el método necesita argumentos, entonces puedes pasarlos como se muestra en este ejemplo.
Supongamos un método cuyo código es 8 en el portapapeles y que tiene el siguiente aspecto

getDemo(String arg1, int arg2, boolean arg3)

Así que lo llamaré así

adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1

Aquí i32 representa un entero de 32 bits y s16 la cadena. Podemos, incluso pasar el valor booleano como un entero como se muestra en el ejemplo.
En los enteros booleanos, 1 significa verdadero y 0 falso.

TIP Mantenga el logcat abierto (como en Android studio) para comprobar cualquier error que se produjo durante la ejecución de ese comando adb.
Fuente

6voto

Sergey Vlasov Puntos 1419

El verdadero problema con service call es que los códigos de transacción no sólo no están documentados, sino que tampoco se garantiza que sean estables: pueden cambiar silenciosamente entre versiones de Android. Debido a esto, service call nunca deben utilizarse, excepto para la depuración privada, cuando se sabe qué versión de Android se utiliza.

Ejemplo:

(Aquí FIRST_CALL_TRANSACTION  = 1, por lo que el código de transacción real que debe utilizarse en el service call phone es el número visto en la fuente más 1).

Tenga en cuenta que en la nueva versión TRANSACTION_supplyPuk se insertó en el medio, y todos los códigos siguientes se desplazan ahora en 1. Todo lo que utilizaba service call phone para realizar esas transacciones se romperá horriblemente cuando se use en Android 4.2.2 - los mismos códigos resultarán en llamar a métodos completamente diferentes, posiblemente con resultados desastrosos.

0 votos

¿Hay algo que es un poco más de alto nivel que service call ¿pero aún así permite hacer muchas cosas desde la consola de superusuario?

0 votos

4voto

No hay documentación. Pero puedes encontrar toda la información que buscas en el código fuente de Android. service list le da el nombre del paquete. Así que para el phone servicio es com.android.internal.telephony.ITelephony . Encontrará todos los parámetros posibles para service call phone que aparece en com/android/internal/telephony/ITelephony.java para su versión de Android.

0voto

Forivin Puntos 56

Android-svc hace que esto sea más fácil.

Lista de servicios:

android-svc --adb list-packages'

Enumerar todos los métodos de un servicio:

android-svc --adb list-methods clipboard'

Obtener la firma de un método de servicio:

android-svc --adb method-signature 'clipboard.setPrimaryClip'

Llama a un método de servicio:

android-svc --adb call 'phone.dial("555-0199")'

También puede utilizar el nombre largo en su lugar. Por ejemplo android.content.IClipboard en lugar de clipboard

Y si omites --adb puedes incluso ejecutarlo directamente en tu teléfono (en Termux).

Este gif está sacado de el repositorio : demo.gif

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X