Запуск приложений Ubuntu Touch в командной строке для отладки gdb?

Запуск приложений Ubuntu Touch в командной строке для отладки gdb?

Я уже видел несколько ответов по этой теме, но они не привели меня к определенному ответу, поэтому я попробую еще раз.

По сути, мой вопрос таков: как мне запускать приложения Ubuntu Touch из командной строки, в частности, чтобы можно было отлаживать их с помощью gdb?


Подробнее:

Во-первых, это означает, что я хотел бы запускать их из удаленного соединения оболочки с устройством (телефоном/планшетом) на ПК, либо с adb shellили phablet-shell(см.Взлом Ubuntu Touch, часть 5: adb shell против phablet-shell). Я уже получилТерминальное приложение, но - учитывая, что невозможно установить надлежащий (VNC)подключение к удаленному рабочему столу системы Ubuntu Touch, - мне это мало полезно, так как я не могу с ним толком работать (правда, пока не пробовал подключать Bluetooth-клавиатуру к устройству).

Во-вторых, я хотел бы, если возможно, запускать приложения на переднем плане; тогда при вызове из командной строки терминала я бы ожидал, что приложения будут выводить свои stdout-распечатки на терминал. Таким образом, рекомендация в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:~$ 

... он просто запускает приложение в фоновом режиме и немедленно завершает работу. И насколько я знаю,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 может проверять командную строку приложения и искать его, даже если само приложение его не использует) - но может (или уже) исчезнуть:

ubuntu-bugs - [Ошибка 1578319] [НОВОЕ] Некоторые тесты ubuntu-ui-toolkit AP не запускаются - отклонено unity8, поскольку использует desktop_file_hint (2016-05)

...не использует 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на устройстве. Однако я бы предпочел не запускать GUI для чего-то подобного - и на самом деле, мне бы хотелось запустить его gdbпо старинке, как описано выше, с исполняемым файлом в качестве аргумента в командной строке.

Думаю, во многом это связано с тем, что я не совсем понимаю различия init/Upstart, X11/Mir, Gnome/Unity и т. д., которые применяются на устройстве по сравнению с (классическим) рабочим столом, и я не могу точно сказать, что что запускает. Мне бы хотелось, чтобы было достаточно объяснений, чтобы я мог понять, как будет работать запуск приложений Ubuntu Touch (GUI) из командной строки терминала.

решение1

Ну, я думаю, что нашел кое-что, что объясняет некоторые из вопросов, которые меня интересовали, но мне все равно хотелось бы, чтобы кто-то опубликовал по-настоящему эрудированный ответ, поэтому я пока не буду принимать этот ответ...

В любом случае, ресурс:

Ошибка № 1367871 «ubuntu-app-launch не передает аргументы исполняемому файлу» : Ошибки : Ubuntu Application Launcher
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871

UAL не предназначен для запуска пользовательских двоичных файлов так, как вам хочется, он предназначен для запуска приложений. Приложение определяется кучей различных метаданных, но одним из ключевых является файл рабочего стола. Этот файл определяет, как запускать приложение, и именно его UAL решает использовать для его запуска. Таким образом, приложение может запускаться согласованным образом и будет одинаковым на разных устройствах. [...]

Сложность ограничения приложений заключается в том, что аргументы командной строки и переменные окружения не являются для него хорошим сочетанием. «Приложение» полностью отделено от остальной системы в мире пакетов click. В click есть некоторые хуки для настройки символических ссылок или чего-то подобного, чтобы другие части системы могли легко находить эти приложения, например, ubuntu-app-launch и область действия приложений. Но они не являются приложениями командной строки, и вы не можете просто запустить их из командной строки с произвольной конфигурацией.

решение2

Я использую Lubuntu и обнаружил, что все это прекрасно работает из удаленной оболочки, запущенной с помощью ssh -Y user@linuxbox:

ubuntu-app-launch "qterminal"    
qterminal

Первый запускает qterminal в Quartz и не требует запроса пароля. Второй также запускает qterminal, но требует ввода пароля.

Я думаю, что первый также запускает bash. Вы пробовали запустить lxsession? Хотя он бесполезен, у меня появляется эта странная новая Корзина и установщик Unity Linux, которые странно появляются.

введите описание изображения здесь

Связанный контент