我已经看到了一些与此相关的答案,但它们并没有给我一个明确的答案,所以我将再试一次。
基本上,我的问题是:如何从命令行运行 Ubuntu Touch 应用程序——具体来说,以便我可以用它们调试gdb
?
更多细节:
首先,这意味着我想通过远程 shell 连接在 PC 上运行它们,无论是通过adb shell
还是通过phablet-shell
(参见破解 Ubuntu Touch,第 5 部分:adb shell 与 phablet-shell)我已经得到了终端应用程序,但鉴于无法建立适当的(VNC)远程桌面连接到 Ubuntu Touch 系统,——它对我来说用处不大,因为我无法真正使用它(虽然还没有尝试过连接到设备的蓝牙键盘)。
其次,如果可能的话,我希望在前台运行应用程序;然后当从终端命令行调用时,我希望应用程序将其 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
然后应用程序在手机上启动,同时在 shell 终端上转储消息,例如:
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
命令行以便进行调试。我设法将设备设置为可写模式,并从 shell 安装build-essential
(参见在 Ubuntu Phone 上安装常规(cli).deb 包的推荐方法?),它会拉入gdb
,因此现在它在 shell 中也以只读模式可用。然后我可以执行以下操作:
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 上似乎还有“适当”的可执行文件,例如浏览器应用程序:
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 应该在其 AP 测试中更改为使用 UAL。
直到最近,这确实一直有效,但最近的重构破坏了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 等在设备和(经典)桌面上的区别有关 - 而且我真的不知道哪个运行哪个。我希望得到足够的解释,这样我就能理解如何从终端命令行运行(GUI)Ubuntu Touch 应用程序。
答案1
好吧,我想我找到了一些东西来解释我所想知道的一些事情 - 但我仍然希望有人能发布一个适当的博学答案,所以我现在不会接受这个......
无论如何,资源是:
错误 #1367871“ubuntu-app-launch 未将参数传递给可执行文件”:错误:Ubuntu 应用程序启动器
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
UAL 并非旨在以任何方式运行自定义二进制文件,而是旨在启动应用程序。应用程序由一系列不同的元数据定义,但其中最关键的一个元数据是桌面文件。该文件定义如何启动应用程序,UAL 决定使用该文件来启动应用程序。这样,应用程序就可以以一致的方式启动,并且在不同的设备上都是一样的。[...]
应用程序限制的棘手之处在于,命令行参数和环境变量并不是很好的组合。在 click 包世界中,“应用程序”与系统的其余部分完全分开。click 中有一些钩子可以设置符号链接或类似的东西,以便系统的其他部分能够轻松找到这些应用程序,例如 ubuntu-app-launch 和应用程序范围。但它们不是命令行应用程序,您不能简单地从命令行以任意配置运行它们。