In 2015, I found myself becoming a very independent smart-watch reviewer. Due to some lucky conditions, I ended up with a free LG Watch Urbane. It was very snazzy, but I just didn't get the point of smartwatches. One day in 2016, I forgot to put it on. From then on I realized that smartwatches were just a fad (for me at least), and this was a device I could experiment with.
How can I experiment with a smartwatch? Having tried (and failed) to run Ubuntu on another device (nexus 9), the obvious answer was to install GNU/Linux on it! It is an amazing piece of hardware with a stunning circular touch screen. Since I know how to write apps for GNU/Linux (it even runs a web browser!), I was excited by the possibilities.
Then I found Asteroid OS:
The contributors to Asteroid OS have done an amazing job with the install process. If you know how to install Cyanogen (or whatever it is these days), you can install Asteroid OS. You just use fastboot and adb, like a regular Android phone.
The Asteroid OS image is a whopping 414 Mb. How massive! That lead me on a slight distraction. How does my tiny, cool-running little smartwatch compare older computers? Maybe the original iPhone?
Spec | iPhone 1 | LG Watch Urbane |
---|---|---|
Thickness (mm) | 11.6 | 10.9 |
Water Resistance | no | IP67 certified |
CPU Core Count | single core | quad core |
CPU Clock Speed | 412 HMz ARM 11 | 1.2 GHz Cortex A7 |
RAM | 128 MB | 512 MB |
Battery | 1400 mAh | 410 mAh |
Screen Resolution | 320x480 | 320x320 |
Storage | 4/8/16 GB | 4 GB |
Wow! More CPU and RAM than the original iPhone, almost as many pixels and just as much storage; all in a much smaller case. It's pretty crazy that the watch has any battery life - let alone a good days worth!
Back to reality, the download finished and it copied itself to my watch. Then I was ready to fastboot:
Here's the sad thing; on my laptop, I still am running the bloated, legacy X11 display server. I had to because I was involved in maintaining an X11 desktop environment. But Asteroid OS is 100% Wayland only. And it works like a charm:
Even more amazingly, running on that tiny package of hardware is some live multitasking:
This is what makes me happiest of all:
/ # systemctl status --no-pager
● bass
State: running
Jobs: 0 queued
Failed: 0 units
Since: Thu 1970-01-01 01:02:57 UTC; 46 years 11 months ago
CGroup: /
├─user.slice
│ └─user-1000.slice
│ └─[email protected]
│ ├─msyncd.service
│ │ └─565 /usr/bin/invoker -G -o -s --type=qt5 /usr/bin/msyncd...
│ ├─booster-qt5.service
│ │ ├─548 /usr/libexec/mapplauncherd/booster-qt5 --systemd --b...
│ │ ├─562 /usr/bin/msyncd
│ │ └─584 booster [qt5]
│ ├─dbus.service
│ │ ├─537 /usr/bin/dbus-daemon --session --address=systemd: --...
│ │ ├─576 /usr/libexec/dconf-service
│ │ └─587 /usr/bin/profiled
│ ├─asteroid-launcher.service
│ │ ├─ 555 /usr/bin/lipstick -plugin evdevtouch:/dev/input/eve...
│ │ ├─ 999 /usr/bin/invoker --single-instance --type=qtcompone...
│ │ ├─1008 /usr/bin/invoker --single-instance --type=qtcompone...
│ │ ├─1022 /usr/bin/invoker --single-instance --type=qtcompone...
│ │ └─1036 /usr/bin/invoker --single-instance --type=qtcompone...
│ ├─asteroid-btsyncd.service
│ │ └─534 /usr/bin/asteroid-btsyncd
│ ├─booster-generic.service
│ │ ├─533 /usr/libexec/mapplauncherd/booster-generic --systemd...
│ │ └─543 booster [generic]
│ ├─statefs.service
│ │ └─553 /usr/bin/statefs /run/user/1000/state -f -o allow_ot...
│ ├─timed-qt5.service
│ │ └─531 /usr/bin/timed-qt5 --systemd
│ ├─booster-qtcomponents-qt5.service
│ │ ├─ 530 /usr/libexec/mapplauncherd/booster-qtcomponents-qt5...
│ │ ├─ 941 /usr/bin/asteroid-timer
│ │ ├─1000 /usr/bin/asteroid-calculator
│ │ ├─1009 /usr/bin/asteroid-weather
│ │ ├─1023 /usr/bin/asteroid-stopwatch
│ │ └─1037 booster [qtcomponents-qt5]
│ └─init.scope
│ ├─510 /lib/systemd/systemd --user
│ └─511 (sd-pam)
├─system.slice
│ ├─android-tools-adbd.service
│ │ ├─1246 /usr/bin/adbd
│ │ ├─1263 /bin/sh -
│ │ └─1269 systemctl status --no-pager
│ ├─bluetooth.service
│ │ └─550 /usr/libexec/bluetooth/bluetoothd -E
│ ├─busybox-syslog.service
│ │ └─475 /sbin/syslogd -n
│ ├─systemd-logind.service
│ │ └─472 /lib/systemd/systemd-logind
│ ├─connman.service
│ │ └─470 /usr/sbin/connmand -n
│ ├─dsme.service
│ │ ├─469 /usr/sbin/dsme -v 4 -p /usr/lib/dsme/startup.so --system...
│ │ └─471 /usr/sbin/dsme-server -v 4 -p /usr/lib/dsme/startup.so -...
│ ├─dbus.service
│ │ └─466 /usr/bin/dbus-daemon --system --address=systemd: --nofor...
│ ├─busybox-klogd.service
│ │ └─464 /sbin/klogd -n
│ ├─statefs-system.service
│ │ └─460 /usr/bin/statefs /run/state -f --system -o allow_other,d...
│ ├─usb-moded.service
│ │ └─449 /usr/sbin/usb_moded --systemd --force-syslog
│ ├─mce.service
│ │ └─448 /usr/sbin/mce --systemd
│ ├─systemd-timesyncd.service
│ │ └─247 /lib/systemd/systemd-timesyncd
│ ├─android-init.service
│ │ ├─238 /system/bin/init
│ │ ├─248 /system/bin/logd
│ │ └─252 /system/bin/servicemanager
│ ├─systemd-udevd.service
│ │ └─216 /lib/systemd/systemd-udevd
│ ├─psplash.service
│ │ └─190 /usr/bin/psplash --angle 0
│ ├─systemd-journald.service
│ │ └─185 /lib/systemd/systemd-journald
│ └─system-serial\x2dgetty.slice
│ └─[email protected]
│ └─505 /sbin/agetty -8 -L ttyHSL0 115200 xterm
└─init.scope
└─1 /lib/systemd/systemd
It looks like a watch, it smells like a watch, but it runs like a normal computer. Wayland, systemd, polkit, dbus and friends look very friendly to hacking. Even Qt is better than android, but that's debatable.
My next project - run Gtk+ on the watch :)
I hope you enjoyed this article. Contact me if you have any thoughts or questions.
© 2015—2024 Sam Parkinson