nix flake 的 devShell 完全可以配置安卓打包环境,就是资料不是很多
基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| { description = "Nix Building Environment for Android APP";
inputs = { flake-utils = { url = "github:numtide/flake-utils"; }; };
outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; android_sdk = { accept_license = true; }; }; }; buildToolsVersion = "35.0.0"; ndkVersion = "27.0.12077973"; androidComposition = pkgs.androidenv.composeAndroidPackages { buildToolsVersions = [ buildToolsVersion "34.0.0" ]; platformVersions = [ "35" "34" ]; abiVersions = [ "x86_64" "arm64-v8a" ]; includeNDK = true; useGoogleAPIs = false; useGoogleTVAddOns = false; includeEmulator = false; includeSystemImages = false; includeSources = false; }; pinnedJDK = pkgs.jdk21; androidSdk = androidComposition.androidsdk; in { devShells = { default = pkgs.mkShell { name = "Android-Build-Shell"; buildInputs = with pkgs; [ ] ++ [ androidSdk pinnedJDK ]; JAVA_HOME = pinnedJDK; ANDROID_HOME = "${androidSdk}/libexec/android-sdk"; NDK_HOME = "${androidSdk}/libexec/android-sdk/ndk/${ndkVersion}"; GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/${buildToolsVersion}/aapt2";
}; }; } ); }
|
然后使用 nix develop
进入开发环境
或者,可以使用另一种写法,这样可以锁定 nixpkgs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| { description = "bundle environment for hook101";
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; outputs = inputs: let javaVersion = 21;
supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; forEachSupportedSystem = f: inputs.nixpkgs.lib.genAttrs supportedSystems ( system: f { pkgs = import inputs.nixpkgs { inherit system; overlays = [ inputs.self.overlays.default ]; config.allowUnfree = true; config.android_sdk.accept_license = true; }; } ); in { overlays.default = final: prev: let jdk = prev."jdk${toString javaVersion}"; androidComposition = prev.androidenv.composeAndroidPackages { includeNDK = true;
useGoogleAPIs = false; useGoogleTVAddOns = false; includeEmulator = false; includeSystemImages = false; includeSources = false; }; androidSdk = androidComposition.androidsdk; in { inherit jdk; inherit androidSdk; gradle = prev.gradle.override { java = jdk; }; }; devShells = forEachSupportedSystem ( { pkgs }: { default = pkgs.mkShell { packages = with pkgs; [ jdk androidSdk gradle ];
JAVA_HOME = pkgs.jdk; ANDROID_HOME= "${pkgs.androidSdk}/libexec/android-sdk"; }; } ); }; }
|
变量
变量要看你的 build.gradle
和 flake.nix
, 一般我们让 flake 适配原来的 gradle script
1 2 3 4 5 6 7 8 9 10 11
| buildscript { ext { buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0' minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25'
ndkVersion = "27.0.12077973" } }
|
flake.nix
里面配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| buildToolsVersion = "35.0.0"; ndkVersion = "27.0.12077973"; androidComposition = pkgs.androidenv.composeAndroidPackages { buildToolsVersions = [ buildToolsVersion ]; platformVersions = [ "35" ]; abiVersions = [ "x86_64" "arm64-v8a" ]; includeNDK = true; useGoogleAPIs = false; useGoogleTVAddOns = false; includeEmulator = false; includeSystemImages = false; includeSources = false; }; pinnedJDK = pkgs.jdk21; androidSdk = androidComposition.androidsdk;
|
其他可配置项目
见compose-android-packages
例如指定 cmake 版本
1 2 3 4 5
| androidComposition = pkgs.androidenv.composeAndroidPackages { ... cmakeVersions = [ "3.22.1" ]; ... };
|
React Native
添加 nodejs 和 yarn 即可
1 2 3 4 5 6 7 8
| buildInputs = with pkgs; [ nodejs_18 yarn ] ++ [ androidSdk pinnedJDK ];
|
可能遇到的问题
Still waiting for package manifests to be fetched remotely
1 2 3
| Errors during XML parse: Additionally, the fallback loader failed to parse the XML. Still waiting for package manifests to be fetched remotely.
|
这是因为 gradle daemon 无法复用
关掉其他 daemon 即可