diff options
| author | Albin <albin@mullvad.net> | 2025-07-15 15:36:45 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2025-07-15 15:36:45 +0200 |
| commit | cb54481e9ee5574360d88ce779f4c56cab2e72b4 (patch) | |
| tree | 2c72d412d0beb874852762d57f275a6efccb354c | |
| parent | 738dba4550bf09920d70b7cebda58ee9d081b462 (diff) | |
| download | mullvadvpn-cb54481e9ee5574360d88ce779f4c56cab2e72b4.tar.xz mullvadvpn-cb54481e9ee5574360d88ce779f4c56cab2e72b4.zip | |
Add android devshell flake
| -rw-r--r-- | android/flake.nix | 104 | ||||
| -rw-r--r-- | android/nix/env-vars.nix | 84 |
2 files changed, 188 insertions, 0 deletions
diff --git a/android/flake.nix b/android/flake.nix new file mode 100644 index 0000000000..0d75da2038 --- /dev/null +++ b/android/flake.nix @@ -0,0 +1,104 @@ +{ + description = "Mullvad Android app build flake"; + + inputs = { + # Unstable is currently needed for protoc-gen-grpc-java. + # We should switch to a stable channel once it's avaiable on those. + nixpkgs.url = "nixpkgs/nixos-unstable"; + devshell.url = "github:numtide/devshell"; + flake-utils.url = "github:numtide/flake-utils"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + android-nixpkgs = { + url = "github:tadfisher/android-nixpkgs"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { + self, + nixpkgs, + android-nixpkgs, + rust-overlay, + flake-utils, + devshell, + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs { + inherit system; + overlays = [ + (import rust-overlay) + devshell.overlays.default + ]; + }; + + rust-toolchain = (pkgs.buildPackages.rust-bin.fromRustupToolchainFile + ../rust-toolchain.toml).override { + extensions = ["rust-analyzer"]; + targets = [ + "aarch64-linux-android" + "armv7-linux-androideabi" + "x86_64-linux-android" + "i686-linux-android" + ]; + }; + + patchedGo_1_21_3 = + (import (fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/b392079f5fd051926a834c878d27ceec4f139dce.tar.gz"; + sha256 = "16dkk98fs9pw2amz0vpjsc7ks85cw3hc5rlpbp27llq6x7lwpjaz"; + }) {inherit system;}).go_1_21.overrideAttrs (oldAttrs: { + patches = (oldAttrs.patches or []) ++ [./docker/goruntime-boottime-over-monotonic.diff]; + }); + + versions = + (builtins.fromTOML ( + builtins.concatStringsSep "\n" ( + builtins.filter (line: !(builtins.match "^[[:space:]]*#" line != null)) + (nixpkgs.lib.splitString "\n" (builtins.readFile ./gradle/libs.versions.toml)) + ) + )).versions; + + compileSdkVersion = versions."compile-sdk"; + buildToolsVersion = versions."build-tools"; + minSdkVersion = versions."min-sdk"; + ndkVersion = versions.ndk; + + android-sdk = android-nixpkgs.sdk.${system} (sdkPkgs: + with sdkPkgs; [ + (builtins.getAttr "platforms-android-${compileSdkVersion}" sdkPkgs) + (builtins.getAttr "build-tools-${builtins.replaceStrings ["."] ["-"] buildToolsVersion}" sdkPkgs) + (builtins.getAttr "ndk-${builtins.replaceStrings ["."] ["-"] ndkVersion}" sdkPkgs) + cmdline-tools-latest + platform-tools + ]); + in { + overlay = final: prev: { + inherit (self.packages.${system}) android-sdk; + }; + + packages = { + inherit android-sdk; + }; + + devShells.default = pkgs.devshell.mkShell { + name = "mullvad-android-devshell"; + packages = [ + android-sdk + rust-toolchain + patchedGo_1_21_3 + pkgs.protoc-gen-grpc-java + pkgs.gcc + pkgs.gnumake + pkgs.protobuf + pkgs.jdk17 + pkgs.python3Full + ]; + env = import ./nix/env-vars.nix { + inherit pkgs android-sdk buildToolsVersion ndkVersion minSdkVersion; + }; + }; + }); +} diff --git a/android/nix/env-vars.nix b/android/nix/env-vars.nix new file mode 100644 index 0000000000..e9f5d6aa62 --- /dev/null +++ b/android/nix/env-vars.nix @@ -0,0 +1,84 @@ +{ + pkgs, + android-sdk, + buildToolsVersion, + ndkVersion, + minSdkVersion, +}: [ + { + name = "JAVA_HOME"; + value = "${pkgs.jdk17}"; + } + { + name = "PROTOC_GEN_GRPC_JAVA_PLUGIN"; + prefix = "${pkgs.protoc-gen-grpc-java}/bin/protoc-gen-grpc-java"; + } + { + name = "GRADLE_OPTS"; + value = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${android-sdk}/share/android-sdk/build-tools/${buildToolsVersion}/aapt2"; + } + { + name = "ANDROID_HOME"; + value = "${android-sdk}/share/android-sdk"; + } + { + name = "ANDROID_SDK_ROOT"; + value = "${android-sdk}/share/android-sdk"; + } + { + name = "ANDROID_NDK_ROOT"; + value = "${android-sdk}/share/android-sdk/ndk/${ndkVersion}"; + } + { + name = "NDK_TOOLCHAIN_DIR"; + value = "${android-sdk}/share/android-sdk/ndk/${ndkVersion}/toolchains/llvm/prebuilt/linux-x86_64/bin"; + } + { + name = "AR_aarch64_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/llvm-ar"; + } + { + name = "CC_aarch64_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/aarch64-linux-android${minSdkVersion}-clang"; + } + { + name = "CARGO_TARGET_aarch64_LINUX_ANDROID_LINKER"; + value = "$NDK_TOOLCHAIN_DIR/aarch64-linux-android${minSdkVersion}-clang"; + } + { + name = "AR_armv7_linux_androideabi"; + value = "$NDK_TOOLCHAIN_DIR/llvm-ar"; + } + { + name = "CC_armv7_linux_androideabi"; + value = "$NDK_TOOLCHAIN_DIR/armv7-linux-androideabi${minSdkVersion}-clang"; + } + { + name = "CARGO_TARGET_armv7_LINUX_ANDROID_LINKER"; + value = "$NDK_TOOLCHAIN_DIR/armv7-linux-androideabi${minSdkVersion}-clang"; + } + { + name = "AR_x86_64_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/llvm-ar"; + } + { + name = "CC_x86_64_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/x86_64-linux-android${minSdkVersion}-clang"; + } + { + name = "CARGO_TARGET_x86_64_LINUX_ANDROID_LINKER"; + value = "$NDK_TOOLCHAIN_DIR/x86_64-linux-android${minSdkVersion}-clang"; + } + { + name = "AR_i686_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/llvm-ar"; + } + { + name = "CC_i686_linux_android"; + value = "$NDK_TOOLCHAIN_DIR/i686-linux-android${minSdkVersion}-clang"; + } + { + name = "CARGO_TARGET_i686_LINUX_ANDROID_LINKER"; + value = "$NDK_TOOLCHAIN_DIR/i686-linux-android${minSdkVersion}-clang"; + } +] |
