Запуск приложений Ubuntu Touch в командной строке для отладки GDB?
Я уже видел некоторые ответы, связанные с этим, но они не привели меня к окончательному ответу, поэтому я собираюсь попробовать еще раз.
По сути, мой вопрос: как я могу запускать приложения Ubuntu Touch из командной строки, в частности, чтобы я мог их отлаживать с помощью gdb
?
Больше деталей:
Во-первых, это означает, что я хотел бы запустить их с удаленного подключения к устройству (телефон / планшет) на ПК, либо из adb shell
или же phablet-shell
(см. раздел "Взлом Ubuntu Touch", часть 5: оболочка adb или оболочка phablet). Я уже получил приложение "Терминал", но - учитывая, что невозможно установить правильное (VNC) подключение к удаленному рабочему столу с системой Ubuntu Touch, - оно бесполезно для меня, поскольку я не могу по-настоящему с ним работать (пока не пробовал хотя клавиатура Bluetooth подключена к устройству).
Во-вторых, я хотел бы, если возможно, запускать приложения на переднем плане; затем при вызове из командной строки терминала я ожидаю, что приложения будут выгружать свои распечатки стандартного вывода в терминал. Таким образом, рекомендация в Ubuntu Touch: как запустить приложение Ubuntu Touch из терминала? Я не могу использовать много, так как (это из 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:~$
... он просто запускает приложение в фоновом режиме и сразу же завершает работу. И AFAICS, webapp-container
просто открывает URL в браузере, не запускает произвольные приложения.
Некоторые из предустановленных приложений, очевидно, запускаются программой qmlscene
Как я могу просто запустить приложение Ubuntu Touch из терминала? заметки; но даже принятый там ответ не применим к Ubuntu 15.04 Touch как есть:
$ /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
... и приложение закрывается на устройстве только после запуска. И ниже приведена единственная командная строка, которую я нашел для работы на 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
Затем приложение запускается на телефоне, а на терминал выводятся сообщения, такие как:
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"
...
... и после нажатия Ctrl-C в терминале приложение завершается.
Почему мне это нравится, для одного, я знаю, что такое распечатка приложения и как перенаправить / сохранить его - и для другого, я знаю, как построить gdb
командная строка для отладки. Мне удалось перевести устройство в режим записи и из оболочки установить build-essential
(см. Рекомендуемый способ установки обычных (cli) .deb пакетов на Ubuntu Phone?), который загружает gdb
, так что теперь он доступен в оболочке также в режиме только для чтения. Тогда я могу сделать:
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
... который будет правильно открываться 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.
(но в этом примере он не будет так полезен из-за отсутствия символов отладки).
Однако помимо этих приложений qmlscene
На Ubuntu Touch 15.03, по-видимому, также существуют "правильные" исполняемые файлы, такие как приложение Browser:
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
... но я просто не могу запустить из командной строки. Ближайший я получил (по аналогии с выше, и копирование некоторых переменных среды, которые env
запустил приложение Терминал на телефоне, сообщил) вот это:
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
... который, однако, сразу не работает в терминале с:
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
Более того, все это дело с --desktop_file_hint
Кажется, что-то требуется для Unity8 (то есть Unity8 может проверять командную строку приложения и искать его, даже если само приложение не использует его) - но может (или уходит):
... не использует upstart-app-launch - что объясняет ошибку. desktop_file_hint не является поддерживаемым средством запуска приложения (и может уйти в любое время), поэтому UITK следует изменить на использование UAL в своих тестах AP.
До недавнего времени это действительно работало, но недавний рефакторинг нарушил поведение desktop_file_hint. Поскольку это не поддерживаемое поведение, на него следует полагаться, поэтому было бы лучше исправить UITK, чем восстановить старое поведение.
Хорошо, но тогда, как мне запустить исполняемые файлы, возможно, из не установленных приложений, с upstart-app-launch
(т.е. ubuntu-app-launch
) - а как бы мне запустить их на переднем плане в терминале? Я знаю, что - так же, как Android ndk-gdb
- Ubuntu SDK имеет нечто подобное через Qt Creator, который, по-видимому, использует gdbserver
на устройстве. Тем не менее, я бы предпочел не запускать графический интерфейс для чего-то подобного - и на самом деле, хотел бы запустить gdb
по старинке, как описано выше, с исполняемым файлом в качестве аргумента в командной строке.
Я полагаю, что во многом это связано с тем, что я не совсем понимаю различия между init/Upstart, X11/Mir, Gnome/Unity и т. Д., Которые применимы к устройству по сравнению с (классическим) рабочим столом, - и я не могу точно сказать, что работает. Мне бы хотелось, чтобы это было достаточно объяснено, поэтому я могу понять, как будут работать приложения (GUI) Ubuntu Touch из командной строки терминала.
2 ответа
Ну, я думаю, что нашел кое-что, что объясняет некоторые из вещей, о которых я задавался вопросом - но я все еще хотел бы, чтобы кто-то отправил надлежащий эрудированный ответ, поэтому я не собираюсь сейчас принимать этот...
В любом случае, ресурс это:
Ошибка #1367871 "ubuntu-app-launch не передает аргументы исполняемому файлу": Ошибки: Ubuntu Application Launcher
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
UAL не предназначен для запуска пользовательских двоичных файлов так, как вы хотите, он предназначен для запуска приложений. Приложение определяется множеством разных метаданных, но одним из ключевых является файл рабочего стола. Этот файл определяет, как запустить приложение, и это то, что UAL решает использовать для его запуска. Таким образом, приложение может запускаться согласованным образом и является одним и тем же от устройства к устройству. [...]
Хитрость в ограничении приложений заключается в том, что аргументы командной строки и переменные окружения не очень подходят для этого. "Приложение" полностью отделено от остальной системы в мире пакетов click. Есть несколько хуков в щелчке, чтобы установить символические ссылки или тому подобное, чтобы другие части системы могли легко находить эти приложения, такие как ubuntu-app-launch и область приложения. Но они не являются приложениями командной строки, и вы не можете просто запустить их из командной строки с произвольной конфигурацией.
Я использую Lubuntu и обнаружил, что они отлично работают из удаленной оболочки, запущенной с ssh -Y user@linuxbox:
ubuntu-app-launch "qterminal"
qterminal
Первый запускает qterminal в Quartz и не должен спрашивать мой пароль. Второй также запускает qterminal, но требует пароль.
Я думаю, что первый также работает Bash. Ты пробовал бегать lxsession
? Хотя это непригодно для использования, я получаю эту странную новую корзину и странный установщик Unity для Linux.