Ya vi algunas respuestas relacionadas con esto, pero no me llevaron a una respuesta definitiva, así que intentaré nuevamente.
Básicamente, mi pregunta es: ¿cómo puedo ejecutar aplicaciones Ubuntu Touch desde la línea de comandos, específicamente, para poder depurarlas gdb
?
Más detalles:
Primero, lo que eso significa es que me gustaría ejecutarlos desde una conexión shell remota a un dispositivo (teléfono/tableta) en una PC, ya sea desde adb shell
o phablet-shell
(consulteHackear Ubuntu Touch, Parte 5: adb shell versus phablet-shell). ya tengo elAplicación de terminal, pero, dado que no se puede establecer un (VNC) adecuadoconexión de escritorio remoto a un sistema Ubuntu Touch, - me resulta de poca utilidad, ya que realmente no puedo trabajar con él (aunque todavía no he probado un teclado Bluetooth conectado a un dispositivo).
En segundo lugar, me gustaría, si es posible, ejecutar aplicaciones en primer plano; luego, cuando se llama desde la línea de comando de la terminal, esperaría que las aplicaciones volcaran sus impresiones estándar a la terminal. Así, la recomendación enUbuntu Touch: ¿Cómo ejecuto una aplicación de Ubuntu Touch desde la terminal?No puedo usar mucho, ya que (esto es de un BQ E5 (Ubuntu 15.04, OTA-10.1)):
phablet@ubuntu-phablet:~$ ubuntu-app-list
ubuntu-system-settings
com.ubuntu.calculator_calculator_2.0.233
phablet@ubuntu-phablet:~$ ubuntu-app-launch com.ubuntu.calculator_calculator_2.0.233
phablet@ubuntu-phablet:~$
... simplemente inicia la aplicación en segundo plano y sale inmediatamente. Y AFAICS,webapp-container
simplemente abre una URL en el navegador, no ejecuta aplicaciones arbitrarias.
Algunas de las aplicaciones preinstaladas aparentemente son ejecutadas por un programa qmlscene
, como¿Cómo ejecuto simplemente una aplicación táctil de Ubuntu desde la terminal?notas; pero incluso la respuesta aceptada no es aplicable a Ubuntu 15.04 Touch tal como está:
$ /usr/bin/qmlscene \
> --desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
> /usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml
Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
file:///usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml:22 module "Alarm" is not installed
file:///usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml:20 module "WorldClock" is not installed
... y la aplicación se cierra en el dispositivo apenas después de iniciarse. Y a continuación se muestra la única línea de comando que encontré que funciona en un BQ E5 Ubuntu 15.04:
APP_ID=com.ubuntu.clock_clock_3.7.456 \
QML2_IMPORT_PATH=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf \
QML_IMPORT_TRACE=1 \
/usr/bin/qmlscene \
--desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml
Luego, la aplicación se inicia en el teléfono, mientras que en el terminal shell se descargan mensajes, como:
Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
QQmlImportDatabase::addImportPath: "/usr/lib/arm-linux-gnueabihf/qt5/qml"
QQmlImportDatabase::addImportPath: "/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf"
QQmlImportDatabase::addImportPath: "/usr/lib/arm-linux-gnueabihf/qt5/bin"
...
... y después de presionar Ctrl-C en la terminal, la aplicación se cierra.
La razón por la que me gusta esto es, por un lado, que sé cuál es la copia impresa de la aplicación y cómo redirigirla/guardarla, y por otro, sé cómo crear una gdb
línea de comando para poder depurar. Logré configurar el dispositivo en modo de escritura y desde la instalación del shell build-essential
(ver¿Forma recomendada de instalar paquetes .deb regulares (cli) en Ubuntu Phone?), que incorpora gdb
, por lo que ahora está disponible en shell también en modo de solo lectura. Entonces puedo hacer:
APP_ID=com.ubuntu.clock_clock_3.7.456 \
QML2_IMPORT_PATH=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf \
QML_IMPORT_TRACE=1 \
gdb --args \
/usr/bin/qmlscene \
--desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml
... que se abrirá correctamente gdb
:
GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9
...
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/qmlscene...(no debugging symbols found)...done.
(pero no será de mucha utilidad en este ejemplo debido a que faltan símbolos de depuración).
Sin embargo, además de estas aplicaciones ejecutadas por qmlscene
, aparentemente también hay ejecutables "adecuados" en Ubuntu Touch 15.03, como la aplicación Navegador:
phablet@ubuntu-phablet:~$ which webbrowser-app
/usr/bin/webbrowser-app
phablet@ubuntu-phablet:~$ file /usr/bin/webbrowser-app
/usr/bin/webbrowser-app: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c173774045b98a97e831eda92dd5008d08b9a251, stripped
... pero este tipo simplemente no puedo ejecutarlo desde la línea de comando. Lo más cerca que llegué (por analogía con lo anterior y copiando algunas variables de entorno que env
se ejecutaron en la aplicación Terminal en el teléfono informado) es esto:
APP_ID=webbrowser-app \
UNITY_MIR_SOCKET=/run/mir_socket \
MIR_SOCKET=/var/run/mir_socket \
MIR_SERVER_PROMPT_FILE=1 \
MIR_SERVER_NAME=session-0 \
/usr/bin/webbrowser-app \
--desktop_file_hint=/usr/share/applications/webbrowser-app.desktop
... que sin embargo falla inmediatamente en la terminal con:
Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
UbuntuClientIntegration: connection to Mir server failed. Check that a Mir server is
running, and the correct socket is being used and is accessible. The shell may have
rejected the incoming connection, so check its log file
Aborted
Es más, todo este negocio con--desktop_file_hint
parece algo requerido por Unity8 (es decir, Unity8 podría inspeccionar la línea de comando de la aplicación y buscarla, incluso si la aplicación en sí no la usa), pero puede estar (o está) desapareciendo:
... no está usando upstart-app-launch, lo que explicaría el error. desktop_file_hint no es un medio compatible para iniciar una aplicación (y puede desaparecer en cualquier momento), por lo que UITK debería cambiar para usar UAL en sus pruebas AP.
De hecho, esto solía funcionar hasta hace poco, pero una refactorización reciente rompió el comportamiento de desktop_file_hint. Dado que no es un comportamiento compatible, se debe confiar en él, por lo que sería mejor arreglar UITK que restaurar el comportamiento anterior.
Bien, pero entonces, ¿cómo ejecuto archivos ejecutables, posiblemente desde aplicaciones no instaladas, con upstart-app-launch
(es decir ubuntu-app-launch
), y cómo los ejecutaría en primer plano en la terminal? Soy consciente de que, al igual que Android ndk-gdb
, el SDK de Ubuntu tiene algo similara través de Qt Creadorque aparentemente usa gdbserver
en el dispositivo. Sin embargo, preferiría no activar una GUI para algo así y, de hecho, me encantaría ejecutarlo gdb
a la antigua usanza, como se describe anteriormente, con un ejecutable como argumento en la línea de comando.
Supongo que mucho de esto tiene que ver con que no entiendo bien las diferencias entre init/Upstart, X11/Mir, Gnome/Unity, etc. que se aplican en un dispositivo frente a un escritorio (clásico), y realmente no puedo decir qué ejecuta qué. Me encantaría que me explicaran lo suficiente, para poder entender cómo funcionaría la ejecución de aplicaciones Ubuntu Touch (GUI) desde una línea de comando de terminal.
Respuesta1
Bueno, creo que encontré algo que explica algunas de las cosas que me preguntaba, pero aún así me encantaría que alguien publicara una respuesta erudita adecuada, así que no voy a aceptar esta por ahora...
De todos modos, el recurso es:
Error #1367871 “ubuntu-app-launch no pasa argumentos al ejecutable”: Errores: Lanzador de aplicaciones de Ubuntu
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
UAL no está diseñado para ejecutar archivos binarios personalizados como desee, está diseñado para iniciar aplicaciones. Una aplicación se define con varios metadatos diferentes, pero uno de los claves es un archivo de escritorio. Ese archivo define cómo iniciar la aplicación y es lo que UAL decide usar para iniciarla. De esta manera, la aplicación puede iniciarse de manera consistente y es la misma de un dispositivo a otro. [...]
Lo complicado del confinamiento de aplicaciones es que los argumentos de la línea de comandos y las variables de entorno no son realmente una buena combinación. Una "aplicación" está completamente separada del resto del sistema, en el mundo de los paquetes de clic. Hay algunos enlaces al hacer clic para configurar enlaces simbólicos o similares, para que otras partes del sistema puedan encontrar fácilmente esas aplicaciones, como ubuntu-app-launch y el alcance de las aplicaciones. Pero no son aplicaciones de línea de comandos y no puedes simplemente ejecutarlas desde la línea de comandos con una configuración arbitraria.
Respuesta2
Estoy ejecutando Lubuntu y encuentro que funcionan bien desde un shell remoto iniciado con ssh -Y usuario@linuxbox:
ubuntu-app-launch "qterminal"
qterminal
El primero inicia qterminal en Quartz y no necesita pedir mi contraseña. El segundo también inicia qterminal pero necesita contraseña.
Creo que el primero también ejecuta bash. ¿Has probado a correr lxsession
? Aunque es inutilizable, aparece esta nueva y extraña papelera y el instalador de Unity Linux aparece de manera extraña.