This patch introduces an intermediate Gradle build step to alter the behavior of flutter_tools' Gradle project, specifically moving the creation of `build` and `.gradle` directories from within the Nix Store to somewhere in `$HOME/.cache/flutter/nix-flutter-tools-gradle/$engineShortRev`. Without this patch, flutter_tools' Gradle project tries to generate `build` and `.gradle` directories within the Nix Store. Resulting in read-only errors when trying to build a Flutter Android app at runtime. This patch takes advantage of the fact settings.gradle takes priority over settings.gradle.kts to build the intermediate Gradle project when a Flutter app runs `includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")` `rootProject.buildFileName = "/dev/null"` so that the intermediate project doesn't use `build.gradle.kts` that's in the same directory. The intermediate project makes a `settings.gradle` file in `$HOME/.cache/flutter/nix-flutter-tools-gradle//` and `includeBuild`s it. This Gradle project will build the actual `packages/flutter_tools/gradle` project by setting `rootProject.projectDir = new File("$settingsDir")` and `apply from: new File("$settingsDir/settings.gradle.kts")`. Now the `.gradle` will be built in `$HOME/.cache/flutter/nix-flutter-tools-gradle//`, but `build` doesn't. To move `build` to `$HOME/.cache/flutter/nix-flutter-tools-gradle//` as well, we need to set `buildDirectory`. diff --git a/packages/flutter_tools/gradle/settings.gradle b/packages/flutter_tools/gradle/settings.gradle new file mode 100644 index 0000000000..b2485c94b4 --- /dev/null +++ b/packages/flutter_tools/gradle/settings.gradle @@ -0,0 +1,19 @@ +rootProject.buildFileName = "/dev/null" + +def engineShortRev = (new File("$settingsDir/../../../bin/internal/engine.version")).text.take(10) +def dir = new File("$System.env.HOME/.cache/flutter/nix-flutter-tools-gradle/$engineShortRev") +dir.mkdirs() +def file = new File(dir, "settings.gradle") + +file.text = """ +rootProject.projectDir = new File("$settingsDir") +apply from: new File("$settingsDir/settings.gradle.kts") + +gradle.allprojects { project -> + project.beforeEvaluate { + project.layout.buildDirectory = new File("$dir/build") + } +} +""" + +includeBuild(dir)