summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2025-07-15 15:36:45 +0200
committerAlbin <albin@mullvad.net>2025-07-15 15:36:45 +0200
commitcb54481e9ee5574360d88ce779f4c56cab2e72b4 (patch)
tree2c72d412d0beb874852762d57f275a6efccb354c
parent738dba4550bf09920d70b7cebda58ee9d081b462 (diff)
downloadmullvadvpn-cb54481e9ee5574360d88ce779f4c56cab2e72b4.tar.xz
mullvadvpn-cb54481e9ee5574360d88ce779f4c56cab2e72b4.zip
Add android devshell flake
-rw-r--r--android/flake.nix104
-rw-r--r--android/nix/env-vars.nix84
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";
+ }
+]