Systém používá vlastní SDK a API, ve kterém je napsané pár základních vlastních aplikací pro telefonování apod. Mezi další odlišnosti patří souborový systém pouze pro čtení. Dále se aplikace instalují pomocí vlastního balíčkovacího systému. Pro spouštění aplikací pro stolního počítače se používá Libertine a kontejnery. Pomocí Waydroidu je možné spouštět i aplikace napsané pro Android.
Souborový systém pouze pro čtení
Za normálních okolností je adresář / pouze pro čtení. Části systému, do kterých se dá zapisovat, jsou připojené pomocí bind mountu do /userdata
. Jsou to /home
, /var/log
a další. Důvodem, proč je zápis omezen, je stabilita a funkčnost systému, zejména odolnost vůči poškození od ostatních aplikací, které mohou „neopatrností“ přepsat nějaký soubor anebo způsobit konflikt při aktualizacích. Dále to umožňuje například jednoduše provést reset do továrního nastavení.
Dalším specifikem ovlivňující přehled, jaké jsou a kde jsou připojené jednotlivé svazky, se komplikuje používáním LXC kontejnerů a mezivrstvy halium. Jedná se o hardware abstraction layer, tedy mezivrstvu, která zpřístupňuje hardware přes volání Android HAL a jádra od výrobce. Díky tomu lze použít rootfs původního Androidu a jednotlivé ovladače a související služby Androidu spustit v LXC kontejneru. Toto umožňuje běh „tradičního“ Linuxu v kombinaci s jádrem pro Android.
Libertine
Základem Ubuntu Touch je to stejné Ubuntu, které se používá na serverech anebo stolních počítačích. Pro instalaci a spouštění aplikací z běžného Ubuntu má však Ubuntu Touch aplikaci Libertine. Jedná se o uživatelské rozhraní pro instalaci balíčků do LXC kontejnerů. Při instalaci se jednoduše zadá název balíčků, jako byste použili apt install
. Samozřejmě lze spouštět i aplikace včetně jejich uživatelského rozhraní. Ikonka pro spuštění takto nainstalované aplikace se normálně objeví na ploše. Jak to celé funguje, lze shlédnout například ve videu:
Problémem však je, že tyto aplikace nejsou ve většině případů vhodné pro malé obrazovky telefonů. Naštěstí existuje tzv. režim convergence, ve kterém telefon po připojení k velkému displeji automaticky přepne uživatelské rozhraní, umožňující měnit velikosti oken a další parametry obvyklé na stolním počítači. Současně se samotný telefon promění na touchpad.
Waydroid
Kromě jiného je zde možné spouštět i aplikace pro Android. K tomu se používá Waydroid, který spustí aplikaci v LXC kontejneru. Zobrazení uživatelského rozhraní je akcelerováno pomocí Mesa, zajišťující pouze minimální režii navíc. V případě, že telefon používá jádro a souborový systém Androidu, je možné jako chroot pro kontejner použít přímo tento „nativní“ Android. V případě vanilkového linuxového jádra, jako je například na telefonech PinePhone, se stáhne rootfs z LineageOS.
Samotné aplikace lze rozdělit do čtyř kategorií:
- Bez problémů fungující.
- Aplikace používající služeb Google Play.
- Aplikace ověřující konzistenci systému a aktivně bránící se spuštění na jiných OS.
- Aplikace používající speciální anebo neimplementované prvky.
Google Play Services jsou knihovny, které zpřístupňují některé služby Google jako například přihlášení OAuth2. Problém však je v jejich licenci, která brání výrobcům přeinstalovat je na zařízení, které nemá Google Android. Některé aplikace kontrolují, jestli není odemčený bootloader a jestli je spuštěný operační systém podepsaný. Zbývající aplikace jsou „exotické“ například tím, že používají nějaké API nebo hardware, který není podporovaný.
Kromě režie navíc spojené se spouštěním v kontejneru se lze setkat s problémy vyplývajícími ze samotné spolupráce dvou operačních systémů. Projevuje se to například při uspávání systému, kdy při používání aplikaci jako je Whatsapp dochází k rychlejšímu vybíjení telefonu než za použití nativních aplikací jako například Teleports (klient pro Telegram).
Waydroid je pouze berlička, kterou je navíc potřeba do systému ručně doinstalovat. Přestože je Waydroid do velké míry funkční, jedná se i nadále o experimentální projekt a nelze očekávat, že všechny aplikace budou fungovat.
Clickable
Nativní aplikace jsou napsány v Qt + QML a instalované pomocí balíčků Click. Pro vytváření těchto balíčků se používá nástroj clickable. Jedná se o pythonový skript, který zapouzdřuje nástroje pro vývoj. Clickable obsahuje příkazy pro překlad, instalaci aplikace na zařízení, její spuštění, ladění a nakonec i nahrání do OpenStore. Celé je to postavené kolem dpkg a dockerových kontejnerů. Kontejnery v podstatě obsahují SDK se všemi potřebnými balíčky a závislosti ve správných verzích. Jedním přepínačem lze vybrat kontejner překlad pro architekturu ARM64 druhým zase pro x86.
Instalace vývojového prostředí spočívá v přidání PPA repozitáře a instalace balíčku pomocí apt install clickable
. Prostředí se inicializuje příkazem clickable setup
. Pro vygenerování nového projektu se použije clickable create
a pro jeho spuštění a ladění příkaz clickable desktop
. Při prvním spuštění se stáhne docker kontejner, přes který se provádí překlad a spuštění aplikace.
Výsledný Click soubor je v podstatě balíček deb s tím, že oproti standardnímu formátu má určitá omezení. Například další závislosti jsou zakázané, takže se používá pouze ubports framework. Pokud jsou potřeba další závislosti, tak se tzv. „bundlují“, což znamená že se prostě přiloží potřebné knihovny .so do balíčku a při spuštění se nastaví proměnná prostředí LD_LIBRARY_PATH
. Soubory aplikace se z balíčku instalují do / opt/click.ubuntu.com/jmeno-aplikace/1.0.0/
(podle verze). Nepočítá se s tím, že by byl tento adresář v PATH
. Při vytváření ikonky na plochu (v souboru .desktop) se používají relativní cesty ( ./run.sh
). Uživatelská data, která aplikace vytvářejí, se pak ukládají standardně do domovského adresáře. Na obsah balíčku click se po jeho přejmenování na .deb dá podívat třeba pomocí Midnight Commanderu.
Na první pohled by se mohlo zdát, že aplikace se spouštějí v kontejneru nebo s pomocí nějakého overlay. To však není potřeba díky výchozímu nastavení kořenového adresáře pouze pro čtení. V tomto případě se totiž používají přímo knihovny nainstalované v dané verzi systému. Pro zajištění bezpečnosti a toho, aby aplikace nepřistupovala, kam nemá, se používá AppArmor.
(Původně napsáno pro autorův blog.)