Building an Android App on Linux ARM (aarch64)

Guide for AI assistants: how to build an Android project on a Linux ARM host (for example, Ubuntu 24.04 aarch64) when the default aapt2 from Android Gradle Plugin does not start.

1) Check architecture and base tools

uname -m
# expected: aarch64
sudo apt-get update
sudo apt-get install -y openjdk-17-jdk unzip wget curl jq
java -version

2) Install Gradle (if missing)

Recommended example: 8.7 (compatible with AGP 8.5.x).

GRADLE_VERSION=8.7
cd /tmp
wget -q https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip
unzip -q -o gradle-${GRADLE_VERSION}-bin.zip
sudo mv /tmp/gradle-${GRADLE_VERSION} /opt/gradle-${GRADLE_VERSION}
sudo ln -sf /opt/gradle-${GRADLE_VERSION}/bin/gradle /usr/local/bin/gradle
gradle -v

3) Install Android SDK command-line tools

SDK_ROOT=/opt/android-sdk
TOOLS_ZIP=/tmp/commandlinetools.zip
sudo mkdir -p "$SDK_ROOT/cmdline-tools/latest"
wget -q -O "$TOOLS_ZIP" https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
sudo unzip -q -o "$TOOLS_ZIP" -d "$SDK_ROOT/cmdline-tools/latest"
if [ -d "$SDK_ROOT/cmdline-tools/latest/cmdline-tools" ]; then
  sudo mv "$SDK_ROOT/cmdline-tools/latest/cmdline-tools"/* "$SDK_ROOT/cmdline-tools/latest"/
  sudo rmdir "$SDK_ROOT/cmdline-tools/latest/cmdline-tools"
fi
sudo "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$SDK_ROOT" --version

Accept licenses and install SDK components:

SDK_ROOT=/opt/android-sdk
(yes | sudo "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$SDK_ROOT" --licenses) || true
sudo "$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$SDK_ROOT" \
  "platform-tools" \
  "platforms;android-34" \
  "build-tools;34.0.0"

4) Configure the project

Create local.properties in the project root:

sdk.dir=/opt/android-sdk

If resources use theme Theme.Material3.DayNight.NoActionBar, make sure this dependency exists:

implementation("com.google.android.material:material:1.12.0")

5) ARM aapt2 issue and fix

On ARM, build often fails with errors like:

  • AAPT2 ... Daemon startup failed

  • or cannot execute for x86_64 aapt2.
  • Fix: use ARM64 aapt2 (community static build).

    sudo mkdir -p /opt/android-arm-tools
    cd /opt/android-arm-tools
    wget -q https://github.com/lzhiyong/android-sdk-tools/releases/download/35.0.2/android-sdk-tools-static-aarch64.zip -O tools.zip
    sudo unzip -q -o tools.zip
    sudo install -m 755 /opt/android-arm-tools/build-tools/aapt2 /usr/local/bin/aapt2
    /usr/local/bin/aapt2 version

    Add this to project gradle.properties:

    android.aapt2FromMavenOverride=/usr/local/bin/aapt2

    6) Build APK

    cd /path/to/project
    ANDROID_HOME=/opt/android-sdk gradle --no-daemon assembleDebug

    After success, APK is usually located at:

    app/build/outputs/apk/debug/app-debug.apk

    7) Quick troubleshooting

  • SDK location not found:

  • - check local.properties and ANDROID_HOME.
  • Custom AAPT2 location does not point to an AAPT2 executable:

  • - path must point to an executable named aapt2.
  • resource style/Theme.Material3... not found:

  • - add com.google.android.material:material.
  • AAPT2 Daemon startup failed on ARM:

- verify ARM aapt2 is used via android.aapt2FromMavenOverride.

8) Stability note

Official Android toolchain on Linux is primarily x86_64-oriented. ARM flow with community aapt2 works, but is unofficial. For production CI, keep a fallback x86_64 pipeline.