Today at Red Hat we have another “Day of Learning”. To this day I have never touched Android development, just installing various flavours and configuring it. But I’ve been curious about it for a while now, mostly to be able to fix a little thing here and there in all the great things available on F-Droid. So today was an excellent opportunity!
The first thing to do is to install Android Studio. This is quite straightforward – download the tarball, unpack it, and run
studio.sh inside it. It even bundles a Java Runtime Environment, so I was quite surprised that it was not missing any dependency even on my radically minimal system (I fully expected having to install tons of stuff in toolbox).
However, I only have sway+wayland these days, and after the initial splash screen Studio just greets you with an empty window. A quick internet search revealed the
_JAVA_AWT_WM_NONREPARENTING=1 trick, that makes it kinda sorta start – but none of the popup windows work, and typing into the editor is utterly slow. So, adding back all the X.org/i3 packages, do an OSTree rebuild and reboot, and voilà, Studio starts properly!
The first thing that it does is to download another few GBs of Android SDK, emulator images and such – so I did all that as a separate user, to avoid littering my home directory and making my backup explode.
The only hiccup that I encountered was that
adb devices kept saying
no permissions for my Nexus 4 – turns out that one needs to switch the USB mode from “charging” to “MTP”. After that, things work great!
I then went on to complete the tutorial with adding a simple UI with a second intent and some interaction (commit), plus some more RTFM about details about App fundamentals.
I then wanted to add a button to take a picture with the default camera app and show the thumbnail. Allegedly that’s fairly simple, and indeed it does switch to the camera app just fine. But once I click on the OK button in the camera app and it returns to my app, the intent’s result code is always -1 and I get no data. I suspected a missing camera permission, but adding
android.permission.CAMERA doesn’t help. I gave up here, mostly because I ran out of time. (commit)
Taking it apart a bit
I work on the command line and in vim all day long, so naturally I wanted to explore how development feels there. So I removed all runtime data, builds (with
git clean -fdx), emulators and settings (
rm -r ~/.android), etc. and started over. One piece of generic setup is to have Java set up properly, I just point it to the bundled one from Studio:
export JAVA_HOME=~/android-studio/jre export ANDROID_SDK_ROOT=~/Android/Sdk
Fortunately the documentation for that is really good as well – e. g. it’s easy to build an emulator image for a chosen model and API:
~/Android/Sdk/tools/bin/avdmanager create avd -n emu -d pixel -k "system-images;android-29;google_apis;x86" ~/Android/Sdk/tools/bin/avdmanager list
After that, the emulator can be run with
~/Android/Sdk/emulator/emulator -avd emu &
Building a project in the project directory is also simple:
And so is installing it into the device (emulator or real phone):
I haven’t yet found out how to select a target device, as I had the emulator and the Nexus 4 online at the same time. So I just disconnected/stopped the one I didn’t want.
Look at another project
Finally I took a look at an existing app – the first one that came to my mind was Anuto, a really cute little tower defence game that I already sank many hours into. I went through its repository, and now the general layout and what happens makes some vague sense to me. I also tried to build it (with gradle on the command line), which at first failed:
Failed to install the following Android SDK packages as some licences have not been accepted.
Surely there’s a way to overcome that on the CLI, but I just loaded it in Studio once, downloaded the API (the project uses 28, while my hello world uses 29), and after that everything worked fine. I could make a simple modification to the game,
installDebug it, and I saw the result on my phone.
I had no particular goal or reason for this, other than “just for fun” – my developer home is clearly on the Linux desktop and server. But I do enjoy the many nice free apps on AOSP/Android, so if I ever run into a little bug that itches me, I now at least have the tools and initial knowledge to try and scratch it.
It did take most of the workday, but it was enjoyable and worth the effort. Happy hacking!