|
1 | | -{ pkgs ? import <nixpkgs> { config.allowUnfree = true; } }: |
| 1 | +{ pkgs ? import <nixpkgs> { |
| 2 | + config.allowUnfree = true; |
| 3 | + overlays = [ |
| 4 | + (import (builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz")) |
| 5 | + ]; |
| 6 | + } |
| 7 | +}: |
2 | 8 |
|
3 | 9 | with pkgs; |
4 | 10 |
|
5 | 11 | let |
| 12 | + # Android SDK with minimal components needed for building APKs |
6 | 13 | android-nixpkgs = callPackage <android-nixpkgs> { channel = "stable"; }; |
7 | 14 |
|
8 | 15 | android-sdk = android-nixpkgs.sdk (sdkPkgs: |
9 | 16 | with sdkPkgs; [ |
10 | | - cmdline-tools-latest |
11 | | - build-tools-34-0-0 |
12 | | - platform-tools |
13 | | - platforms-android-34 |
14 | | - emulator |
15 | | - cmake-3-22-1 |
16 | | - ndk-26-1-10909125 |
| 17 | + cmdline-tools-latest # SDK manager |
| 18 | + build-tools-34-0-0 # Required by gradle |
| 19 | + platforms-android-34 # API 34 for compilation |
| 20 | + ndk-26-1-10909125 # Native compilation for Rust |
17 | 21 | ]); |
18 | 22 |
|
| 23 | + # Rust toolchain with Android targets |
| 24 | + rust-android = rust-bin.stable.latest.default.override { |
| 25 | + extensions = [ "rust-src" ]; |
| 26 | + targets = [ "aarch64-linux-android" ]; |
| 27 | + }; |
| 28 | + |
19 | 29 | in mkShell { |
20 | | - buildInputs = [ android-studio android-sdk jdk ]; |
21 | | - nativeBuildInputs = |
22 | | - [ cargo cargo-ndk rustc rust-analyzer rustfmt clippy rustup ]; |
| 30 | + buildInputs = [ |
| 31 | + android-sdk |
| 32 | + jdk17 # Required by gradle |
| 33 | + gradle # APK assembly |
| 34 | + cargo-ndk # Builds Rust for Android targets |
| 35 | + rust-android # Rust with Android targets |
| 36 | + cmake # Required by aws-lc-sys for crypto |
| 37 | + pkg-config # Required for library detection |
| 38 | + zlib # System zlib to avoid NDK build issues |
| 39 | + clang # Host C compiler for build scripts |
| 40 | + llvmPackages.bintools # Host linker |
| 41 | + ]; |
| 42 | + |
| 43 | + # Android SDK/NDK environment variables |
| 44 | + ANDROID_HOME = "${android-sdk}/share/android-sdk"; |
| 45 | + ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk"; |
| 46 | + ANDROID_NDK_ROOT = "${android-sdk}/share/android-sdk/ndk/26.1.10909125"; |
| 47 | + NDK_HOME = "${android-sdk}/share/android-sdk/ndk/26.1.10909125"; |
| 48 | + |
| 49 | + # Configure cargo-ndk to use system zlib instead of building it |
| 50 | + ZLIB_SYS_STATIC = "0"; |
| 51 | + PKG_CONFIG_ALLOW_CROSS = "1"; |
| 52 | + |
| 53 | + GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${android-sdk}/share/android-sdk/build-tools/34.0.0/aapt2"; |
23 | 54 |
|
24 | | - GRADLE_OPTS = |
25 | | - "-Dorg.gradle.project.android.aapt2FromMavenOverride=${android-sdk}/share/android-sdk/build-tools/34.0.0/aapt2"; |
| 55 | + shellHook = '' |
| 56 | + # Generate local.properties with Nix store paths |
| 57 | + cat > android/local.properties <<EOF |
| 58 | +sdk.dir=$ANDROID_SDK_ROOT |
| 59 | +ndk.dir=$ANDROID_NDK_ROOT |
| 60 | +EOF |
| 61 | +
|
| 62 | + # Set host compilers for build scripts (before cargo-ndk overrides them) |
| 63 | + export CC_x86_64_unknown_linux_gnu=${pkgs.clang}/bin/clang |
| 64 | + export CXX_x86_64_unknown_linux_gnu=${pkgs.clang}/bin/clang++ |
| 65 | + export AR_x86_64_unknown_linux_gnu=${pkgs.llvmPackages.bintools}/bin/ar |
| 66 | +
|
| 67 | + # Welcome message with build instructions |
| 68 | + echo "Android build environment ready" |
| 69 | + echo "Rust version: $(rustc --version)" |
| 70 | + echo "" |
| 71 | + echo "To build APK:" |
| 72 | + echo " # Debug build:" |
| 73 | + echo " cargo ndk -t arm64-v8a -o android/app/src/main/jniLibs build" |
| 74 | + echo " cd android && ./gradlew assembleDebug" |
| 75 | + echo "" |
| 76 | + echo " # Release build:" |
| 77 | + echo " cargo ndk -t arm64-v8a -o android/app/src/main/jniLibs build --release" |
| 78 | + echo " cd android && ./gradlew assembleRelease" |
| 79 | + echo "" |
| 80 | + echo "APK output: android/app/build/outputs/apk/" |
| 81 | + ''; |
26 | 82 | } |
| 83 | + |
| 84 | +# Usage: |
| 85 | +# nix-shell Enter development environment |
| 86 | +# |
| 87 | +# Build APK: |
| 88 | +# Debug: cargo ndk -t arm64-v8a -o android/app/src/main/jniLibs build && cd android && ./gradlew assembleDebug |
| 89 | +# Release: cargo ndk -t arm64-v8a -o android/app/src/main/jniLibs build --release && cd android && ./gradlew assembleRelease |
| 90 | +# |
| 91 | +# To add debugging tools, include in buildInputs: |
| 92 | +# - platform-tools (for adb, fastboot) |
| 93 | +# - emulator (for Android Virtual Device) |
| 94 | +# - android-studio (for GUI development) |
0 commit comments