I have already seen some answers related to this, but they didn't bring me to a definitive answer, so I'm going to try again.
Basically, my question is: how can I run Ubuntu Touch applications from the command line - specifically, so that I could debug them with gdb
?
More details:
First, what that means is that I'd like to run them from a remote shell connection to a (phone/tablet) device on a PC, either from adb shell
or phablet-shell
(see Hacking Ubuntu Touch, Part 5: adb shell vs. phablet-shell). I already got the Terminal app, but - given that one cannot establish a proper (VNC) remote desktop connection to an Ubuntu Touch system, - it is of little use to me, as I cannot really work with it (haven't yet tried a Bluetooth keyboard attached to a device, though).
Second, I'd like, if possible, to run applications in the foreground; then when called from the terminal command line, I'd expect the applications to dump their stdout printouts to the terminal. Thus, the recommendation in Ubuntu Touch: How do I run an ubuntu touch app from the terminal? I cannot use much, since (this is from a 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:~$
... it simply launches the app in the background, and immediately exits. And AFAICS, webapp-container
simply opens an URL in the browser, doesn't run arbitrary applications.
Some of the preinstalled applications are apparently run by a program qmlscene
, as How do I simply run an ubuntu touch app from the terminal? notes; but even the accepted answer there isn't applicable to Ubuntu 15.04 Touch as-is:
$ /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
... and the application shuts down on device barely after being started. And below is the only command line I've found to work on a 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
The application then starts on phone, while on shell terminal messages are being dumped, like:
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"
...
... and after you press Ctrl-C in terminal, the application exits.
Why I like this, is for one, I know what is the application printout and how to redirect/save it - and for another, I know how to build a gdb
command line in order to debug. I managed to set the device in writable mode, and from the shell install build-essential
(see Recommended way to install regular(cli) .deb packages on Ubuntu Phone?), which pulls in gdb
, so now it is available in shell also in read-only mode. Then I can do:
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
... which will properly open 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.
(but won't be of that much use in this example due to missing debugging symbols).
However, besides these apps ran by qmlscene
, there are seemingly also "proper" executables on Ubuntu Touch 15.03, such as the Browser app:
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
... but this kind I simply cannot get to run from the command line. Closest I got to (by analogy with above, and copying some environment variables that env
ran on the Terminal app on the phone reported) is this:
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
... which however fails immediately in terminal with:
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
What's more, all this business with --desktop_file_hint
seems something required by Unity8 (i.e. Unity8 might inspect the app command line and look for it, even if the app itself doesn't use it) - but may be (or is) going away:
ubuntu-bugs - [Bug 1578319] [NEW] Some ubuntu-ui-toolkit AP tests failing to launch - rejected by unity8 as is using desktop_file_hint (2016-05)
...is not using upstart-app-launch - which would explain the fail.
desktop_file_hint is not a supported means of launching an app (and can
go away at any time), so UITK should change to use UAL in its AP tests.
This indeed used to work until recently, but a recent refactoring broke
the desktop_file_hint behaviour. Since it's not a supported behaviour,
it should be relied on, so it would be better to fix UITK than restore
the old behaviour.
Ok, but then, how do I run executable files, possibly from non installed applications, with upstart-app-launch
(i.e. ubuntu-app-launch
) - and how would I run them in foreground in the terminal? I'm aware that, - just like Android has ndk-gdb
, - the Ubuntu SDK has something similar via Qt Creator which apparently uses gdbserver
on the device. However, I'd prefer not firing up a GUI for something like that - and in fact, would love to run gdb
in the old-fashioned way, as described above, with an executable as argument on the command line.
I guess a lot of this has to do with me not quite understanding init/Upstart, X11/Mir, Gnome/Unity etc differences that are applicable on a device vs. a (classic) desktop - and I cannot really tell what runs what. I'd love to have enough of it explained, so I can understand how running (GUI) Ubuntu Touch apps from a terminal command line would work.