This commit is contained in:
EthanShoeDev
2025-09-13 22:19:02 -04:00
parent b545a5b1fa
commit 4ca74f4ea2
3 changed files with 2039 additions and 59 deletions

110
flake.nix
View File

@@ -1,4 +1,5 @@
{
# nix run nixpkgs#alejandra -- format ./flake.nix
description = "Expo RN devshells (local emulator / remote AVD)";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
@@ -9,25 +10,31 @@
};
};
outputs = { self, nixpkgs, android-nixpkgs, ... }:
let
systems = [ "x86_64-linux" "aarch64-darwin" "x86_64-darwin" ];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system:
f {
pkgs = import nixpkgs {
inherit system;
overlays = [ android-nixpkgs.overlays.default ];
config.allowUnfree = true; # emulator is unfree
};
}
);
in
{
devShells = forAllSystems ({ pkgs }: let
makeAndroidSdk = mode:
let
androidSdk = pkgs.androidSdk (sdk:
if mode == "full" then
outputs = {
self,
nixpkgs,
android-nixpkgs,
...
}: let
systems = ["x86_64-linux" "aarch64-darwin" "x86_64-darwin"];
forAllSystems = f:
nixpkgs.lib.genAttrs systems (
system:
f {
pkgs = import nixpkgs {
inherit system;
overlays = [android-nixpkgs.overlays.default];
config.allowUnfree = true; # emulator is unfree
};
}
);
in {
devShells = forAllSystems ({pkgs}: let
makeAndroidSdk = mode: let
androidSdk = pkgs.androidSdk (
sdk:
if mode == "full"
then
(with sdk; [
cmdline-tools-latest
platform-tools
@@ -39,24 +46,23 @@
ndk-26-1-10909125
cmake-3-22-1
])
else if mode == "remote" then
else if mode == "remote"
then
(with sdk; [
cmdline-tools-latest # ← required for a valid SDK
platform-tools # adb/fastboot
cmdline-tools-latest # ← required for a valid SDK
platform-tools # adb/fastboot
])
else
throw "makeAndroidSdk: unknown mode '${mode}'. Use \"full\" or \"remote\"."
);
else throw "makeAndroidSdk: unknown mode '${mode}'. Use \"full\" or \"remote\"."
);
# Standard path from nixpkgs' androidSdk wrapper
# https://ryantm.github.io/nixpkgs/languages-frameworks/android/#notes-on-environment-variables-in-android-projects
sdkRoot = "${androidSdk}/libexec/android-sdk";
in
{
inherit androidSdk sdkRoot;
};
# Standard path from nixpkgs' androidSdk wrapper
# https://ryantm.github.io/nixpkgs/languages-frameworks/android/#notes-on-environment-variables-in-android-projects
sdkRoot = "${androidSdk}/libexec/android-sdk";
in {
inherit androidSdk sdkRoot;
};
fullAndroidSdk = makeAndroidSdk "full";
fullAndroidSdk = makeAndroidSdk "full";
remoteAndroidSdk = makeAndroidSdk "remote";
defaultPkgs = with pkgs; [
@@ -68,9 +74,11 @@
watchman
jdk17
gradle_8
cmake
ninja
pkg-config
];
in {
# Minimal: only universal dev tools you always want
default = pkgs.mkShell {
packages = defaultPkgs;
@@ -78,7 +86,7 @@
# Local emulator: full SDK + AVD bits for API 36
android-local = pkgs.mkShell {
packages = defaultPkgs ++ [ fullAndroidSdk.androidSdk ];
packages = defaultPkgs ++ [fullAndroidSdk.androidSdk];
shellHook = ''
# Resolve SDK root robustly (libexec first, then share)
_CANDS=(
@@ -117,21 +125,23 @@
# Remote AVD workflow: no emulator/image; add scrcpy + adb only
android-remote = pkgs.mkShell {
packages = defaultPkgs ++ [
remoteAndroidSdk.androidSdk # provides adb/fastboot only
pkgs.scrcpy
];
shellHook = ''
export ANDROID_SDK_ROOT="${remoteAndroidSdk.sdkRoot}"
export ANDROID_HOME="${remoteAndroidSdk.sdkRoot}"
export PATH="${remoteAndroidSdk.sdkRoot}/platform-tools:$PATH"
hash -r
echo "Using Nix adb from: $ANDROID_SDK_ROOT"
which -a adb
adb version || true
echo "Tip: ssh -N -L 5037:127.0.0.1:5037 user@remote && scrcpy"
'';
};
packages =
defaultPkgs
++ [
remoteAndroidSdk.androidSdk # provides adb/fastboot only
pkgs.scrcpy
];
shellHook = ''
export ANDROID_SDK_ROOT="${remoteAndroidSdk.sdkRoot}"
export ANDROID_HOME="${remoteAndroidSdk.sdkRoot}"
export PATH="${remoteAndroidSdk.sdkRoot}/platform-tools:$PATH"
hash -r
echo "Using Nix adb from: $ANDROID_SDK_ROOT"
which -a adb
adb version || true
echo "Tip: ssh -N -L 5037:127.0.0.1:5037 user@remote && scrcpy"
'';
};
});
};
}