En una respuesta me aconsejaron usar service call phone 2 s16 "$number"
. Funciona, pero service list
veo 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 service
aparte de service list
descubrirme a mí mismo...
¿Dónde encontrar una descripción más completa de las llamadas de "servicio" y sus parámetros?
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 call
es 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 call
los 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 phone
comando es el número que se ve 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 ahora se desplazan por 1. Todo lo que solía service call phone
realizar 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.
No hay documentación. Pero puede encontrar toda la información que busca en el código fuente de Android. service list
le da el nombre del paquete. Así que para el phone
servicio que es com.android.internal.telephony.ITelephony
. Encontrará todos los parámetros posibles para service call phone
su com/android/internal/telephony/ITelephony.java
versió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.IClipboard
en lugar declipboard
Y si omite --adb, incluso puede ejecutarlo directamente en su teléfono (en Termux).
Este gif está tomado del repositorio :
Vi0
service call
, pero que aún permita hacer muchas cosas desde la consola de superusuario?Forivin