cd ~{,/zhs/}

Containerize Android Studio with systemd-nspawn

Meta Info

Create Btrfs Subvolume

# su # switch to root user
# cd /var/lib/machines
# container_name=android-studio
# btrfs subvolume create $container_name

Then it will be easy to snapshot and migrate the container.

Install Minimal Ubuntu

Reference: systemd-nspawn - ArchWiki

Codename of current latest LTS version of Ubuntu is focal.

# codename=focal
# repository_url='https://mirrors.bfsu.edu.cn/ubuntu/'
# debootstrap --include=systemd-container \
--components=main,universe $codename $container_name $repository_url

After installation, run systemd-nspawn --machine=$container_name to boot into brand new container.

Network

You may need to add --bind-ro=/etc/resolv.conf option to make DNS work in container.

To check network status, consider commands ping 1.1.1.1 and ping archlinux.org: if former works and latter doesn’t, it would be DNS problem.

32-bit Libraries

Inside container, enable i386 architecture and install the libraries.

# dpkg --add-architecture i386
# apt-get update
# apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386

Android Studio

You could either curl/wget the latest version package inside container, or download it on host and mount it to container:

# host_as_archive='/data/Downloads/android-studio-ide-202.7486908-linux.tar.gz'
# systemd-nspawn --machine=$container_name --bind-ro=$host_as_archive:/tmp/as.tar.gz

Inside container, add a dedicated normal user named “android” and extract Android Studio to user home:

# useradd --create-home android
# su - android
# tar --extract --verbose --file=/tmp/as.tar.gz
# mv android-studio studio

After this, Android Studio is installed under /home/android/studio/, run /home/android/studio/bin/studio.sh to start up:

# user=android
# startup_script='/home/android/studio/bin/studio.sh'
# systemd-nspawn --machine=$container_name --user=$user $startup_script

Oh no, this won’t work because I forget to mention Xorg stuff. Command options become just too many, from this step we need start to actually write up a shell script to run Android Studio in GUI.

Fix Dependency

TL;DR: Run apt-get install libxext6 libxrender1 libxtst6 libxi6 libfreetype6 fontconfig to start up.

This log complains about missing library file libXext.so.6, so let’s try a “reverse query”:

# systemd-nspawn --machine=$container_name --bind-ro=/etc/resolv.conf
# apt-get install apt-file
# apt-file update
# apt-file search libXext.so.6

It turned out the package name should be libxext6. After installing it, another four same errors came along, so all the missing libraries would be:

apt-get install libxext6 libxrender1 libxtst6 libxi6 libfreetype6

Android Studio finally starts up… but crashes right away. The log mentions “font” a lot, so I tried installing fontconfig package then it finally starts up.

Fix Cursor Theme

Mount host icon theme to container and set environment variable:

# host_data=/usr/share
# data=/home/$user/.local/share
# systemd-nspawn --machine=$container_name \
--bind-ro=$host_data/icons:$data/icons --setenv=XCURSOR_PATH=$data/icons

Install X cursor management library in container:

# systemd-nspawn --machine=$container_name --bind-ro=/etc/resolv.conf apt-get install libxcursor1

Wrap Up

I wrote a fish-shell script, and a desktop entry according to AUR.