app/flake.nix
2025-04-29 16:12:08 +03:00

196 lines
6.4 KiB
Nix

{
description = "Flutter 3.13.x";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
config = {
android_sdk.accept_license = true;
allowUnfree = true;
};
};
buildToolsVersion = "34.0.0";
androidComposition = pkgs.androidenv.composeAndroidPackages {
buildToolsVersions = [ buildToolsVersion "30.0.3" ];
platformVersions = [ "29" "30" "31" "32" "33" "34" "35" "28" ];
abiVersions = [ "armeabi-v7a" "arm64-v8a" ];
# toolsVersion = "26.1.1";
# platformToolsVersion = "33.0.3";
# # buildToolsVersions = [ buildToolsVersionForAapt2 ];
includeEmulator = true;
emulatorVersion = "34.1.19";
# platformVersions = [ "28" "29" "30" "31" ];
# includeSources = false;
# includeSystemImages = false;
# systemImageTypes = [ "google_apis_playstore" ];
# abiVersions = [ "armeabi-v7a" "arm64-v8a" ];
# cmakeVersions = [ "3.10.2" ];
includeNDK = true;
ndkVersions = [ "22.0.7026061" ];
# useGoogleAPIs = false;
useGoogleTVAddOns = false;
extraLicenses = [
"android-googletv-license"
"android-sdk-arm-dbt-license"
"android-sdk-license"
"android-sdk-preview-license"
"google-gdk-license"
"intel-android-extra-license"
"intel-android-sysimage-license"
"mips-android-sysimage-license"
];
};
androidSdk = androidComposition.androidsdk;
# pubspecLock = pkgs.lib.importJSON ./pubspec.lock.json;
gradleZip = pkgs.fetchurl {
url = builtins.readFile (
pkgs.runCommandLocal "distributionUrl"
{
nativeBuildInputs = with pkgs; [ coreutils ripgrep sd ];
}
''
rg -o --replace '$1' 'distributionUrl=(.+)' ${./android/gradle/wrapper/gradle-wrapper.properties} \
| sd --fixed-strings '\:' ':' \
| tr -d '\n' \
> $out
cat $out
''
);
hash = "sha256-uwmYL99ScY5MeyUCPRDfbTWl//lphgvfWlvSejqyep4=";
};
jdk = pkgs.lib.trivial.throwIfNot (pkgs.lib.versions.major pkgs.jdk.version == "21")
"jdk updated to ${pkgs.lib.versions.major pkgs.jdk.version}, sync android/app/build.gradle versions"
pkgs.jdk;
in
{
devShell = pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
CHROME_EXECUTABLE = "${pkgs.ungoogled-chromium}/bin/chromium";
JAVA_HOME = "${pkgs.jdk.home}";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/34.0.0/aapt2";
buildInputs = with pkgs; [
flutter
androidSdk
jdk17
ungoogled-chromium
android-studio-full
];
};
packages.default = pkgs.stdenv.mkDerivation {
pname = "aifred-apk";
version = "1.0.0";
src = ./.;
buildInputs = [
pkgs.flutter
androidSdk
];
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${androidSdk}/libexec/android-sdk/build-tools/34.0.0/aapt2";
FLUTTER_SDK = "${pkgs.flutter}";
buildPhase = ''
echo hello
echo $GRADLE_OPTS
echo $ANDROID_SDK_ROOT
echo NIX_BUILD_TOP
echo $NIX_BUILD_TOP
echo current folder
pwd
echo $HOME
mkdir .pub-cache
export PUB_CACHE="$(pwd)/.pub-cache"
echo $PUB_CACHE
flutter doctor -v
'';
};
packages.apk-flutter = pkgs.flutter327.buildFlutterApplication rec {
pname = "aifred-apk";
version = "1.0.0";
src = ./.;
targetFlutterPlatform = "universal";
autoPubspecLock = src + "/pubspec.lock";
ANDROID_HOME = "${androidSdk}/libexec/android-sdk";
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_HOME}/ndk-bundle";
JAVA_HOME = jdk.home;
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_HOME}/build-tools/${buildToolsVersion}/aapt2";
gradleFlags = [ GRADLE_OPTS ];
preBuild = ''
set -x
export HOME=$TMPDIR
touch env.sh
# Substitute the gradle-all zip URL by a local file to prevent downloads from happening while building an Android app
${pkgs.lib.getExe pkgs.sd} 'distributionUrl=.+' 'distributionUrl=file\://${gradleZip}' android/gradle/wrapper/gradle-wrapper.properties
cat android/gradle/wrapper/gradle-wrapper.properties
# sets up gradlew wrapper
flutter build apk -v --config-only
# add nix flags to gradlew
local flagsArray=()
concatTo flagsArray gradleFlags gradleFlagsArray
local wrapperFlagsArray=()
for flag in "''${flagsArray[@]}"; do
wrapperFlagsArray+=("--add-flags" "$flag")
done
gradlewPath="$PWD/android/gradlew"
wrapProgram "$gradlewPath" \
--run 'set -x' \
--add-flags '--info' \
--add-flags '--debug' \
"''${wrapperFlagsArray[@]}"
gradle() {
command "$gradlewPath" "$@"
}
'';
buildPhase = ''
runHook preBuild
mkdir -p build/flutter_assets/fonts
flutter build apk -v --split-debug-info="$debug" $flutterBuildFlags
runHook postBuild
'';
installPhase = ''
runHook preInstall
cp -v ./build/app/outputs/flutter-apk/app-release.apk $out
runHook postInstall
'';
};
packages.web = pkgs.flutter327.buildFlutterApplication rec {
pname = "aifred-web";
version = "1.0.0";
src = ./.;
targetFlutterPlatform = "web";
# inherit pubspecLock;
autoPubspecLock = src + "/pubspec.lock";
};
});
}