Working On Android
Sat Nov 11, 2023Listen to this postOr, more realistically, "Working Cross Platform", except that the only two platforms I selfishly care about are Android and Debian-descended Linux. Last time I touched Android in anger, I was working on a MacOS machine, and trying to do it in JavaScript. This was after failing to get cljs
up and running. Given that my current explorations are, by virtue of HuggingFace, going through Python, I figured it might be a good idea to try that as a mobile development language.
It turns out it's not complete trash?
There's two realistic options here; beeware/briefcase
and kivy/buildozer
. The TLDR here is
beeware
is surprisingly easy both to set up and deploy, and handles a bunch of stuff related to Android emulation. It's a lot more opinionated about what your project file structure should look like, and assumes you initiated the project withbriefcase new
. Also, its widget library seems to unapologetically be a lot less flexible.kivy
, and in particularbuildozer
is more persnickety to set up, and makes you deal with finding an Android emulator on your own, but is incredibly flexible. It also has this weird, pre-HTML notion that what UI really needs is a weird, domain specific markup different from all the other weird, domain specific markups. Luckily, you can entirely ignore it, and I probably will.
Beeware
The tutorial is a great place to start with this one. It gets you through building a custom trivial app, building it, and running it on an android emulator. It also feels like subsequent builds of the application are much faster than the initial one. If you have a simple application, that happens to fit within Toga's constraints, you should absolutely use this, because deploying things is ridiculously easy. I had a basic app up and running on an emulator inside of like twenty minutes, and had it running on my literal phone about twenty minutes after that.
The trouble is that if you want to do things like have clickable images, this is not the app for you. That link, which I posted twice in this post so far, links to a multi-page discussion from January of 2020 in which BrendanSimon valiantly tries to convince the Beeware guys that a real cross-platform GUI widget system needs to let people click/tap/whatever on things which aren't always 100% button-shaped, and which sometimes have (gasp) icons instead of or in addition to text. In case you were wondering, the issue is still open, but the framework developers seem ambivalent whether anyone really needs this.
Which, given that I want to do professional-grade work here, rules me out. Check it out for toys, in case you want to test the waters of personal android development, or if packaging your project as a .deb
is more important to you than running it on your phone.
I'm moving along.
Kivy
buildozer
is rough. It has documentation, and it technically tells you how to install it. However, after hours of trying to get it work directly, and scraping through their github
and StackOverflow questions trying to figure out why my builds were failing with SSL errors, and unsuccessfully asking for help on their Discord, what I found out is that those installation instructions are incorrect. They tell you to do pip3 install --user --upgrade buildozer
, but that'll install it in some weird semi-coherent way where certifi
doesn't have valid SSL certificates hooked into it correctly. What I actually had to do instead was python3 -m pip install --user --upgrade buildozer
. I'm guessing this is because Ubuntu 22.04 ships with multiple versions of Python3? I'm not sure what the underlying implications here are, but the above worked for me.
Once you get installation headaches out of the way, the Kivy tutorials are also pretty self-explanatory. Unlike beeware, they have an extremely general widget model that lets you do things like specify tappable/swipeable images and do all the mobile app things you're used to. They've even got a separate, even-more-mobile-focused toolkit named KivyMD which I might look at if I hit any walls in terms of UI responsiveness. Also unlike beeware, they seem to have a YAML-based specification language for their UI components? Honestly, this seems pretty insane, but from what I've seen, you can easily build your own object trees inside of .py
files without bothering with .kv
s at all. Which is exactly what I intend to do, but your mileage may vary.
I haven't done any serious work with either of these frameworks yet, but I have done the basic hello world in both. And I've got a few projects kicking around my head that I think could benefit from being implemented as desktop/mobile apps which this exploration is getting me closer to actually implementing.
As always, I'll let you know how it goes.