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


12

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

No veo ninguna introspección serviceaparte de service listdescubrirme ...

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


1
Buena pregunta ...
Android Quesito

Respuestas:


5

En breve

El código relacionado con el comando de llamada de servicio son solo los argumentos de la función y el orden en que se produce la función en el archivo de ayuda 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
, enfrenté muchos problemas para saberlo y, por lo tanto, compartiré la solución con la ayuda del servicio de portapapeles.
Primero debe saber sobre el servicio que le interesa:
para eso debe buscar todo el servicio que está disponible para un sistema Android en particular escribiendo

adb shell service list

Esto es lo que obtendrás:

.
.
.
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]

Entonces, desde aquí podemos resumir que el nombre del servicio es el servicio del portapapeles y la ruta del paquete es android.content.IClipboard

Entonces necesita saber la ruta completa donde está el IClipboard.aidl.
Para saber que necesita buscar en Google IClipboard.aidl.
Debe buscar algo en el 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

Entonces, después de + / android-4.2.2_r1 es donde se encuentra su camino. Deje que ese camino sea path_of_clipboard.aidl =

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

Como estos códigos de llamada de servicio dependen del sistema de Android, por lo tanto, debe conocer el nombre de su sistema operativo Android: en mi caso, es 8.1.0,
así que iré al siguiente sitio web donde google coloca el código y seleccionaré mi versión del sistema operativo desde lado izquierdo de la página -

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

En mi caso es android-8.1.0_r50. Haré clic en él y luego mi URL se verá así

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

Y luego, después de agregar path_of_clipboard.aidl, mi URL completa se verá 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);

Por lo tanto, el código para el primer método, es decir, setPrimaryClip, será 1 como ocurrió en el primer lugar y para el último método, es decir, hasClipboardText, será 7 como ocurrió en el séptimo lugar en el archivo de ayuda. Del mismo modo para los otros métodos.
Entonces, 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 paquete de llamadas, ya que no es obligatorio.

Si el método necesita argumentos, puede pasarlo como se muestra en este ejemplo.
Supongamos un método cuyo código es 8 en el portapapeles y que se ve así:

getDemo(String arg1, int arg2, boolean arg3)

Entonces lo llamaré así

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

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

SUGERENCIA Mantenga abierto el logcat (como en el estudio de Android) para verificar si se produjo algún error al ejecutar ese comando adb.
Fuente


6

El verdadero problema service calles que los códigos de transacción no solo no están documentados, sino que tampoco se garantiza que sean estables, sino que se pueden cambiar silenciosamente entre las versiones de Android. Debido a esto, los service callcomandos nunca deben usarse, excepto para la depuración privada, cuando se sabe qué versión de Android se usa.

Ejemplo:

(Aquí FIRST_CALL_TRANSACTION = 1, entonces el código de transacción real que se debe usar en el service call phonecomando es el número que se ve en la fuente más 1.)

Tenga en cuenta que en la nueva versión TRANSACTION_supplyPukse insertó en el medio, y todos los siguientes códigos ahora se cambian por 1. Cualquier cosa que solía service call phonerealizar esas transacciones se romperá horriblemente cuando se use en Android 4.2.2: los mismos códigos darán como resultado métodos completamente diferentes , posiblemente con resultados desastrosos.


¿Hay algo que tenga un nivel un poco más alto que service call, pero que todavía permita hacer muchas cosas desde la consola de superusuario?
Vi0

4

No hay documentación Pero puede encontrar toda la información que busca en el código fuente de Android. service listte da el nombre del paquete. Entonces, por el phoneservicio que es com.android.internal.telephony.ITelephony. Encontrará todos los parámetros posibles service call phoneenumerados com/android/internal/telephony/ITelephony.javapara su versión de Android.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.