11FROM ubuntu:22.04
22
3- # Set environment variables for the Android SDK and NDK, and the API level.
4- ENV ANDROID_API_LEVEL="22"
3+ # Environment setup
4+ ENV ANDROID_API_LEVEL=22
55ENV ANDROID_NDK_VERSION=r22
6- ENV ANDROID_SDK_ROOT="/usr/lib/android-sdk"
7- ENV ANDROID_HOME="/usr/lib/android-sdk"
8- ENV ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk-bundle"
9- ENV ANDROID_NDK_PATH="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin"
10- ENV NDK_SYSROOT="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot"
11-
12- # Set non-interactive mode for SDK manager.
6+ ENV ANDROID_SDK_ROOT=/usr/lib/android-sdk
7+ ENV ANDROID_HOME=/usr/lib/android-sdk
8+ ENV ANDROID_NDK_HOME=${ANDROID_SDK_ROOT}/ndk-bundle
9+ ENV ANDROID_NDK_PATH=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin
10+ ENV NDK_SYSROOT=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot
1311ENV DEBIAN_FRONTEND=noninteractive
1412
1513# Install dependencies
1614RUN apt-get update && \
17- apt-get install -y \
18- wget curl git build-essential file unzip \
19- python3 python3-pip pkg-config openjdk-17-jdk \
20- cmake ninja-build clang && \
15+ apt-get install -y wget curl git build-essential file unzip \
16+ python3 python3-pip pkg-config openjdk-17-jdk \
17+ cmake ninja-build clang && \
2118 rm -rf /var/lib/apt/lists/*
2219
23- # Set JAVA_HOME and update PATH
24- ENV JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
25- ENV PATH="${PATH}:${JAVA_HOME}/bin"
20+ ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
21+ ENV PATH=${PATH}:${JAVA_HOME}/bin
2622
2723# Install Android SDK command-line tools
2824RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \
@@ -32,45 +28,25 @@ RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \
3228 mv ${ANDROID_SDK_ROOT}/cmdline-tools/latest/cmdline-tools/* ${ANDROID_SDK_ROOT}/cmdline-tools/latest/ && \
3329 rm -rf ${ANDROID_SDK_ROOT}/cmdline-tools/latest/cmdline-tools
3430
35- # Add SDK tools to PATH
36- ENV PATH="${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin"
31+ ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin
3732
38- # Install Android platform, build tools, and NDK
33+ # Install Android SDK packages
3934RUN yes | sdkmanager --licenses --sdk_root=${ANDROID_SDK_ROOT}
40- RUN sdkmanager "platforms;android-${ANDROID_API_LEVEL}" "build-tools;${ANDROID_API_LEVEL}.0.0" "ndk-bundle" "cmake;3.22.1" \
41- --sdk_root=${ANDROID_SDK_ROOT}
35+ RUN sdkmanager "platforms;android-${ANDROID_API_LEVEL}" "build-tools;${ANDROID_API_LEVEL}.0.0" "ndk-bundle" "cmake;3.22.1" --sdk_root=${ANDROID_SDK_ROOT}
4236
43- # Add NDK to PATH
44- ENV PATH="${ANDROID_NDK_PATH}:${PATH}"
37+ ENV PATH=${ANDROID_NDK_PATH}:${PATH}
4538
4639# Install Rust
4740ENV RUSTUP_HOME=/root/.rustup
4841ENV CARGO_HOME=/root/.cargo
49- ENV PATH=" /root/.cargo/bin:${PATH}"
42+ ENV PATH=/root/.cargo/bin:${PATH}
5043
5144RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
52-
53- # Ensure stable toolchain and Android targets
54- RUN rustup toolchain install stable
55- RUN rustup default stable
45+ RUN rustup toolchain install stable && rustup default stable
5646RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
5747
58- # Debug toolchain setup
59- RUN echo "=== TOOLCHAIN DEBUG ===" && \
60- rustup show && \
61- rustup target list --installed && \
62- ls -la /root/.rustup/toolchains/*/lib/rustlib/ | grep -E "(aarch64|armv7|x86_64|i686).*android" && \
63- find /root/.rustup -name "libcore*.rlib" -path "*android*" -ls
64-
65- # Verify NDK libraries (especially libunwind)
66- RUN echo "=== NDK LIBRARY DEBUG ===" && \
67- find ${NDK_SYSROOT} -name "libunwind*" -ls && \
68- ls -la ${NDK_SYSROOT}/usr/lib/aarch64-linux-android/${ANDROID_API_LEVEL} || echo "aarch64 API ${ANDROID_API_LEVEL} library directory not found!" && \
69- ls -la ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android* || echo "No aarch64 linkers found!"
70-
71- # Configure Cargo for Android cross-compilation (all 4 ABIs)
72- RUN echo "=== SETTING UP CARGO CONFIG ===" && \
73- mkdir -p /root/.cargo && \
48+ # Cargo config for Android cross-compilation (4 ABIs)
49+ RUN mkdir -p /root/.cargo && \
7450 cat > /root/.cargo/config.toml <<'EOF'
7551[target.aarch64-linux-android]
7652linker = "/usr/lib/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android22-clang"
@@ -94,8 +70,7 @@ rustflags = ["-C", "link-arg=--sysroot=/usr/lib/android-sdk/ndk-bundle/toolchain
9470EOF
9571
9672# Test with Cargo for all Android ABIs
97- RUN echo "=== TESTING WITH CARGO ===" && \
98- mkdir -p src && \
73+ RUN mkdir -p src && \
9974 echo '[package]' > Cargo.toml && \
10075 echo 'name = "test"' >> Cargo.toml && \
10176 echo 'version = "0.1.0"' >> Cargo.toml && \
@@ -106,15 +81,4 @@ RUN echo "=== TESTING WITH CARGO ===" && \
10681 cargo build --target $TARGET --verbose; \
10782 done
10883
109- # Test direct rustc compilation for aarch64
110- RUN echo "=== TESTING WITH RUSTC ===" && \
111- echo 'fn main() {}' > test.rs && \
112- rustc --target aarch64-linux-android --edition 2021 test.rs \
113- --sysroot ${NDK_SYSROOT} \
114- -C linker=${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang \
115- -C link-arg=-L${NDK_SYSROOT}/usr/lib/aarch64-linux-android \
116- -C link-arg=-L${NDK_SYSROOT}/usr/lib/aarch64-linux-android/${ANDROID_API_LEVEL}
117-
118- RUN echo "Test compilation successful!"
119-
12084CMD ["bash" ]
0 commit comments