Posts and how to...

Many useful articles and instructions!

    Building Android applications on Linux ARM (aarch64) directly on a smartphone via Termux

    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.