我已經看到了一些與此相關的答案,但它們沒有為我帶來明確的答案,所以我要再試一次。
基本上,我的問題是:如何從命令列運行 Ubuntu Touch 應用程式 - 具體來說,以便我可以使用 來偵錯它們gdb
?
更多細節:
首先,這意味著我想從遠端 shell 連接到 PC 上的(手機/平板電腦)設備來運行它們,無論是來自adb shell
還是phablet-shell
(請參閱駭客 Ubuntu Touch,第 5 部分:adb shell 與 phablet-shell)。我已經得到了終端應用程式,但是 - 鑑於無法建立適當的(VNC)到 Ubuntu Touch 系統的遠端桌面連接,-它對我來說沒什麼用,因為我無法真正使用它(不過還沒有嘗試過連接到設備的藍牙鍵盤)。
其次,如果可能的話,我想在前台運行應用程式;然後,當從終端命令列調用時,我希望應用程式將其標準輸出列印輸出轉儲到終端。因此,建議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
然後應用程式在手機上啟動,同時在 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 創建者顯然gdbserver
在設備上使用。然而,我不想為類似的事情啟動 GUI - 事實上,我希望gdb
以老式的方式運行,如上所述,在命令列上使用可執行檔作為參數。
我想這很大程度上與我不太了解 init/Upstart、X11/Mir、Gnome/Unity 等適用於設備與(經典)桌面的差異有關 - 而且我無法真正分辨出什麼運行什麼。我希望對其進行足夠的解釋,以便我能夠了解如何從終端命令列運行 (GUI) Ubuntu Touch 應用程式。
答案1
好吧,我想我發現了一些東西可以解釋我想知道的一些事情 - 但我仍然希望有人發布一個正確的博學答案,所以我現在不會接受這個......
無論如何,資源是:
Bug #1367871「ubuntu-app-launch 不會將參數傳遞給執行檔」:Bug:Ubuntu 應用程式啟動器
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
UAL 並不是為了按照您的意願運行自訂二進位檔案而設計的,它是為了啟動應用程式而設計的。應用程式是用一堆不同的元資料定義的,但其中一個關鍵元資料是桌面檔案。該文件定義瞭如何啟動應用程序,並且 UAL 決定使用該文件來啟動應用程式。透過這種方式,應用程式可以以一致的方式啟動,並且在不同的裝置上都是相同的。 [...]
關於應用程式限制的棘手之處在於,命令列參數和環境變數並不是真正的良好組合。在點擊包世界中,「應用程式」與系統的其餘部分完全分開。點擊中有一些掛鉤可以設定符號連結等,以便系統的其他部分可以輕鬆找到這些應用程序,例如 ubuntu-app-launch 和應用程式範圍。但它們不是命令列應用程序,您不能簡單地從命令行以任意配置運行它們。