PDA

Ver la Versión Completa : [ TUTORIAL ] Introducción a los comandos de terminal en Tasker


maid450
08/05/13, 11:02:23
Hola a todos!
En este tutorial voy a tratar de explicar un poco los conceptos básicos de los comandos de terminal en Android y como lanzarlos y aprovecharlos en Tasker.

Nota: los conceptos de este tutorial son bastante avanzados, aunque voy a tratar de explicarlo de forma sencilla.
En principio los comandos ejecutados como usuario normal no deberían ser capaces de causar un gran daño (el comando adecuado podría borrar todas tus fotos por ejemplo, pero no dañar al sistema) pero los comandos ejecutados como usuario root permiten hacer cualquier cosa, no ejecutar nada de esta forma si no se confía en la fuente o no se entiende más o menos lo que se está haciendo.

1. ¿Qué son?
Android está basado en linux, un sistema operativo que se caracteriza entre otras cosas por tener un terminal (llamado shell en inglés) muy potente que permite poder controlar casi por completo todo el sistema y obtener información mediante "ordenes" más o menos complejas, estas ordenes se conocen como comandos de terminal.
Los comandos en sí son programas (o ficheros con codigo ejecutable) que se guardan en /system/bin (ahí están los principales, aunque hay otros posibles sitios) así que pueden haber mods que dejen programas ahí y ya estarían disponibles para ejecutar.
Un ejemplo típico es "Busybox" que añade varios comandos comunes de linux y es más que recomendable instalarlo para todo usuario que tenga el telefono rooteado.

2. ¿Para qué sirven?
Como he dicho antes, mediante comandos se pueden hacer muchísimas cosas, aunque casi todo lo que nos pueda interesar puede hacerse mediante acciones normales de tasker.
Sin embargo hay cosas generalmente avanzadas que no se pueden hacer directamente y requieren hacer uso de comandos del terminal.
Como se hacen ciertas cosas y que se puede hacer ya es otra historia, en este aspecto linux es muy diferente a Mac OSX o a Windows, no hay una guia general de linux porque hay muchas variantes con pequeñas y no tan pequeñas diferencias entre si, Android es solo una de estas variantes especialmente adaptada para dispositivos mobiles.
Pero por otra parte la comunidad linuxera destaca por ser muy colaborativa y publicar mucha documentación de tutoriales, soluciones a problemas y demás, asi que no es dificil encontrar recursos si se busca "como hacer XXXXX en android", especialmente si sabes inglés.

3. Ejemplo práctico
Una limitación habitual en tasker es querer controlar si en un momento dado una aplicación está en marcha.

Esto es muy sencillo con aplicaciones "normales" ya que basta con hacer un perfil con el contexto "aplicación -> la aplicación a controlar" y una tarea de entrada que cree una variable %APPX a 1 y en la tarea de salida cambie el valor de la variable a 0.
Sin embargo, en aplicaciones que se puedan quedar en segundo plano esto no funciona, ya que en cuanto la aplicación deja de estar en primer plano, tasker piensa que se ha salido de la aplicación y la variable se pondría a 0.
Sin embargo el sistema operativo si que sabe que la aplicación sigue en marcha, ¡asi que vamos a preguntarle usando comandos!

Antes que nada, para poder lanzar estos comandos hay que tener un emulador de terminal instalado, el más conocido es este: https://play.google.com/store/apps/details?id=jackpal.androidterm, pero cualquiera debería valer.

El comando completo a usar sería este:
cat /proc/$(pgrep %pname$)/oom_adj¡No asustarse! Vamos a explicar por partes que hace este churro.

Primero que nada, Android no usa los nombres típicos por los que conocemos a las aplicaciones a nivel interno, sino lo que se llama el package name, y a nivel aún más interno (lo explicaré luego) el PID.
Para averiguar el package name de una aplicación lo más facil es buscar la aplicación en la web de google play y fijarse en la URL del navegador, el package name es lo que pone entre el "id=" y el primer "&" si lo hay, por ejemplo para el terminal emulator el package name es jackpal.androidterm.
Cuando Android lanza una aplicación le asigna un PID (Process ID) dinámico (si la aplicación muere y se vuelve a lanzar el nuevo PID que le asigne casi seguro que no será el mismo), que es un número que en adelante el sistema usará internamente para el manejo de memoria y más cosas.

Ahora, volviendo al comando, en realidad se trata de un comando dentro de otro, primero que nada habría que reemplazar %pname por el package name de la aplicación que queramos comprobar (para el ejemplo usaremos el propio terminal, recordemos: jackpal.androidterm) y si ejecutamos el comando interno que es

pgrep jackpal.androidtermnos devolverá el PID de la aplicación (en mi caso da 25419, pero a cada uno le puede dar un valor diferente).

Y ahora por fin la explicación del comando completo: se da el caso de que android crea una carpeta por cada proceso en /proc (de ahí su nombre) y dentro de la carpeta de cada proceso entre otras cosas hay un archivo llamado "oom_adj" que solo contiene un numero con el estado de ejecución del mismo.

El comando "cat" simplemente muestra el contenido del archivo que le digas, de modo que cuando ejecutamos
cat /proc/$(pgrep jackpal.androidterm$)/oom_adjprimero resuelve el PID del proceso (recordemos en mi caso 25419), con lo que sería equivalente a ejecutar
cat /proc/25419/oom_adjque devolvería el estado de ejecución de ese proceso.

Para el caso que nos interesa, un "0" significa que está en primer plano y un "2" en segundo plano, cualquier otro valor es que está en otro estado que podemos considerar como inactivo.

Espero no haberos perdido por el camino :risitas: soy consciente que no es el ejemplo más sencillo, pero como digo, para hacer cosas sencillas no suele ser necesario usar el terminal, y he tratado de explicarlo lo mejor posible y no limitarme a soltar el comando y que penseis que hace magia...

4. Usar comandos con Tasker
Tasker tiene predefinida una acción en "Script -> Ejecutar consola" (o "Script -> Run shell" en inglés) que permite ejecutar comandos.
No confundir con las otras acciones en esta categoría:
- "Javascript" y "Javascriptlet" Son casi identicos y sirven para ejecutar código javascript dentro de tasker, no comandos de terminal. Lo cubriré en un proximo tutorial.
- "Ejecutar Script" Sirven para ejecutar código en otros lenguajes (como python o php) hay que instalaer los interpretes con SL4A. Lo cubriré en un proximo tutorial.

En la acción se puede definir el comando a ejecutar (permite usar variables), la cuenta atrás o "timeout" (tiempo máximo de ejecución, si se sobrepasa se cancela la orden, 0 es para infinito), y unas variables para almacenar la "salida" o "output" (lo que devuelve el comando), los "Errores" (posibles mensajes de error si algo va mal) y el "Resultado" (no confundir con la salida, esto es un codigo numérico que indica si la ejecución ha ido bien (devolvería 0) o no (devolvería cualquier otra cosa, depende del comando y el error), este valor no se ve al ejecutar comandos a mano desde el terminal) y tambien se puede marcar si se quiere ejecutar el comando como usuario root o no (hay comandos que necesitan ser ejecutados como root, mantenerlo desactivado siempre que sea posible).
Lo de "continuar tarea en caso de error" es conveniente marcarlo, ya que hay comandos que es normal que no devuelvan un resultado 0: en el ejemplo de antes por ejemplo, si el proceso que buscamos no tiene PID en el momento de ejecutar el comando, el fallará porque intenta mostrar un archivo que en ese momento no existe y si no marcamos esta opción la tarea se pararía y no haría nada más.

5. Comandos habituales / utiles

Nota: los comandos van entre comillas, pero hay que ejecutarlos sin ellas, para los parametros que hay que pasarles (las rutas de directorios, ficheros, etc...) si contienen espacios hay que rodearlos con comillas para que no piense que son varios parametros, por ejemplo cat /sdcard/mi archivo.txt habría que ejecutarlo como cat "/sdcard/mi archivo.txt" y cp /sdcard mi archivo.txt /sdcard/mi otro archivo.txt sería cp "/sdcard mi archivo.txt" "/sdcard/mi otro archivo.txt"


cd: cambia al directorio especificado, por ejemplo "cd /sdcard" situa el directorio actual a la raíz de la tarjeta sd (todos los que hayais vivido la epoca MS-DOS os sonará este X-D)
pwd: devuelve la ruta del directorio actual
ls: devuelve una lista de los ficheros y carpetas del directorio actual, si se le pasa un directorio (por ejemplo "ls /sdcard" devuelve una lista con los directorios y ficheros dentro de esa carpeta)
cp: copia un archivo, hay que pasarle la ruta del archivo origen y el destino, por ejemplo: "cp /sdcard/hola.txt /sdcard/hola2.txt" crea una copia de "hola.txt" y la llama "hola2.txt"
rm: borra un archivo (con este hay que ir con cuidado ;-)) por ejemplo "rm /sdcard/hola.txt"
cat:devuelve el contenido del fichero especificado, por ejemplo si tienes un fichero "hola.txt" en la raiz de la tarjeta SD "cat /sdcard/hola.txt"mostrará el contenido del fichero
grep: filtra una entrada y devuelve solo las lineas que contenga el texto pasado (ver en apartado 6)


Aquí (https://github.com/jackpal/Android-Terminal-Emulator/wiki/Android-Shell-Command-Reference)hay una lista de algunos comandos disponibles en Android.

Este tutorial pretende ser una introducción, los detalles concretos sobre el uso de todos estos comandos se pueden encontrar facilmente por internet

6. Obtener ayuda
Todos los comandos suelen tener una ayuda con una descripción de lo que hace el comando y las distintas opciones si las tiene.
Normalmente para ver esta ayuda se hace escribiendo en un terminal "comando -h" o "comando --help" (un guión cuando es una letra y 2 para la palabra completa).
Si no funciona ninguna de las dos formas (devolverán un error del tipo "no existe la opción" o algo así) algunos comandos muestran la ayuda al escribir el comando a secas, sin ninguna opción ni parametro, ojo no probar esto si un comando, por su nombre, podría tener sentido si se ejecuta sin parametros, ya que podría ejecutarse si hacemos esto.

7. Conceptos avanzadosRedirigir entrada y salida de comandos


- Entrada
Antes hemos visto por ejemplo el comando "cat" que muestra el contenido de un fichero, en el caso del ejemplo era un fichero que solo tiene un numero, pero podría ser un fichero de texto con muchas lineas y te interese solo una linea concreta o solo algunas cosas, para eso hay un comando muy util llamado "grep" que ilustra muy bien como redirigir la salida de un comando a la entrada de otro.


Pongamos un fichero de texto en /sdcard/fechahora.txt con este contenido:

Fecha: 08/05/2013
Hora: 10:00

Si hacemos cat /sdcard/fechahora.txt nos devolverá todo este texto, pero si hacemos cat /sdcard/fechahora.txt | grep Hora lo que pasará es que al poner el "|" entre ambos comandos, hará que el resultado del "cat" (todo el texto) sea la entrada del "grep" y al pasarle a este como parametro "Hora" solo dejará pasar las lineas que contengan la palabra "Hora" y la orden completa nos devolverá Hora: 10:00De esta forma podemos encadenar comandos haciendo que un comando utilice el resultado de otro como entrada

-Salida
Aunque Tasker nos permite con la acción de ejecutar un comando guardarnos su resultado en una variable para hacer con él lo que queramos, a veces nos podrá interesar guardar lo que devuelva un comando en un fichero, esto se puede hacer redirigiendo la salida del comando en vez de a la pantalla a un fichero, y esto se consigue poniendo "> ruta_fichero_destino.txt" despues del comando, por ejemplo, si ejecutamos
ls / > /sdcard/ls.txtno mostrará nada por pantalla, pero lo que se hubiese mostrado (una lista de los directorios y ficheros contenidos en el directorio raíz /) se escribira en un fichero "ls.txt" que se creará en /sdcard.


Si se volviese a ejecutar lo mismo el fichero destino se sobreescribiría con el nuevo contenido, mientras que si ponemos ">>" en vez de ">" hace lo mismo pero en vez de sobreescribir el fichero, añade al final de este el resultado de la nueva ejecución (la primera vez lo crearía si no existiese igualmente)

Es mi primer tutorial (pretendo hacer alguno más con el tiempo si este tiene buena acogida ;-)) así que acepto críticas constructivas sobre si pensais que debo explicar mejor o ahondar en alguna cosa

Juanmiwow
08/05/13, 11:18:49
Brutal! Mil gracias!

Caravantes
09/05/13, 02:36:06
Exelente, Maid, muchas gracias. No me he perdido en absoluto, creo que está muy bien explicado.

Tasker tiene predefinida una acción en "Script -> Run shell" (lo tengo en inglés, no sé como será en español)...

En la versión española (4.0) el grupo también se llama "Script", y la acción se llama "Ejecutar consola" (otras acciones de ese grupo Script son "Ejecutar script", "JavaScript" y "JavaScriptlet").
La acción Ejecutar-consola tiene los siguientes parámetros o elementos especiales (sigo traduciendo para atajar posibles dudas):
- Comando (texto, obligatorio)
- Cuenta atrás en segundos (timeout; por defecto es cero, máximo 120)
- Usar Root (opcional)
- Almacenar Salida En (una variable, opcional)
- Almacenar Errores En (una variable, opcional)
- Almacenar Resultado En (una variable, opcional)
- Continuar Tarea Tras Error (opcional)

Creo que ya lo puedo aplicar al caso que me interesaba. En mitad de una tarea yo quería poner una condición para saber si la app Poweramp estaba funcionando y en tal caso no ejecutar algunas acciones de ajuste de volumen. El package-name es "com.maxmpz.audioplayer".
Creo una tarea de prueba con las siguientes acciones
1 Ejecutar-consola
- Comando: pgrep com.maxmpz.audioplayer
- Almacenar Salida En %salida
- Continuar Tarea Tras Error: activado
2 Si %salida ~ %*
3 Notificación: Poweramp NO encontrado (%salida)
4 Else
5 Notificación: Poweramp SI encontrado (%salida)
6 Fin si (End if)

Lo pruebo antes de ejecutar Poweramp y la notificación dice Poweramp NO encontrado (%salida)
Ejecuto Poweramp y mientras oigo música vuelvo a ejecutar la tarea, obteniendo Poweramp SI encontrado (20687).
Fantástico.
Todavía no es perfecto: cuando paro la música y "cierro" el Poweramp (pulsando atrás), android lo sigue teniendo como activo, con el mismo PID (20687), no sé cuanto rato tiene que pasar para que eso cambie. Puedo quitar el Poweramp de la lista de apps recientes (sistema de conmutación entre tareas que tiene Android4) y entonces ya deja de tener PID (Poweramp NO encontrado).

Tienes todo mi apoyo y ánimo para continuar con más lecciones porque creo que has abierto una veta muy prometedora. Al menos yo estoy muy interesado. Gracias de nuevo.

KchoPrro
09/05/13, 08:29:10
Impresionante, hasta yo que soy un cibercateto lo he entendido! :aplausos::aplausos:

maid450
09/05/13, 09:01:35
Todavía no es perfecto: cuando paro la música y "cierro" el Poweramp (pulsando atrás), android lo sigue teniendo como activo, con el mismo PID (20687), no sé cuanto rato tiene que pasar para que eso cambie.

El tema es que el proceso va a seguir teniendo PID mientras esté en cualquier estado de ejecución, incluyendo algunos estados que para nosotros es que la aplicación está cerrada, pero el sistema los mantiene "latentes" para relanzarlos más rápido en caso necesario

La tarea que has hecho está bien para entender un poco el tema de los PIDs y tal, pero para comprobar si la aplicación está realmente activa o no lo que tienes que ver es el valor que hay en el fichero /proc/%PID/oom_adj y para eso es el comando completo:
cat /proc/$(pgrep jackpal.androidterm$)/oom_adj

si eso devuelve 0 o 2 es que el poweramp está en primer o segundo plano, si devuelve cualquier otra cosa es que está en un estado que podemos considerar como inactivo.

Esto se puede hacer en tasker con un Si %salida ~ 0/2

ATaskREADOS
09/05/13, 13:48:23
Im-presionante!! :aplausos:
Pues no sólo te subimos el tuto al recopilatorio si no que además inaugura sección.

Muchas gracias maid450. :campeon:

FDO: Mlesir.

Caravantes
09/05/13, 21:43:23
La tarea que has hecho está bien para entender un poco el tema de los PIDs y tal, pero para comprobar si la aplicación está realmente activa o no lo que tienes que ver es el valor que hay en el fichero /proc/%PID/oom_adj y para eso es el comando completo:
Código:
cat /proc/$(pgrep jackpal.androidterm$)/oom_adj

Efectivamente, acabo de probarlo de esta forma y parece que funciona perfectamente, muchas gracias.

Caravantes
11/05/13, 01:45:24
Resumiendo y concretando el tema de detectar otra aplicación, para dummies: en una tarea de Tasker podemos saber si otra app concreta está funcionando, ya sea en primer plano o en segundo plano, y dependiendo de eso se pueden tomar decisiones dentro de la tarea. Los detalles son los siguientes.

En primer lugar hay que conocer el nombre que la aplicación tiene dentro de Android. Es lo que técnicamente se llama package name, y la forma más sencilla de obtenerlo es buscar la aplicación en la web de Google play (https://play.google.com/store) y fijarse en la URL del navegador: el package name es lo que aparece tras el "id=" (y antes del primer "&", si es que lo hubiera).
Por ejemplo, para la app Android Terminal Emulator la URL puede ser
https://play.google.com/store/apps/details?id=jackpal.androidterm
(https://play.google.com/store/apps/details?id=jackpal.androidterm) o algo más largo como por ejemplo
https://play.google.com/store/apps/details?id=jackpal.androidterm&feature=nav_result#?t=W251bGwsMSwyLDNd
(https://play.google.com/store/apps/details?id=jackpal.androidterm&feature=nav_result#?t=W251bGwsMSwyLDNd)Pues bien, en ambos casos se ve que el package name es
jackpal.androidterm
De forma similar, debes obtener el package name de la app que tú quieras controlar.

Ya en Tasker, hay que usar la acción (del grupo Script) llamada Ejecutar-consola. En la casilla del Comando ponemos
cat /proc/$(pgrep jackpal.androidterm$)/oom_adj
sustituyendo jackpal.androidterm por el package name de la aplicación que hayas elegido. La acción Ejecutar-consola tiene, más abajo, una casilla rotulada como Almacenar Salida En ; ahí podremos el nombre de una variable que recoja la información devuelta por el comando; por ejemplo podemos escribir %salida.
Y bastante más abajo hay que marcar una opción que lleva el rótulo Continuar Tarea Tras Error.

Con eso ya hemos terminado de configurar esta acción. Cuando la tarea se active, Android ejecutará el comando y devolverá una u otra información según sea el estado de la aplicación. A los efectos que nos interesa, si la app está ejecutándose (en primer o segundo plano) el comando devolverá o bien el valor 0 (cero) o bien el valor 2 (dos). O sea que, a continuación, podemos usar en la misma tarea una condición en base a la variable que hayamos usado, del tipo siguiente
Si(If) %salida ~ 0/2
(Si %salida coincide con cero o dos) que será cierta si la app se está ejecutando. O bien podemos usar una condición del tipo contrario
Si %salida !~ 0/2
(si %salida no coincide con cero o dos) que será cierta si la app no se está ejecutando.

Eso es todo. Si quieres más información, lee este hilo desde el inicio, y/o la página siguiente:
http://www.htcmania.com/showthread.p...95#post7356195 (http://www.htcmania.com/showthread.php?p=7356195#post7356195)

diapa68
12/06/13, 14:15:31
Hola a todos.
Estoy en fase de lectura de este subforo y aprendiendo cosas que por mí solo no he sido capaz de hacer.
He realizado perfiles de los más básicos, pero estoy intentando aprender para cosas más complejas.
Gracias a este hilo he podido hacer lo que hacía tiempo intentaba sin éxito, que al abrir una aplicación que necesite GPS lo active y que cuando salga lo desactive. El problema lo encontraba cuando se quedaba la aplicación en segundo plano y desactivaba el GPS.

Solucionado gracias a este aporte!!!!

Lo dicho, seguiré leyendo, aprendiendo y agradeciendo. Y si algún día puedo, aportando.

Caravantes
12/06/13, 17:33:06
Estoy en fase de lectura de este subforo

Hola Diapa. Bienvenido al foro de Tasker.
Si todavía no lo has hecho, te sugiero la lectura de las "Recomendaciones para participar"
http://www.htcmania.com/showthread.php?p=8982303

Nos alegramos de que aquí encuentres cosas interesantes, y de que lo comentes.

diapa68
13/06/13, 13:41:06
Puesto manos a la obra, me he encontrado un problema.
Con una aplicación, ejecuto el comando en la consola, lo guardo en una variable (%salida) y lanzo un flash con texto %salida. Como tarea de salida de la aplicación, lanzo otro flash con la misma variable para esperar el 2 cuando esté en segundo plano.
Cuando abro la aplicación me da 0 en el flash. Hasta ahí bien, pero cuando le doy al botón home para ir al escritorio y dejarla en segundo plano (queda el icono en la barra de notificaciones y la apli sigue corriendo -es un informador de radares- y funcionando) el flash que me lanza es %salida. No hay 2 con lo que no me apaga el gps cuando le pongo el condicionante "si %salida es distinto a 0/2" apaga gps.

¿?¿?¿?

Saludos.

mlesir
13/06/13, 16:39:36
Aunque yo este script no lo controlo te aconsejaría que hagas lo q se debe hacer siempre que algo no funciona: probar todas las partes de manera aislada.
Primero prueba el script por si solo a ver si efectivamente te detecta q la app esta en segundo plano.
Luego las distintas partes del perfil, puedes ir poniendo pop up con las variables que utilices como texto del pop up, para ir viendo q valores van tomando. De esta manera sabrás que parte es la que falla.

maid450
13/06/13, 18:30:52
el flash que me lanza es %salida. No hay 2 con lo que no me apaga el gps cuando le pongo el condicionante "si %salida es distinto a 0/2" apaga gps.
Hola diapa68, entiendo que quieres decir que si que apaga el GPS cuando no debería ya que "%salida" es distinto a 0/2 y la aplicación aún sigue en ejecución...

Cuando el valor de %salida es "%salida" significa que la variable no está definida, y si se ha ejecutado el comando esto solo puede pasar en caso de que el comando devuelva un error.
En principio no tiene porqué ser malo ya que una de las posibilidades al ejecutar el script es que la aplicación objetivo no esté en ningún estado de ejecución y por tanto no exista el fichero "/proc/xxxxx/oom_adj" y devolvería un error (por eso en la acción hay que marcar "continuar tarea tras error") aunque si la app está en segundo plano esto no debería pasar y el error podría ser otra cosa debido a que haya algo mal.

Lo que puedes hacer para encontrar el error es:
- lanzar la aplicación en cuestión.
- salir sin cerrarla, dejándola en segundo plano
- abrir el emulador de terminal (en el primer post recomiendo uno)
- lanzar el comando manualmente (copia el comando desde tasker y pegalo en el emulador de terminal)

Así verás lo que devuelve el comando, y si es un error debería describir que es lo que pasa.
Ya comentas que tal!

diapa68
14/06/13, 08:54:47
Bueno, pues un problema solucionado. Gracias por las respuestas, al leerlas se me ocurrió la solución.
Explico:
Tenía como evento "aplicación-CamSam" (informador de radares)
Como tareas:
1. GPS on
2. Ejecutar consola (comando para que mandara la respuesta a %camsam, continuar tarea tras error: activado)
3. Flash %camsam

Al abrir la apli todo bien y flash informando un 0.

Como tareas de salida (aquí estaba el error)
1.Flash %camsam (para verificar el cambio)
2.Si %camsam es distinto que 0/2
3.GPS off
4.Fin si

Me daba error: cuando la ponía en segundo plano el flash me marcaba "%camsam" y no el 2 esperado. Por lo consiguiente, me apagaba el GPS cuando no era lo que quería.

Con vuestras respuestas caí en que el cambio en la variable no se producía a 2 porque simplemente no había vuelto a ejecutar en la consola el comando (ví, como aconsejabais, que con la apli en segundo plano y abriendo el terminal me respondía con el 2 pero en la variable no lo cambiaba)

Solución:

Como tarea simplemente GPS on

Tareas de salida:
1.Ejecutar consola (comando para que mandara la respuesta a %camsam, continuar tarea tras error: activado)
2.Si %camsam es igual que 0/2
3.GPS on
4.Else
5. GPS off
6. Fin si

Y a funcionar perfectamente.


Muchas gracias!!!!!

Problema nuevo: cuando quiero hacer lo mismo con el Endomondo no me ejecuta bien el comando. Tengo la sensación que el nombre que da el Google Play en su URL no es el correcto para el comando porque da error cuando lo ejecuto directamente en el terminal teniendo el Endomondo abierto.

Hay alguna manera de ver qué aplicaciones corren en segundo plano con el Tasker?? porque esa sería otra solución.

Muchas gracias. La verdad es que me apasiona el Tasker y quiero sacarle todo el jugo que pueda, pero estoy todavía muy verde.

diapa68
18/06/13, 11:41:21
Hay algún comando que me diga qué aplicaciones hay en segundo plano? Es que con el Endomondo no hay forma que funcione el comando que me da la URL del Google Play.
Gracias.
Saludos.

maid450
18/06/13, 12:18:46
Hay algún comando que me diga qué aplicaciones hay en segundo plano? Es que con el Endomondo no hay forma que funcione el comando que me da la URL del Google Play.
Puedes usar el comando "ps" que devuelve información de todos los procesos en ejecución.
Sale mucha morralla del sistema, pero también salen los programas en ejecución en primer o segundo plano.

diapa68
18/06/13, 12:30:59
Puedes usar el comando "ps" que devuelve información de todos los procesos en ejecución.
Sale mucha morralla del sistema, pero también salen los programas en ejecución en primer o segundo plano.

Muchas gracias. Iba a editar mi comentario, pues leyendo en Noticias, sugerencias... he visto que hay un plugin de App locale condition. Había visto esta app pero, aunque el pago era ridículo, no la había comprado por si no era lo que necesitaba, pero creo que podría valerme. De todas formas probaré ese comando y usar variables y de paso aprendo.

Saludos.

UnicornioNegro
19/06/13, 16:29:25
Acabo de leerlo, y está muy bien explicado, los que estamos aprendiendo un poco a usar tasker te lo agradecemos...

Caravantes
20/06/13, 00:34:53
los que estamos aprendiendo un poco a usar tasker te lo agradecemos

Hola Unicornio. Creo que no te he visto antes por aquí. Bienvenido al foro de Tasker. Si todavía no lo has hecho, te sugiero la lectura de las "Recomendaciones para participar"
http://www.htcmania.com/showthread.php?p=8982303

mlesir
16/08/13, 22:05:58
sqlite3 /data/data/com.whatsapp/databases/wa.db "SELECT jid FROM wa_contacts WHERE unseen_msg_count>'0' ORDER BY id DESC ;"

Alguien sabría decirme como hacer en este tipo de sentencias para que los resultados me los devuelva separados por comas, o por otro signo?
Es que los devuelve pero separados por intro y eso tasker no lo detecta.

maid450
17/08/13, 00:17:19
Prueba así:

sqlite3 /data/data/com.whatsapp/databases/wa.db "SELECT jid FROM wa_contacts WHERE unseen_msg_count>'0' ORDER BY id DESC ;" | awk '{printf("%s,",$0)}'

Puedes reemplazar la coma de “%s," por el símbolo que quieras.

mlesir
17/08/13, 01:06:29
Maid como siempre perfecto. Funciona. Menos mal que te tenemos a ti pq aunque hay cosas con el sql3 de pepelolo, q solo ha sido cuestión de sentido comun y trabajo, eso q has puesto tu no lo saco ni de coña.
Gracias por la rapidez.

darkopro
16/10/13, 19:15:43
No consigo sacar el PID de una aplicación. Me sale perfectamente de del ejemplo (terminal emulador) pero cuando intento ejecutar el código en otra no me sale, no se que hago mal. Esta es la aplicación en cuestión:
http://img.tapatalk.com/d/13/10/17/5aqy5ady.jpg

Y este el código que ejecuto en la consola:
cat /proc/$(pgrep com.sportstracklive.android.ui.activity.pro$)/oom_adj

No entiendo a que se debe

Caravantes
16/10/13, 23:59:53
Y este el código que ejecuto en la consola:
cat /proc/$(pgrep com.sportstracklive.android.ui.activity.pro$)/oom_adj

Según yo interpreto (leyendo el primer mensaje de este hilo), para obtener el PID de la aplicación, el comando que debes usar es
pgrep com.sportstracklive.android.ui.activity.pro

darkopro
17/10/13, 08:02:04
Según yo interpreto (leyendo el primer mensaje de este hilo), para obtener el PID de la aplicación, el comando que debes usar es
pgrep com.sportstracklive.android.ui.activity.pro

Con ese comando tampoco, estoy echo un poco lío porque hay varios comandos que estoy probando en la consola copiados de estos hilos que no me funcionan...

mlesir
04/02/14, 22:06:11
Necesitaría saber como agregar más comandos a mi android. En concreto necesitaría el icnv o convmv. Algo para cambiar la codificación de un texto. El problema es que debe estar codificado de una manera que cuando lo abro con con ciertos visores de texto o (lo más importante) cuando lo leo con la acción de Tasker de Leer archivo, las tildes salen como ? dentro de un rombo. Cuando lo abro como webview se ve bien. Así que había pensado que quizá pudiera cambiarlo con algunos de estos comandos.
Además de este comando que es el que necesito en concreto me gustaría saber como incorporar más. Esta claro que la forma más sencilla es con busybox pero no vienen algunos. Hay algún sitio donde descargar las applet? (no se si empleo bien el termino applet), algún repositorio?

binlalo
05/02/14, 00:27:28
Gran tutorial! Pero hay una cosilla que estoy buscando y no aparece, a ver si me podéis echar un cable.
Estoy intentando montar la tarjeta SD, la dificultad es que la tarjeta va dentro de un lector de tarjetas que se engancha por micro usb aprovechando la función USB-OTG del Moto G.

Para mayor dificultad, la función de auto-montar los almacenamientos externos conectados está rota (deliberadamente por google) en android 4.4.2, es por ello que necesito una manera de montarlo (con la app stickmount me va pero prefiero un comando para montarlo en una dirección específica, no donde le da la gana a la aplicación).

Por lo que he leído por ahí tengo que usar un comando que sería algo así:
"mount -o rw /dev/block/sdc /storage/emulated/0" o "mount -o rw -t vfat /dev/block/sdc /storage/emulated/0"

/dev/block/sdc es la localización de la tarjeta (o eso creo porque es la carpeta que aparece en /dev/block/ cuando la enchufo) y /storage/emulated/0 es donde estaba intentando que montase las carpetas que contiene la tarjeta. Lo de -t y vfat no tengo ni idea de lo que es pero salía por ahí. jajaja

Sea como sea, no me funcionan ninguno de los dos comandos, qué estoy haciendo mal??
Gracias, es que me estoy volviendo loco...

maid450
05/02/14, 07:26:55
Por lo que he leído por ahí tengo que usar un comando que sería algo así:
"mount -o rw /dev/block/sdc /storage/emulated/0" o "mount -o rw -t vfat /dev/block/sdc /storage/emulated/0"
/dev/block/sdc es la localización de la tarjeta (o eso creo porque es la carpeta que aparece en /dev/block/ cuando la enchufo) y /storage/emulated/0 es donde estaba intentando que montase las carpetas que contiene la tarjeta. Lo de -t y vfat no tengo ni idea de lo que es pero salía por ahí. jajaja
Sea como sea, no me funcionan ninguno de los dos comandos, qué estoy haciendo mal??
Gracias, es que me estoy volviendo loco...

El "-t vfat" es para forzar a que el sistema de archivos de lo que estás montando es FAT, si no lo pones tratará de detectarlo de forma automática.
Aseguraté de que lo estás intentando como root. ¿Las pruebas las estás haciendo desde un emulador de terminal o directamente desde Tasker?
Te recomiendo que pruebes primero desde un emulador de terminal, es más facil ver si hay errores, para lanzar comandos root desde el emulador hay que usar el comando "su" que cambia el usuario a root, y el resto de comenados ya se ejecutará así.

binlalo
05/02/14, 12:59:09
El "-t vfat" es para forzar a que el sistema de archivos de lo que estás montando es FAT, si no lo pones tratará de detectarlo de forma automática.
Aseguraté de que lo estás intentando como root. ¿Las pruebas las estás haciendo desde un emulador de terminal o directamente desde Tasker?
Te recomiendo que pruebes primero desde un emulador de terminal, es más facil ver si hay errores, para lanzar comandos root desde el emulador hay que usar el comando "su" que cambia el usuario a root, y el resto de comenados ya se ejecutará así.

He probado poniendo en el terminal: su mount -o rw -t vfat /dev/block/sdc /storage/emulated/0 (también sin -t vfat y con sdcard como destino) y me salta bad option. Qué puede ser? (lo que sí me ha saltado es lo de darle permisos root al emulador).

mlesir
06/02/14, 02:28:26
Mi pequeño aporte a el post de Maid sobre los comandos de consola:

Comando rsync

Este comando sirve para sincronizar entre archivos o carpetas. Si modificas un archivo, el archivo de destino tras utilizar este comando sera igual al de origen. Con carpetas tambien funciona.

Sintaxis:

[comando "rsync"] [opciones] [ruta de origen] [ruta de destino]

Un ejemplo:
rsync -r --ignore-existing /ruta/de/origen /ruta/de/destino

La opcion -r es quiere decir recursivo, lo cual quiere decir q incluya a las carpetas que esten el origen y los archivos que contengan.
La opcion --ignore-existing quiere decir que ignore los archivos que ya esten en origen. O sea que solo nos mete en destino los q hayamos creado nuevos en origen. Los q ya estaban no los toca.

Mas informacion sobre el comando aqui:

Documentacion en pagina oficial: (en ingles)

http://rsync.samba.org/ftp/rsync/rsync.html


http://daviddgs.wordpress.com/2013/05/30/como-realizar-copias-de-seguridad-en-gnulinux-con-el-comando-dd-y-rsync/

y aqui:

http://www.linuxcolombia.com.co/?q=node/14

Que yo sepa no hay ningun plugin q sincronice las carpetas que queramos no? Si eso es asi alguien podria lanzarse a hacer un plugin de esto. No manejabas la idea de hacer uno tu Maid o me confundo de persona.
Por ultimo decir q supongo q este comando lo tenemos todos y que segun dicen para emplearlo ni siquiera hay que ser root . Otra cosa importante son los permisos de lectura q tengamos en los archivos o carpetas q pueden determinar q funcione o no este comando.
Por cierto Maid si pudieras echarle un ojo a mi post anterior genial. Sobre todo por lo del sitio donde poder descargar comandos.

maid450
06/02/14, 08:53:58
Uso bastante el rsync en mi ordenador linux de casa, aunque en android no lo tengo...
Tengo entre mis planes hacer algun plugin de Tasker algun día (aunque por temas laborales/personales a este paso me veo que no voy a poder ponerme nunca a ello :cry:) pero no sobre sincronizar carpetas...
Sobre tu post anterior, los comandos son en realidad mini-aplicaciones que se pueden lanzar desde consola, y más que algun repositorio o algo así, que hay varios para distintas distribuciones linux, pero no para android que yo sepa, lo mejor es que si encuentras algun comando/utilidad linux que te interesa busques en la play store o por internet si hay versión para android.

Por cierto, de casualidad he econtrado esto (https://github.com/jackpal/Android-Terminal-Emulator/wiki/Android-Shell-Command-Reference), que tal vez te interese, lo añado al primer post.

Caravantes
06/02/14, 15:35:45
Comando rsync
Este comando sirve para sincronizar entre archivos o carpetas. Si modificas un archivo, el archivo de destino tras utilizar este comando sera igual al de origen. Con carpetas tambien funciona.

A ver si lo he entendido: este comando rsync es similar al comando de copiar archivos (cp)... pero sirve para el caso de que el origen y/o el destino están en otro ordenador/servidor. ¿Es eso?

mlesir
06/02/14, 17:53:13
De Pues si te tengo que contestar yo lo q te diga cógelo con pinzas. Por lo que leí rsync si puede hacer eso que dices. Pero básicamente se emplea para guardar cambios que has hecho en un documento en otro. Te pongo un ejemplo que yo mismo he comprobado:
Tienes dos documento de texto, A y B.
En tasker pones un contexto de archivo modificado (el documento A). Tarea de entrada rsync /ruta/de/A /ruta/de/B.
Cada vez que escribas, borres, etc algo en A y lo guardes automáticamente se guardará en B.
Si lo haces con carpetas cada vez que añadas un archivo se añadirán en la carpeta B.
Por lo que se el comando cp (copy) es mucho menos potente, mucho más lento, y este tiene más opciones. Por ejemplo lo de ignorar si existe ya creo q no lo tiene cp. La lista de opciones esta en la página oficial y es larguiiiisima. Rsync es más eficiente pq solo añade lo nuevo copy. si no me equivoco lo rehace o sobreescribe otra vez todo.
Gracias Maid por el enlace le echaré un vistazo detenidamente. Lo que te dije de "descargar" comandos era porque pensé que funcionaria cómo sql3 que lo metías en bin y listo (bueno listo y rezar para q no haya problemas jeje). Pensé q seria así con el resto pero debe ser más complicado.

mlesir
18/02/14, 16:35:01
Aquí os dejo una alternativa a busybox que permite añadir mas comandos a nuestro arsenal. El enlace es un artículo en xda developers:

http://www.xda-developers.com/android/expand-the-commands-list-on-android/

Lo que sería interesante es poder combinar ambos aunque no se si se podrá.

maid450
19/02/14, 08:40:10
Aquí os dejo una alternativa a busybox que permite añadir mas comandos a nuestro arsenal. El enlace es un artículo en xda developers:
http://www.xda-developers.com/androi...st-on-android/
Lo que sería interesante es poder combinar ambos aunque no se si se podrá.
Parece interesante, a ver si le echo un vistazo.
Por lo que he visto de momento está pensado especialmente para que no cree conflictos con busybox, por ello hay que llamar a todos los comandos con "cu." delante para que no coincida con el nombre con busybox.

gelorio
18/08/14, 14:38:00
Hola maid450, he leido uno de tus temas sobre el Teminal Emulator y sus comandos, y he pensado que podrias ayudarme. Bueno no te quiero aburrir, pero mi movil Android no tiene montada la particion de almacenamiento interna por un error formateando, y no puedo solucionarlo. Investigando por el foro, he encontrado este tema y como veo que dominas el asunto me he decidido a preguntarte. Para que te hagas una idea del asunto, te mando unas capturas.
No se si se podra montar desde el terminal.
Un saludo.

Rsc
14/11/16, 11:11:56
Buenas, estoy tratando de utilizar el comando ls -lt para listar el contenido de una carpeta, organizado por fecha de modificación, pero me da error al ejecutarlo desde la acción de Tasker ejecutar consola.

El caso es que ese mismo comando lo ejecuto desde la app Terminal, y funciona sin ningún problema.

Aclarar que la carpeta en cuestión, se encuentra ubicada en el sistema y marco el check de Usar Root

Voy a lanzar la consulta en este hilo, ya que está dedicado exclusivamente a la línea de comandos en vez de abrir un hilo nuevo, a ver si alguien sabe a que se debe este problema. Un saludo.

SmartPhoneLover
14/11/16, 12:27:58
Buenas, estoy tratando de utilizar el comando ls -lt para listar el contenido de una carpeta, organizado por fecha de modificación, pero me da error al ejecutarlo desde la acción de Tasker ejecutar consola.

El caso es que ese mismo comando lo ejecuto desde la app Terminal, y funciona sin ningún problema.

Aclarar que la carpeta en cuestión, se encuentra ubicada en el sistema y marco el check de Usar Root

Voy a lanzar la consulta en este hilo, ya que está dedicado exclusivamente a la línea de comandos en vez de abrir un hilo nuevo, a ver si alguien sabe a que se debe este problema. Un saludo.

Yo uso 'ls -lrt'

Rsc
14/11/16, 12:40:52
Gracias por contestar, si no me equivoco, ese hace lo mismo pero lo organiza de mayor a menor antigüedad, de igual forma tampoco me funciona en Tasker

danko9696
14/11/16, 15:14:41
Gracias por contestar, si no me equivoco, ese hace lo mismo pero lo organiza de mayor a menor antigüedad, de igual forma tampoco me funciona en Tasker
¿Qué versión de Android tienes? ¿Te funcionan otros comandos? ¿Es con la acción de Tasker o con javascript?

Rsc
14/11/16, 15:38:59
Tengo android 6.0.1, y si me funcionan otros comandos, por ejemplo, ls, que únicamente lista el contenido de la carpeta funciona perfectamente.

Y si, lo hago desde la acción de Tasker "ejecutar consola", y como comentaba, desde la app terminal, no me da error. La verdad que es bastante raro...

Por cierto, este es el error:

16.17.41/E Ejecutar consola: %Avatar -> %Avatar
16.17.41/E Ejecutar consola: ->
16.17.41/E Ejecutar consola: ->
16.17.41/Shell runBackground ls -lt /data/data/com.whatsapp/files/Avatars/ root: true timeout: -1
16.17.41/Shell start process-thread ID 292
16.17.41/E add wait type Shell3 time 2147483647
16.17.41/E add wait type Shell3 done

danko9696
14/11/16, 16:10:16
Tengo android 6.0., y si me funcionan otros comandos, por ejemplo, ls, que únicamente lista el contenido de la carpeta si funciona.

Y si, lo hago desde la acción de Tasker "ejecutar consola", y como comentaba, desde la app terminal, no me da error. La verdad que es bastante raro...
He probado y tampoco me funciona, aunque sí con -l a secas. Al parecer la opción de ordenar no está soportada pero sí debería funcionar teniendo instalado busybox (que sí tengo). Así que ni idea.

Y ya que tienes Android 6.0 ¿podrías probar a ver si te funciona el comando shell desde javascript?, porque a mi no me funciona ningún comando (sí que lo hacía en mi anterior móvil con 5.1), lo que es un fastidio bastante gordo.

Rsc
14/11/16, 17:30:33
Y ya que tienes Android 6.0 ¿podrías probar a ver si te funciona el comando shell desde javascript?, porque a mi no me funciona ningún comando (sí que lo hacía en mi anterior móvil con 5.1), lo que es un fastidio bastante gordo.

No sabía que se podían ejecutar comandos desde la acción javascript, entiendo que se escribe el código exactamente igual que si lo escribiera en la acción ejecutar consola? o tengo que añadir o modificar algo?

Por lo pronto, copiando el código tal cual, no funciona tampoco.

WillyWeb
14/11/16, 17:47:10
No sabía que se podían ejecutar comandos desde la acción javascript, entiendo que se escribe el código exactamente igual que si lo escribiera en la acción ejecutar consola? o tengo que añadir o modificar algo?

Por lo pronto, copiando el código tal cual, no funciona tampoco.

El manual de usuario de Tasker tiene un apartado dedicado a JavaScript...

http://tasker.dinglisch.net/userguide/en/javascript.html

En esencia casi todas las acciones de Tasker tienen un equivalente en forma de función de JavaScript. El equivalente a "Ejecutar consola" es la función "shell"...

shell

var output = shell( str command, bool asRoot, int timoutSecs )

Run the shell command command.

danko9696
14/11/16, 18:09:42
No sabía que se podían ejecutar comandos desde la acción javascript, entiendo que se escribe el código exactamente igual que si lo escribiera en la acción ejecutar consola? o tengo que añadir o modificar algo?

Por lo pronto, copiando el código tal cual, no funciona tampoco.
Prueba por ejemplo con :

// Inicio script
var v_res = shell("list users","1",4); // He puesto "list users" porque es un comando sencillo y no requiere ruta, que van ligeramente distintas, pero se puede probar con cualquier otro.
popup("Test uso comandos", v_res,0,"","PopupGrande",50); // donde pone PopupGrande usar cualquiera de una escena que usemos al efecto con la acción Popup de Tasker
// Fin script

También se puede prescindir de la linea con el popup y usar a continuación una acción de Tasker para mostrar la variable %v_res

Rsc
14/11/16, 19:07:02
El manual de usuario de Tasker tiene un apartado dedicado a JavaScript...

Gracias, tengo en cuenta ese hilo y esas una de mis tareas pendientes, pero por lo pronto no le he podido dedicar mucho tiempo, y no soy capaz de comprender la sintaxis del lenguaje.

Prueba por ejemplo con :

// Inicio script
var v_res = shell("list users","1",4); // He puesto "list users" porque es un comando sencillo y no requiere ruta, que van ligeramente distintas, pero se puede probar con cualquier otro.
popup("Test uso comandos", v_res,0,"","PopupGrande",50); // donde pone PopupGrande usar cualquiera de una escena que usemos al efecto con la acción Popup de Tasker
// Fin script

También se puede prescindir de la linea con el popup y usar a continuación una acción de Tasker para mostrar la variable %v_res


Gracias de nuevo, he probado a hacer eso y tampoco funciona, pero te digo lo mismo que a WillyWeb, no comprendo el lenguaje de javascript y soy incapaz de hacer nada que no sea copiar y pegar el código tal y como tu lo has puesto, no se si debía de poner la ruta entre las comillas, dejarlo tal cual...

En lo que se refiere al error que he comentado al inicio, de que no se ejecuta los comandos al añadir -lt, o cualquier comando que ordene una lista de archivos, Pent me ha contestado de que a el tampoco le funciona, y que intentará implementarlo en la siguiente actualización.

Así que por lo pronto se ve que es una limitación de Tasker.

danko9696
14/11/16, 19:31:50
Gracias de nuevo, he probado a hacer eso y tampoco funciona, pero te digo lo mismo que a WillyWeb, no comprendo el lenguaje de javascript y soy incapaz de hacer nada que no sea copiar y pegar el código tal y como tu lo has puesto, no se si debía de poner la ruta entre las comillas, dejarlo tal cual...

En lo que se refiere al error que he comentado al inicio, de que no se ejecuta los comandos al añadir -lt, o cualquier comando que ordene una lista de archivos, Pent me ha contestado de que a el tampoco le funciona, y que intentará implementarlo en la siguiente actualización.

Así que por lo pronto se ve que es una limitación de Tasker.
El código debería funcionar con copiar y pegar, salvo quizás lo de "PopupGrande", prueba con este código:

// Inicio script
var v_res = shell("list packages","1",4); // He puesto "list packages" porque no requiere ruta, que van ligeramente distintas, pero se puede probar con cualquier otro.
popup("Test uso comandos", v_res,0,"","Popup",50);
// Fin script

Si me confirmas que no te funciona enviaré un correo al soporte técnico, además de paso para pedir soporte para plugins dentro de javascript si es posible, que en 5.x lo único que no se podía. El resto creo que todo se puede hacer desde js.

Rsc
14/11/16, 19:44:32
Copiado y pegado tal cual, me da el siguiente error:

19.43.40/Utils / Inicio script
var v_res = shell("list packages","1",4); / He puesto "list packages" porque no requiere ruta, que van ligeramente distintas, pero se puede probar con cualquier otro.
popup("Test uso comandos", v_res,0,"","Popup",50);
/ Fin script doesn't exist

En el error solo sale una / delante de los comentarios, pero en el código esta correcto.

danko9696
14/11/16, 19:52:43
Copiado y pegado tal cual, me da el siguiente error:

19.43.40/Utils / Inicio script
var v_res = shell("list packages","1",4); / He puesto "list packages" porque no requiere ruta, que van ligeramente distintas, pero se puede probar con cualquier otro.
popup("Test uso comandos", v_res,0,"","Popup",50);
/ Fin script doesn't exist

En el error solo sale una / delante de los comentarios, pero en el código esta correcto.
Creo que es porque has usado la acción de Tasker Javascript cuando deberías haber usado la acción JavaScriptlet. La primera espera que le indiques la ruta a un archivo de texto conteniendo el código js mientras que con la segunda pegas el código dentro de Tasker en el apartado Code (el resto de apartados sin tocar), que es lo que deseamos hacer en este caso.

Rsc
14/11/16, 20:42:33
Cierto, había usado Javascript en vez de Javasceiptlet, aun así, al ejecutar la acción correcta me devuelve la variable %v_res vacia

danko9696
14/11/16, 20:46:21
Cierto, había usado Javascript en vez de Javasceiptlet, aun así, al ejecutar la acción correcta me devuelve la variable %v_res vacia
Como no lo mencionas supongo que no salta ningún popup, ¿correcto?.

Rsc
14/11/16, 22:20:34
El Popup sale, pero solo figura el titulo. También lo he intentado con la acción flash para mostrar la variable

danko9696
14/11/16, 22:47:46
El Popup sale, pero solo figura el titulo. También lo he intentado con la acción flash para mostrar la variable
Thx, eso es lo que quería saber. Ya he enviado un correo a soporte preguntando pero luego he mirado un poco lo que viene en la próxima versión y al menos parte de lo que me interesa quedaría solucionado, asumiendo que también se añadirá una instrucción en JS:
* action File / SQL Query: local DB file queries

Rsc
14/11/16, 23:48:34
Bueno, estaré atento al hilo de JS, a me entero por lo menos de lo más básico. Un saludo

danko9696
15/11/16, 12:51:49
Thx, eso es lo que quería saber. Ya he enviado un correo a soporte preguntando pero luego he mirado un poco lo que viene en la próxima versión y al menos parte de lo que me interesa quedaría solucionado, asumiendo que también se añadirá una instrucción en JS:
* action File / SQL Query: local DB file queries
Ya he recibido respuesta y el problema estaba en mi sintaxis. Cuando uso:
var v_res = shell("list packages","1",4);

El valor "1" (usar root o no) funciona perfectamente bajo 5.1, lo mismo que usar 1 (sin comillas), "0" y 0. Pero el mismo script sin tocar no me funcina bajo Android 6.0, solo vale usar true o false. O sea:

var v_res = shell("list packages",true,4);
var v_res = shell("list packages",false,4);

sí me funcionan bajo 6.0. No sé porqué usar valores numéricos (que es como lo tenía en todos mis scripts) funciona bajo 5.1 pero no en 6.0.