From 4d240efde95a24f3f5adc933d31c13135c49923a Mon Sep 17 00:00:00 2001 From: 21paradox Date: Fri, 15 Aug 2025 16:59:11 +0800 Subject: [PATCH] add a android flake.nix for local development/test/build (#1237) --- easytier-gui/.gitignore | 2 + easytier-gui/flake.lock | 116 ++++++++++++++++++++++++++++++ easytier-gui/flake.nix | 151 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 269 insertions(+) create mode 100644 easytier-gui/flake.lock create mode 100644 easytier-gui/flake.nix diff --git a/easytier-gui/.gitignore b/easytier-gui/.gitignore index 3613fa4..490f6b5 100644 --- a/easytier-gui/.gitignore +++ b/easytier-gui/.gitignore @@ -25,3 +25,5 @@ dist-ssr *.sw? vite.config.ts.timestamp* + +local.properties \ No newline at end of file diff --git a/easytier-gui/flake.lock b/easytier-gui/flake.lock new file mode 100644 index 0000000..ee46c02 --- /dev/null +++ b/easytier-gui/flake.lock @@ -0,0 +1,116 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1754725699, + "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-android": { + "locked": { + "lastModified": 1754725699, + "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", + "type": "github" + } + }, + "nixpkgs-java": { + "locked": { + "lastModified": 1754725699, + "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "nixpkgs-android": "nixpkgs-android", + "nixpkgs-java": "nixpkgs-java", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1754966322, + "narHash": "sha256-7f/LH60DnjjQVKbXAsHIniGaU7ixVM7eWU3hyjT24YI=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "7c13cec2e3828d964b9980d0ffd680bd8d4dce90", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/easytier-gui/flake.nix b/easytier-gui/flake.nix new file mode 100644 index 0000000..93d3757 --- /dev/null +++ b/easytier-gui/flake.nix @@ -0,0 +1,151 @@ +{ + # usage: + # nix develop .#android --extra-experimental-features "nix-command flakes" + # pnpm tauri android build + description = "Android build environment for EasyTier"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # java21 + nixpkgs-java.url = "github:NixOS/nixpkgs/85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054"; + #nixpkgs-java.url = "github:NixOS/nixpkgs/nixos-unstable"; + # androidEnv + nixpkgs-android.url = "github:NixOS/nixpkgs/85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054"; + #nixpkgs-android.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs, nixpkgs-java, nixpkgs-android, flake-utils, rust-overlay, ... }: + flake-utils.lib.eachDefaultSystem (system: + let + overlays = [ (import rust-overlay) ]; + pkgs = import nixpkgs { + inherit system overlays; + config = { licenseAccepted = true; allowUnfree = true; }; + }; + + rustVersion = "1.89.0"; + rustWithAndroid = pkgs.rust-bin.stable.${rustVersion}.default.override { + extensions = [ "rust-src" "rust-std" ]; + targets = [ + "aarch64-linux-android" + "armv7-linux-androideabi" + "i686-linux-android" + "x86_64-linux-android" + ]; + }; + includeAuto = pkgs.stdenv.hostPlatform.isx86_64 || pkgs.stdenv.hostPlatform.isDarwin; + # ndkVersion = "28.1.13356709"; + ndkVersion = "26.1.10909125"; + ndkVersions = [ + ndkVersion + ]; + + # Android 环境配置 + sdkArgs = { + includeNDK = true; + includeSources = true; + includeSystemImages = false; + includeEmulator = false; + inherit ndkVersions; + useGoogleAPIs = true; + useGoogleTVAddOns = true; + buildToolsVersions = [ "34.0.0" ]; + + # Make sure everything from the last decade works since we are not using system images. + numLatestPlatformVersions = 10; + includeExtras = [ + "extras;google;gcm" + ] + ++ pkgs.lib.optionals includeAuto [ + "extras;google;auto" + ]; + # Accepting more licenses declaratively: + extraLicenses = [ + # Already accepted for you with the global accept_license = true or + # licenseAccepted = true on androidenv. + # "android-sdk-license" + + # These aren't, but are useful for more uncommon setups. + "android-sdk-preview-license" + "android-googletv-license" + "android-sdk-arm-dbt-license" + "google-gdk-license" + "intel-android-extra-license" + "intel-android-sysimage-license" + "mips-android-sysimage-license" + ]; + }; + javaPkgs = import nixpkgs-java { inherit system; }; + androidEnv = pkgs.callPackage "${nixpkgs-android}/pkgs/development/mobile/androidenv" { + inherit pkgs; + licenseAccepted = true; + }; + androidComposition = androidEnv.composeAndroidPackages sdkArgs; + androidSdk = androidComposition.androidsdk; + platformTools = androidComposition.platform-tools; + cmake = androidComposition.cmake; + # NDK uses a specific host tag directory name which we can determine from the host platform + ndkHostTag = if pkgs.stdenv.isLinux then "linux-x86_64" else if pkgs.stdenv.isDarwin then "darwin-x86_64" else ""; + ndkToolchain = "${androidSdk}/libexec/android-sdk/ndk/${ndkVersion}/toolchains/llvm/prebuilt/${ndkHostTag}"; + in + + { + # android entry + devShells.android = pkgs.mkShell rec { + nativeBuildInputs = [ + rustWithAndroid + javaPkgs.jdk + androidSdk + platformTools + cmake + pkgs.glibc_multi.dev + # pkgs.clang + pkgs.pkg-config + pkgs.protobuf + + pkgs.nodejs_22 + pkgs.pnpm + ]; + buildInputs = []; + + LANG = "C.UTF-8"; + LC_ALL = "C.UTF-8"; + JAVA_HOME = "${javaPkgs.jdk}/lib/openjdk"; + + ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk"; + ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle"; + NDK_HOME = "${androidSdk}/libexec/android-sdk/ndk/${ndkVersion}"; + + LIBCLANG_PATH = "${ndkToolchain}/lib"; + KCP_SYS_EXTRA_HEADER_PATH = "${ndkToolchain}/lib/clang/19/include:${pkgs.glibc_multi.dev}/include"; + ZSTD_SYS_STATIC = "1"; + + BINDGEN_EXTRA_CLANG_ARGS = "--sysroot=${ndkToolchain}/sysroot -I${ndkToolchain}/lib/clang/17/include "; + + # 设置编译器标志 + shellHook = '' + echo "Android environment activated" + export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$(echo "$ANDROID_SDK_ROOT/build-tools/"*"/aapt2")" + cmake_root="$(echo "$ANDROID_SDK_ROOT/cmake/"*/)" + export PATH="$cmake_root/bin:$PATH" + + unset NIX_CFLAGS_COMPILE + unset NIX_CFLAGS_COMPILE_FOR_BUILD + + cat < local.properties + sdk.dir=$ANDROID_SDK_ROOT + ndk.dir=$ANDROID_NDK_ROOT + cmake.dir=$cmake_root + EOF + ''; + }; + + #devShells.default = pkgs.mkShell {}; + } + ); +}