¿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 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 a mí mismo...

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

Respuestas (4)

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 ocurre 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
, enfrenté muchos problemas para saberlo y, por lo tanto, compartiré la solución con la ayuda del servicio de portapapeles.
Primero debe conocer el servicio que le interesa:
para eso, debe buscar todo el servicio que existe para un 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]

Entonces, desde aquí podemos resumir que el nombre del servicio es servicio de 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 para IClipboard.aidl.
Debe 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

Entonces, después de +/android-4.2.2_r1 es donde se encuentra su ruta. Deje 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 tanto, necesita saber el nombre de su sistema operativo Android. En mi caso, es 8.1.0
. Entonces, iré al siguiente sitio web donde Google coloca el código y seleccionaré la versión de mi sistema operativo de la 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á así

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);

Entonces, el código para el primer método, es decir, setPrimaryClip, será 1, ya que ocurrió en primer lugar, y el del último método, es decir, hasClipboardText, será 7, ya que ocurrió en el séptimo lugar en el archivo aidl. 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 llamada porque 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)

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 número entero como se muestra en el ejemplo.
En entero booleano, 1 significa verdadero y 0 falso.

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

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: se pueden cambiar silenciosamente entre versiones de Android. Debido a esto, service calllos comandos nunca deben usarse, excepto para la depuración privada, cuando sabe qué versión de Android se usa.

Ejemplo:

(Aquí FIRST_CALL_TRANSACTION = 1, por lo que el código de transacción real que debe usarse 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 códigos siguientes ahora se desplazan por 1. Todo lo que solía service call phonerealizar esas transacciones se romperá horriblemente cuando se use en Android 4.2.2: los mismos códigos resultarán en llamadas a métodos completamente diferentes. , posiblemente con resultados desastrosos.

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

No hay documentación. Pero puede encontrar toda la información que busca en el código fuente de Android. service listle da el nombre del paquete. Así que para el phoneservicio que es com.android.internal.telephony.ITelephony. Encontrará todos los parámetros posibles para service call phonesu com/android/internal/telephony/ITelephony.javaversión de Android.

android-svc lo hace más fácil.

Listar servicios:

android-svc --adb list-packages'

Enumere todos los métodos de un servicio:

android-svc --adb list-methods clipboard'

Obtenga la firma del método de un método de servicio:

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

Llame a un método de servicio:

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

También puede usar el nombre largo en su lugar. Por ejemplo, android.content.IClipboarden lugar declipboard

Y si omite --adb, incluso puede ejecutarlo directamente en su teléfono (en Termux).

Este gif está tomado del repositorio :demo.gif