)]}'
{
  "commit": "66c8316f9788d4447bc308194fabe1dbb2d91f0c",
  "tree": "72a647f0af3af16d2fdffdd58e00a5a42454edd8",
  "parents": [
    "c169a17d8529d1db7651df70a09fc182c0450658"
  ],
  "author": {
    "name": "gaaclarke",
    "email": "30870216+gaaclarke@users.noreply.github.com",
    "time": "Mon Apr 21 11:10:20 2025 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Apr 21 18:10:20 2025 +0000"
  },
  "message": "Android doctor: more robust `canrun` (#167489)\n\nFixes error found in rolling to google.\n\n```\n[☠] Android toolchain - develop for Android devices (the doctor check crashed)\n    ✗ Due to an error, the doctor check did not complete. If the error message\n      below is not helpful, please let us know about this issue at\n      https://github.com/flutter/flutter/issues.\n    ✗ type \u0027Null\u0027 is not a subtype of type \u0027String\u0027 of \u0027executable\u0027\n    • #0      LocalProcessManager.canRun\n      (package:process/src/interface/local_process_manager.dart:124)\n      #1      getEmulatorVersion\n      (package:flutter_tools/src/android/android_workflow.dart:64)\n      #2      AndroidValidator.validateImpl\n      (package:flutter_tools/src/android/android_workflow.dart:200)\n      #3      DoctorValidator.validate\n      (package:flutter_tools/src/doctor_validator.dart:58)\n      #4      Doctor.startValidatorTasks.\u003canonymous closure\u003e\n      (package:flutter_tools/src/doctor.dart:244)\n      #5      asyncGuard.\u003canonymous closure\u003e\n      (package:flutter_tools/src/base/async_guard.dart:109)\n      #6      _rootRun (dart:async/zone.dart:1525)\n      #7      _CustomZone.run (dart:async/zone.dart:1422)\n      #8      _runZoned (dart:async/zone.dart:2033)\n      #9      runZonedGuarded (dart:async/zone.dart:2019)\n      #10     runZoned (dart:async/zone.dart:1952)\n      #11     asyncGuard (package:flutter_tools/src/base/async_guard.dart:106)\n      #12     Doctor.startValidatorTasks\n      (package:flutter_tools/src/doctor.dart:234)\n      #13     Doctor.diagnose (package:flutter_tools/src/doctor.dart:372)\n      #14     DoctorCommand.runCommand\n      (package:flutter_tools/src/commands/doctor.dart:59)\n      #15     FlutterCommand.verifyThenRunCommand\n      (package:flutter_tools/src/runner/flutter_command.dart:1897)\n      \u003casynchronous suspension\u003e\n      #16     FlutterCommand.run.\u003canonymous closure\u003e\n      (package:flutter_tools/src/runner/flutter_command.dart:1551)\n      \u003casynchronous suspension\u003e\n      #17     AppContext.run.\u003canonymous closure\u003e\n      (package:flutter_tools/src/base/context.dart:154)\n      \u003casynchronous suspension\u003e\n      #18     CommandRunner.runCommand (package:args/command_runner.dart:212)\n      \u003casynchronous suspension\u003e\n      #19     FlutterCommandRunner.runCommand.\u003canonymous closure\u003e\n      (package:flutter_tools/src/runner/flutter_command_runner.dart:501)\n      \u003casynchronous suspension\u003e\n      #20     AppContext.run.\u003canonymous closure\u003e\n      (package:flutter_tools/src/base/context.dart:154)\n      \u003casynchronous suspension\u003e\n      #21     FlutterCommandRunner.runCommand\n      (package:flutter_tools/src/runner/flutter_command_runner.dart:438)\n      \u003casynchronous suspension\u003e\n      #22     run.\u003canonymous closure\u003e.\u003canonymous closure\u003e\n      (package:flutter_tools/runner.dart:98)\n      \u003casynchronous suspension\u003e\n      #23     AppContext.run.\u003canonymous closure\u003e\n      (package:flutter_tools/src/base/context.dart:154)\n      \u003casynchronous suspension\u003e\n      #24     AppContext.run.\u003canonymous closure\u003e\n      (package:flutter_tools/src/base/context.dart:154)\n      \u003casynchronous suspension\u003e\n      #25     run (package:mobile.flutter.cli/flutter_tools.dart:106)\n      \u003casynchronous suspension\u003e\n      #26     main (google3:///mobile/flutter/cli/bin/cli_usage_aot.dart:4)\n```\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- [x] 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.\n\nIf you need help, consider asking for advice on the #hackers-new channel\non [Discord].\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md\n[Features we expect every widget to implement]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Discord]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "9aefa8bd83618f5730497dfacd2784cb99fea7c8",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/android/android_workflow.dart",
      "new_id": "d1f4c00061805595bd750234ad21771daa1cc902",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/android/android_workflow.dart"
    },
    {
      "type": "modify",
      "old_id": "f3702eb5d7721a1e3470d12640228c8210d006a0",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/general.shard/android/android_workflow_test.dart",
      "new_id": "a383660f81b9344b73214698f6a623cfce62ed3d",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/general.shard/android/android_workflow_test.dart"
    }
  ]
}
