Já vi algumas respostas relacionadas a isso, mas não me levaram a uma resposta definitiva, então vou tentar novamente.
Basicamente, minha pergunta é: como posso executar aplicativos Ubuntu Touch a partir da linha de comando - especificamente, para poder depurá-los gdb
?
Mais detalhes:
Primeiro, o que isso significa é que eu gostaria de executá-los a partir de uma conexão shell remota para um dispositivo (telefone/tablet) em um PC, seja de adb shell
ou phablet-shell
(vejaHackeando o Ubuntu Touch, Parte 5: adb shell vs. phablet-shell). Eu já consegui oAplicativo terminal, mas - dado que não é possível estabelecer um (VNC) adequadoconexão de área de trabalho remota a um sistema Ubuntu Touch, - é de pouca utilidade para mim, pois não consigo trabalhar com ele (ainda não experimentei um teclado Bluetooth conectado a um dispositivo).
Segundo, gostaria, se possível, de executar aplicativos em primeiro plano; então, quando chamado a partir da linha de comando do terminal, esperaria que os aplicativos despejassem suas impressões padrão no terminal. Assim, a recomendação emUbuntu Touch: Como executo um aplicativo Ubuntu Touch a partir do terminal?Não posso usar muito, pois (isto é de um 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:~$
... ele simplesmente inicia o aplicativo em segundo plano e sai imediatamente. E AFAICS,webapp-container
simplesmente abre uma URL no navegador, não executa aplicativos arbitrários.
Alguns dos aplicativos pré-instalados são aparentemente executados por um programa qmlscene
, comoComo eu simplesmente executo um aplicativo ubuntu touch a partir do terminal?notas; mas mesmo a resposta aceita não é aplicável ao Ubuntu 15.04 Touch 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
... e o aplicativo é desligado no dispositivo logo após ser iniciado. E abaixo está a única linha de comando que encontrei para funcionar em um 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
O aplicativo então inicia no telefone, enquanto mensagens do terminal shell estão sendo despejadas, 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"
...
... e depois de pressionar Ctrl-C no terminal, o aplicativo é encerrado.
Por que gosto disso, por um lado, sei o que é a impressão do aplicativo e como redirecioná-la/salvá-la - e por outro, sei como construir uma gdb
linha de comando para depurar. Consegui configurar o dispositivo em modo gravável e a partir da instalação do shell build-essential
(vejaManeira recomendada de instalar pacotes .deb regulares (cli) no Ubuntu Phone?), que puxa gdb
, então agora está disponível no shell também no modo somente leitura. Então eu posso fazer:
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 será aberto corretamente 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.
(mas não será muito útil neste exemplo devido à falta de símbolos de depuração).
No entanto, além desses aplicativos executados por qmlscene
, aparentemente também existem executáveis "adequados" no Ubuntu Touch 15.03, como o aplicativo 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
... mas esse tipo simplesmente não consigo executar a partir da linha de comando. O mais próximo que cheguei (por analogia com o acima, e copiando algumas variáveis de ambiente env
executadas no aplicativo Terminal no telefone relatado) foi o seguinte:
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, no entanto, falha imediatamente no terminal com:
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
Além do mais, todo esse negócio com--desktop_file_hint
parece algo exigido pelo Unity8 (ou seja, o Unity8 pode inspecionar a linha de comando do aplicativo e procurá-la, mesmo que o próprio aplicativo não a utilize) - mas pode estar (ou está) desaparecendo:
... não está usando o upstart-app-launch - o que explicaria a falha. desktop_file_hint não é um meio compatível de iniciar um aplicativo (e pode desaparecer a qualquer momento), portanto, o UITK deve mudar para usar UAL em seus testes de AP.
Na verdade, isso funcionava até recentemente, mas uma refatoração recente quebrou o comportamento desktop_file_hint. Como não é um comportamento suportado, deve-se confiar nele, portanto seria melhor corrigir o UITK do que restaurar o comportamento antigo.
Ok, mas então, como executo arquivos executáveis, possivelmente de aplicativos não instalados, com upstart-app-launch
(ie ubuntu-app-launch
) - e como eu os executaria em primeiro plano no terminal? Estou ciente de que, assim como o Android ndk-gdb
, o SDK do Ubuntu tem algo semelhanteatravés do Qt Creatorque aparentemente usa gdbserver
no dispositivo. No entanto, eu preferiria não iniciar uma GUI para algo assim - e, na verdade, adoraria executar gdb
da maneira antiga, conforme descrito acima, com um executável como argumento na linha de comando.
Acho que muito disso tem a ver com o fato de eu não entender muito bem as diferenças entre init/Upstart, X11/Mir, Gnome/Unity etc. que são aplicáveis em um dispositivo versus um desktop (clássico) - e não consigo dizer o que executa o quê. Eu adoraria ter tudo explicado, para que eu possa entender como funcionaria a execução de aplicativos Ubuntu Touch (GUI) a partir de uma linha de comando do terminal.
Responder1
Bem, acho que encontrei algo que explica algumas das coisas que eu estava pensando - mas ainda adoraria que alguém postasse uma resposta erudita adequada, então não vou aceitar esta por enquanto...
De qualquer forma, o recurso é:
Bug #1367871 “ubuntu-app-launch não passa argumentos para o executável”: Bugs: Ubuntu Application Launcher
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
O UAL não foi projetado para executar binários personalizados como você quiser, ele foi projetado para iniciar aplicativos. Um aplicativo é definido com vários metadados diferentes, mas um dos principais é um arquivo de desktop. Esse arquivo define como iniciar o aplicativo e é o que a UAL decide usar para iniciá-lo. Desta forma, o aplicativo pode ser iniciado de maneira consistente e é a mesma coisa de dispositivo para dispositivo. [...]
O complicado sobre o confinamento de aplicativos é que argumentos de linha de comando e variáveis de ambiente não são realmente uma boa combinação para isso. Um “aplicativo” é completamente separado do resto do sistema, no mundo dos pacotes de cliques. Existem alguns ganchos para configurar links simbólicos ou algo assim, para que outras partes do sistema possam encontrar facilmente esses aplicativos, como ubuntu-app-launch e o escopo dos aplicativos. Mas eles não são aplicativos de linha de comando e você não pode simplesmente executá-los a partir da linha de comando com configuração arbitrária.
Responder2
Estou executando o Lubuntu e acho que eles funcionam bem em um shell remoto iniciado com ssh -Y user@linuxbox:
ubuntu-app-launch "qterminal"
qterminal
O primeiro inicia o qterminal no Quartz e não precisa pedir minha senha O segundo também inicia o qterminal mas precisa de senha
Acho que o primeiro também está executando o bash. Você já tentou correr lxsession
? Embora seja inutilizável, recebo uma nova lata de lixo estranha e o instalador do Unity Linux aparecendo de forma estranha.