)]}'
{
  "commit": "bfd1de776f620d98df48511d3d56cf050c8d00fd",
  "tree": "eee85f0e50c419fe34a88ddeff59d4411e0eb00f",
  "parents": [
    "bc09bcd643d4dc83ba0801e0d5dd56103a6d0644"
  ],
  "author": {
    "name": "Kevin Moore",
    "email": "kevmoo@users.noreply.github.com",
    "time": "Wed Oct 14 01:44:15 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Oct 14 01:44:15 2026 +0000"
  },
  "message": "feat(flutter_tools): extract AndroidGradleConfig and move toGradleConfig to AndroidBuildInfo (#194016)\n\n### Rationale\n\n`BuildInfo` is the cross-platform build configuration passed across\nAndroid, iOS, Web, Desktop, and Fuchsia targets, yet it carried 6 loose\nAndroid/Gradle fields (`androidProjectArgs`,\n`androidGradleProjectCacheDir`, `androidGradleDaemon`,\n`androidSkipBuildDependencyValidation`, `androidEnableHcpp`,\n`explicitAndroidEnableHcpp`) and the Gradle `-P` flag serializer\n`toGradleConfig()`. Following #191018, #191510, #191760, #192307,\n#192455, #192524, #192818, and #193323, this change encapsulates those\nfields into `AndroidGradleConfig` and moves `toGradleConfig()` onto\n`AndroidBuildInfo` where all production callers already operate.\n\n### Summary of Changes\n\n- Introduce `@immutable class AndroidGradleConfig` in `build_info.dart`\nand replace the 6 loose `android*` parameters on `BuildInfo` and\n`BuildInfo.copyWith` with `androidGradleConfig` (shrinking `BuildInfo`\u0027s\nconstructor from 28 to 23 parameters while preserving\n`AndroidDevice.startApp` forwarding during `flutter run`).\n- Move `toGradleConfig()` off `BuildInfo` onto `AndroidBuildInfo` (with\nzero `@deprecated` forwarders) and add `gradleDaemon` and\n`skipBuildDependencyValidation` convenience getters on\n`AndroidBuildInfo`.\n- Update `FlutterCommand.getBuildInfo()` in `flutter_command.dart` to\nconstruct `AndroidGradleConfig`.\n- Update `buildGradleApp`, `buildGradleAar`, and\n`_checkJavaAndGradleCompatibility` in `gradle.dart` to read Gradle\nconfiguration via `AndroidBuildInfo`.\n- Update unit tests across `build_info_test.dart`,\n`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and\n`build_aar_test.dart`.\n\n### Flow / Surface Delta\n\n```mermaid\nflowchart LR\n    A[\"FlutterCommand.getBuildInfo()\"] --\u003e B[\"BuildInfo(androidGradleConfig)\"]\n    B --\u003e C[\"AndroidBuildInfo.toGradleConfig()\"]\n    C --\u003e D[\"gradle.dart (-P flags)\"]\n```\n\n### Verification\n\n- Executed `dart analyze --fatal-infos` on `packages/flutter_tools` with\n0 issues.\n- Executed `dart test` across `build_info_test.dart`,\n`flutter_command_test.dart`, `android_gradle_builder_test.dart`, and\n`build_aar_test.dart` (`160/160` passing).\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [ ] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant documentation (doc comments with `///`).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "bb0e5c4f76d90ad4fcddf4e7555dd8283402e04a",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/android/gradle.dart",
      "new_id": "a8e9dbe571cbbd5465204eea073cefd85184da29",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/android/gradle.dart"
    },
    {
      "type": "modify",
      "old_id": "54200184a8da5b2309a1e8ed639c23a35973297b",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/build_info.dart",
      "new_id": "f43c6cdea3843250a1fbe2ae42bb35c6e624624f",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/build_info.dart"
    },
    {
      "type": "modify",
      "old_id": "8a4ab816d16ee8c85ddcb814c6d164a4255fe246",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/runner/flutter_command.dart",
      "new_id": "aac3a61a60b94a6c4fdb8166170717ea9346f5f6",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/runner/flutter_command.dart"
    },
    {
      "type": "modify",
      "old_id": "aaba4bc721d5c14239f9b1b906e826d8a8365267",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart",
      "new_id": "9674f54778578b1373245d2d54597e260a49d65c",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart"
    },
    {
      "type": "modify",
      "old_id": "b30558d859808f4757ecf5855788961b2fb1110e",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart",
      "new_id": "ac7880f547d20bb5ed47b3550f97c96c184e79e1",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart"
    },
    {
      "type": "modify",
      "old_id": "90c3e86f1ce859eab1c55a0ebe847b5510bd4bef",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/general.shard/build_info_test.dart",
      "new_id": "c3de42ced39abfebefd0adb9244e434aefdf3bba",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/general.shard/build_info_test.dart"
    },
    {
      "type": "modify",
      "old_id": "32cdf422f4817aebd86d56f54d2fe6718e35f491",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart",
      "new_id": "7c98e5259c65925ccc353ae32839dcbe71af501b",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart"
    }
  ]
}
