Hice un simple shell (en realidad lote de Windows) script que automatiza una tarea en el teléfono Android. Se puede ejecutar en cualquier ordenador. He pensado que si convierto el batch a linux sh
script, podría emitir los comandos sin adb shell
ante ellos.
Así que esto ( .exe
añadido para mayor claridad):
adb.exe shell sleep 1
se convierte en esto:
sleep 1
Bueno, funciona con sleep
en particular, pero no con sendevent
. Hice un script para pulsar y soltar el botón de enfoque:
#!/bin/sh
# Simply send two key events to see if it works (spoiler: it doesn't)
sendevent /dev/input/event0 1 212 1
sendevent /dev/input/event0 0 0 0
sleep 1
sendevent /dev/input/event0 1 212 0
sendevent /dev/input/event0 0 0 0
Pero no puedo ejecutar el sendevent
comandos:
Eso es ridículo. Obviamente mi teléfono es capaz de ejecutar los comandos desde una fuente externa, así que ¿por qué demonios no desde sí mismo? ¿Voy a necesitar un ordenador para trabajar con el shell?
¿Qué puedo hacer para emitir comandos adb a mi propio teléfono? ( No estoy usando un dispositivo rooteado. Los desarrolladores de Android lo han hecho demasiado doloroso).
1 votos
Lo que sea que uses para ejecutar ese shell script no tiene los permisos apropiados para abrir el
event0
archivo de dispositivo. Esto no tiene nada que ver con la posibilidad de ejecutar un comando o no. Esto es especial para ese único comando y puede ser resuelto solicitando los permisos adecuados (permisos Root en ese caso).0 votos
@GiantTree Pues no se puede resolver de la forma que propones, porque mi dispositivo no está rooteado. ¿Se ve bien el texto en negrita en tu dispositivo? La solución que busco es conectarme de alguna manera al servicio adb de mi dispositivo para enviar esos comandos allí, ya que como bien dices mi usado no tiene acceso a los recursos necesarios.
0 votos
He visto que no tienes un dispositivo rooteado. Esto no significa que esos permisos no sean necesarios en tu dispositivo. Lo ideal sería un kernel permisivo, porque en mi dispositivo, ese mismo archivo que has publicado se ejecuta perfectamente sin ningún error.
0 votos
Ahora no entiendo. ¿Estás diciendo que el permiso se puede obtener sin tener el dispositivo rooteado?
0 votos
Lo siento, intento explicarlo: Hay dos modos en los que un kernel puede estar: enforcing (bloqueado, alta seguridad) y permisivo (algo abierto, seguridad media). La mayoría/todos los dispositivos vienen con kernels de tipo enforcing. Para conseguir los permisos necesarios, tienes que hacer Root en tu dispositivo y ejecutar los comandos en un contexto Root (después de
su
) o flasheando un kernel personalizado compilado para el modo permisivo (la mayoría de los cuales hacen Root en su dispositivo o necesitan Root para su gestión de todos modos). Puede que haya otra forma de solucionar tu problema, si es así, abre una nueva pregunta indicando lo que quieres conseguir.0 votos
@GiantTree ¿Por qué iba a abrir una nueva pregunta? Lo que quiero es emitir todos los comandos que funcionan en ADB desde el ordenador directamente en el dispositivo. Esperaba que hubiera una forma de iniciar el cliente ADB en el dispositivo y hacer que se conectara a sí mismo.
0 votos
La mayoría de los dispositivos no se entregan con un
adb
cliente, por lo que no puedes conectarte de nuevo a ti mismo. Entiendo lo que tratas de lograr. Mi idea era, que lo que tratas de lograr con comandos arbitrarios, podría ser posible sin usar esos comandos de entrada. Recuerda queadbd
(el demonio ADB en el dispositivo) se ejecuta con los permisos del sistema pero no los transmite a los procesos hijos, por eso se pueden ejecutar comandos desdeadb
pero no desde un shell script.0 votos
@TomášZato Como ha señalado GiantTree, incluso si pudieras lanzar
adb
en el teléfono y hacer que se conecte a sí mismo, usted no podrá acceder a ese dispositivo event0 . Esto se debe a que el archivo es propiedad de Root y es legible y escribible sólo por el usuario root y el grupo entrada . Cualquier otro usuario no puede hacer absolutamente nada, y hay de ninguna manera para eludir el problema, pero root su dispositivo.0 votos
@DeathMaskSalesman No lo entiendo. Cuál es la diferencia entre conectarse a
adbd
desde el PC y desde el propio teléfono? Sigue siendo el mismo proceso, ¿no? Por favor, ¿podéis explicarlo más o darme algún enlace?0 votos
@TomášZato Es básicamente lo mismo, pero es totalmente doloroso forzarlo y además es inútil. ¿Intentaste emitir el
sendevent
desde su ordenador a través deadb
?0 votos
@DeathMaskSalesman Si funciona perfectamente desde el ordenador. Pero no quiero necesitar el ordenador para crear los eventos. Sigo sin entender por qué no es posible conectarse a teléfonos propios
adb
servicio daemon.0 votos
@TomášZato Todavía lo estoy investigando, pero parece que no podrás iniciar la parte cliente de adb sin permisos Root, ya que no pudo enlazar el puerto 5038.
0 votos
@TomášZato Definitivamente necesitas Root. Los comandos para establecer el puerto para
adbd
para escuchar sonsetprop service.adb.tcp.port 5555
, seguido de unstop adbd
ystart adbd
. Sólo entonces podrásadb connect localhost:5555
y finalmente conseguir que tu dispositivo se conecte a sí mismo.0 votos
@DeathMaskSalesman ¿Y podría poner primero el puerto desde el ordenador, haciendo una puerta trasera que se pueda usar después? Gracias por toda esta ayuda :)
0 votos
@TomášZato No he probado este procedimiento desde un ordenador. Podrías ponerlo en práctica y contarnos el resultado.
0 votos
Relacionado: Ejecutar el comando adb dentro del emulador de terminal o programáticamente sin Root . Nota: mientras tengas el cliente adb en el dispositivo y esté conectado en modo loopback, puedes ejecutar cualquier comando de shell que pudo ejecutar utilizando un PC y adb.