2 votos

¿Cómo "pasar" un archivo del PC a Android y viceversa utilizando las directivas 'exec-in' y 'exec-out'?

Puedo hacerlo:

adb exec-in "gzip > sdcard/test.gz" < C:\test.txt
adb exec-out cat sdcard/test.gz > C:\test.gz

La cuestión es cómo hacer algo así:

adb exec-in "gzip > C:\test.gz" < C:\test.txt

Es decir, ¿cómo puedo utilizar un archivo en mi PC como entrada para algún programa de Android (linux) y utilizar otro archivo en mi PC como salida SIN guardar ningún dato en la memoria interna de Android (flash, microSD, etc)?

0 votos

exec-in y exec-out sólo puede escribir/leer en/desde ficheros, no en STDOUT/STDIN: Android.googlesource.com/platform/system/core/+/ . Sin embargo, puede utilizar shell: adb shell gzip >C:\test.gz <C:\test.txt . Esto no escribirá nada en el dispositivo Android. Sin embargo, este no es el método recomendado. Algunos caracteres no deseados pueden ser incluidos al leer/escribir en el terminal. Por cierto, ¿qué comando de Android quieres usar en el PC? ¿Por qué no lo tienes en el PC?

0 votos

La orden adb shell gzip >C:\test.gz <C:\test.txt crea un test.gz que es igual que test.txt no un archivo. También se cuelga el intérprete de comandos (es necesario pulsar Ctrl+C). Gracias por la información, que exec-in y exec-out no puede utilizar STDOUT/STDIN.

0 votos

Correcto, ese sería el caso si estás en Windows PC. El manejo de Windows de las cosas relacionadas con el terminal es pobre. adb no reenviaría los datos leídos desde test.txt a STDIN de shell (/system/bin/sh )`. Acabo de probarlo en Linux/Android y funciona.

1voto

user3528651 Puntos 1

Mi post es más un comentario que una respuesta (pero no puedo comentar). Todos mis comentarios a continuación abordan sólo el caso de Windows adb host.

adb shell gzip >C:\test.gz <C:\test.txt probablemente funciona sólo porque el archivo de entrada es un archivo de texto.

adb shell gzip >C:\test.gz <C:\test.bin falla porque la llamada a la función de lectura de Windows en adb deja de leer en cuanto se lee el byte 0x1A (ctrl+Z). Este es el modo de operación de texto por defecto de la función de lectura de Windows. La solución utilizada por exec-in y exec-out es llamar a _setmode() para configurar la escritura y lectura de descriptores de archivo en modo binario.

Por desgracia, la mayoría de las veces <test.bin adb exec-in "cat - > sdcard/test.bin" falla también para la versión de adbd < 1.0.41 (es decir, cualquier cosa por debajo de Android 10). La causa es probablemente algunos problemas de condición de carrera en el código usb.cpp de adbd.

Android 10 soluciona esto con la implementación de FFS sin bloqueo y <test.bin adb exec-in "cat - > sdcard/test.bin" funciona con Windows (probado con LineageOS 17.1 + Windows 10)

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X