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