Switch to osx_sdk module for devicelab recipes

Now both host only and devicelab tasks are sharing the osx_sdk module.

LEDs for devicelab tasks:
https://luci-milo.appspot.com/raw/build/logs.chromium.org/flutter/led/keyonghan_google.com/320aaf2535e8e7d1043dcf63114e6b74415c256e8e704f4db919ea8066b7c91d/+/build.proto
https://luci-milo.appspot.com/raw/build/logs.chromium.org/flutter/led/keyonghan_google.com/7f26a182cc96efb9267d747e36a1d661e894a8f9bdf731f59c62447e4788c0b4/+/build.proto

LED for a host only task:
https://luci-milo.appspot.com/raw/build/logs.chromium.org/flutter/led/keyonghan_google.com/d68ec2aec87d6782fbd31e82e8f446d4e815b25cd572d8720f69a7afe7e7c17d/+/build.proto

Change-Id: I7fd0d9ed2efe2994eb4f64c2affec76b25d2e307
Bug: https://github.com/flutter/flutter/issues/117541
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/43980
Reviewed-by: Ricardo Amador <ricardoamador@google.com>
Commit-Queue: Keyong Han <keyonghan@google.com>
diff --git a/recipes/devicelab/devicelab_drone.expected/no-task-name.json b/recipes/devicelab/devicelab_drone.expected/no-task-name.json
index db7713e..1b63109 100644
--- a/recipes/devicelab/devicelab_drone.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_drone.expected/no-task-name.json
@@ -19,7 +19,7 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
-      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone.py\", line 44, in RunSteps",
+      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone.py\", line 43, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError('A task_name property is required')"
     ]
diff --git a/recipes/devicelab/devicelab_drone.expected/xcode-devicelab-timeout.json b/recipes/devicelab/devicelab_drone.expected/xcode-devicelab-timeout.json
index da5c197..806a317 100644
--- a/recipes/devicelab/devicelab_drone.expected/xcode-devicelab-timeout.json
+++ b/recipes/devicelab/devicelab_drone.expected/xcode-devicelab-timeout.json
@@ -536,6 +536,47 @@
   },
   {
     "cmd": [
+      "echo",
+      "/opt/flutter/xcode/deadbeef"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk",
+      "USE_EMULATOR": null
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "xcode not installed"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -607,7 +648,8 @@
       "-output-dir",
       "/opt/flutter/xcode/deadbeef/XCode.app",
       "-cipd-package-prefix",
-      "flutter_internal/ios/xcode"
+      "flutter_internal/ios/xcode",
+      "-with-runtime=True"
     ],
     "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
     "env": {
@@ -647,6 +689,48 @@
   },
   {
     "cmd": [
+      "killall",
+      "-9",
+      "com.apple.CoreSimulator.CoreSimulatorDevice"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk",
+      "USE_EMULATOR": null
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "kill dart"
+  },
+  {
+    "cmd": [
       "sudo",
       "xcode-select",
       "--switch",
diff --git a/recipes/devicelab/devicelab_drone.expected/xcode-devicelab.json b/recipes/devicelab/devicelab_drone.expected/xcode-devicelab.json
index f324445..4f3a060 100644
--- a/recipes/devicelab/devicelab_drone.expected/xcode-devicelab.json
+++ b/recipes/devicelab/devicelab_drone.expected/xcode-devicelab.json
@@ -536,6 +536,47 @@
   },
   {
     "cmd": [
+      "echo",
+      "/opt/flutter/xcode/deadbeef"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk",
+      "USE_EMULATOR": null
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "xcode not installed"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -607,7 +648,8 @@
       "-output-dir",
       "/opt/flutter/xcode/deadbeef/XCode.app",
       "-cipd-package-prefix",
-      "flutter_internal/ios/xcode"
+      "flutter_internal/ios/xcode",
+      "-with-runtime=True"
     ],
     "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
     "env": {
@@ -647,6 +689,48 @@
   },
   {
     "cmd": [
+      "killall",
+      "-9",
+      "com.apple.CoreSimulator.CoreSimulatorDevice"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk",
+      "USE_EMULATOR": null
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "kill dart"
+  },
+  {
+    "cmd": [
       "sudo",
       "xcode-select",
       "--switch",
diff --git a/recipes/devicelab/devicelab_drone.py b/recipes/devicelab/devicelab_drone.py
index 606824b..485569d 100644
--- a/recipes/devicelab/devicelab_drone.py
+++ b/recipes/devicelab/devicelab_drone.py
@@ -7,7 +7,6 @@
 
 DEPS = [
     'flutter/android_virtual_device',
-    'flutter/devicelab_osx_sdk',
     'flutter/flutter_bcid',
     'flutter/flutter_deps',
     'flutter/logs_util',
@@ -131,18 +130,14 @@
     dep_list = {d['dependency']: d.get('version') for d in deps}
     if 'xcode' in dep_list:
       api.os_utils.clean_derived_data()
+      devicelab = False
       if str(api.swarming.bot_id).startswith('flutter-devicelab'):
-        with api.devicelab_osx_sdk('ios'):
-          test_status = mac_test(
-              api, env, env_prefixes, flutter_path, task_name, runner_params,
-              suppress_log, test_timeout_secs
-          )
-      else:
-        with api.osx_sdk('ios'):
-          test_status = mac_test(
-              api, env, env_prefixes, flutter_path, task_name, runner_params,
-              suppress_log, test_timeout_secs
-          )
+        devicelab = True
+      with api.osx_sdk('ios', devicelab=devicelab):
+        test_status = mac_test(
+            api, env, env_prefixes, flutter_path, task_name, runner_params,
+            suppress_log, test_timeout_secs
+        )
     else:
       with api.context(env=env, env_prefixes=env_prefixes):
         # Start an emulator if it is requested, it must be started before the doctor to avoid issues.
@@ -414,7 +409,7 @@
           tags=['ios'],
           dependencies=[{'dependency': 'xcode'}],
           git_branch='master',
-          **{'$flutter/devicelab_osx_sdk': {'sdk_version': 'deadbeef',}}
+          **{'$flutter/osx_sdk': {'sdk_version': 'deadbeef',}}
       ), api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
       api.platform.name('mac'),
       api.buildbucket.ci_build(git_ref='refs/heads/master',),
@@ -437,7 +432,7 @@
           dependencies=[{'dependency': 'xcode'}],
           test_timeout_secs=1,
           git_branch='master',
-          **{'$flutter/devicelab_osx_sdk': {'sdk_version': 'deadbeef',}}
+          **{'$flutter/osx_sdk': {'sdk_version': 'deadbeef',}}
       ),
       api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
       api.platform.name('mac'),
diff --git a/recipes/devicelab/devicelab_drone_build_test.expected/artifact does not exist.json b/recipes/devicelab/devicelab_drone_build_test.expected/artifact does not exist.json
index 6f9671c..641e824 100644
--- a/recipes/devicelab/devicelab_drone_build_test.expected/artifact does not exist.json
+++ b/recipes/devicelab/devicelab_drone_build_test.expected/artifact does not exist.json
@@ -813,7 +813,7 @@
       }
     },
     "name": "launch builds.schedule",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Linux Engine Drone\", \"project\": \"test\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"git.example.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"test/repo\", \"ref\": \"refs/heads/main\"}, \"priority\": 30, \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"git_ref\": \"refs/pull/1/head\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Linux Engine Drone\", \"project\": \"test\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"git.example.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"test/repo\", \"ref\": \"refs/heads/main\"}, \"priority\": 30, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"git_ref\": \"refs/pull/1/head\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -856,7 +856,7 @@
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"priority\": 30, @@@",
       "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@          \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@            \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"artifact\": \"def\", @@@",
@@ -864,7 +864,7 @@
       "@@@STEP_LOG_LINE@request@            \"drone_dimensions\": [], @@@",
       "@@@STEP_LOG_LINE@request@            \"name\": \"abc\", @@@",
       "@@@STEP_LOG_LINE@request@            \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@              \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@              \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@                \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@              }, @@@",
       "@@@STEP_LOG_LINE@request@              \"artifact\": \"def\", @@@",
diff --git a/recipes/devicelab/devicelab_drone_build_test.expected/artifact exists.json b/recipes/devicelab/devicelab_drone_build_test.expected/artifact exists.json
index 1cc9b7c..89e9d93 100644
--- a/recipes/devicelab/devicelab_drone_build_test.expected/artifact exists.json
+++ b/recipes/devicelab/devicelab_drone_build_test.expected/artifact exists.json
@@ -38,7 +38,7 @@
     ],
     "infra_step": true,
     "name": "launch builds.schedule",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"builder\": \"Linux Engine Drone\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"priority\": 30, \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"git_ref\": \"refs/pull/1/head\", \"git_url\": \"test/repo\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"0-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"0\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"builder\": \"Linux Engine Drone\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"priority\": 30, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"git_ref\": \"refs/pull/1/head\", \"git_url\": \"test/repo\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"0-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"0\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -71,7 +71,7 @@
       "@@@STEP_LOG_LINE@request@        \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", @@@",
       "@@@STEP_LOG_LINE@request@        \"priority\": 30, @@@",
       "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@          \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@            \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"artifact\": \"def\", @@@",
@@ -79,7 +79,7 @@
       "@@@STEP_LOG_LINE@request@            \"drone_dimensions\": [], @@@",
       "@@@STEP_LOG_LINE@request@            \"name\": \"abc\", @@@",
       "@@@STEP_LOG_LINE@request@            \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@              \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@              \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@                \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@              }, @@@",
       "@@@STEP_LOG_LINE@request@              \"artifact\": \"def\", @@@",
diff --git a/recipes/devicelab/devicelab_drone_build_test.expected/local-engine.json b/recipes/devicelab/devicelab_drone_build_test.expected/local-engine.json
index 36e723e..e1e2415 100644
--- a/recipes/devicelab/devicelab_drone_build_test.expected/local-engine.json
+++ b/recipes/devicelab/devicelab_drone_build_test.expected/local-engine.json
@@ -984,7 +984,7 @@
       }
     },
     "name": "launch builds.schedule",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Linux Engine Drone\", \"project\": \"test\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"git.example.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"test/repo\", \"ref\": \"refs/heads/master\"}, \"priority\": 30, \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"local_engine\": \"host-release\", \"local_engine_cas_hash\": \"isolatehashlocalengine/22\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Linux Engine Drone\", \"project\": \"test\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"git.example.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"test/repo\", \"ref\": \"refs/heads/master\"}, \"priority\": 30, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"def\", \"dependencies\": [], \"git_branch\": \"master\", \"parent_builder\": \"Linux abc\", \"tags\": [], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [], \"gclient_variables\": {}, \"git_branch\": \"master\", \"local_engine\": \"host-release\", \"local_engine_cas_hash\": \"isolatehashlocalengine/22\", \"parent_builder\": \"Linux abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -1027,7 +1027,7 @@
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"priority\": 30, @@@",
       "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@          \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@          \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@            \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"artifact\": \"def\", @@@",
@@ -1035,7 +1035,7 @@
       "@@@STEP_LOG_LINE@request@            \"drone_dimensions\": [], @@@",
       "@@@STEP_LOG_LINE@request@            \"name\": \"abc\", @@@",
       "@@@STEP_LOG_LINE@request@            \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@              \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@              \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@                \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@              }, @@@",
       "@@@STEP_LOG_LINE@request@              \"artifact\": \"def\", @@@",
diff --git a/recipes/devicelab/devicelab_drone_build_test.expected/no-task-name.json b/recipes/devicelab/devicelab_drone_build_test.expected/no-task-name.json
index 1f0a929..d4546a6 100644
--- a/recipes/devicelab/devicelab_drone_build_test.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_drone_build_test.expected/no-task-name.json
@@ -19,7 +19,7 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
-      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone_build_test.py\", line 61, in RunSteps",
+      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_drone_build_test.py\", line 60, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError('A task_name property is required')"
     ]
diff --git a/recipes/devicelab/devicelab_drone_build_test.expected/xcode-mac.json b/recipes/devicelab/devicelab_drone_build_test.expected/xcode-mac.json
index e23a2b8..3787f73 100644
--- a/recipes/devicelab/devicelab_drone_build_test.expected/xcode-mac.json
+++ b/recipes/devicelab/devicelab_drone_build_test.expected/xcode-mac.json
@@ -1314,7 +1314,7 @@
       }
     },
     "name": "launch builds.schedule",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Mac Engine Drone\", \"project\": \"project\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"chromium.googlesource.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"project\", \"ref\": \"refs/heads/master\"}, \"priority\": 30, \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"$flutter/osx_sdk\": {\"sdk_version\": \"deadbeef\"}, \"artifact\": \"abc\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/devicelab_osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"abc\", \"dependencies\": [{\"dependency\": \"xcode\"}], \"git_branch\": \"master\", \"parent_builder\": \"Mac_ios abc\", \"tags\": [\"ios\"], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [{\"dependency\": \"xcode\"}], \"gclient_variables\": {}, \"git_branch\": \"master\", \"parent_builder\": \"Mac_ios abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [\"ios\"], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"ci\", \"builder\": \"Mac Engine Drone\", \"project\": \"project\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"chromium.googlesource.com\", \"id\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", \"project\": \"project\", \"ref\": \"refs/heads/master\"}, \"priority\": 30, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"abc\", \"build\": {\"drone_dimensions\": [], \"name\": \"abc\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": null}, \"artifact\": \"abc\", \"dependencies\": [{\"dependency\": \"xcode\"}], \"git_branch\": \"master\", \"parent_builder\": \"Mac_ios abc\", \"tags\": [\"ios\"], \"task_name\": \"abc\"}, \"recipe\": \"devicelab/devicelab_test_drone\"}, \"dependencies\": [{\"dependency\": \"xcode\"}], \"gclient_variables\": {}, \"git_branch\": \"master\", \"parent_builder\": \"Mac_ios abc\", \"recipe\": \"devicelab/devicelab_test_drone\", \"tags\": [\"ios\"], \"task_name\": \"abc\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -1357,18 +1357,15 @@
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"priority\": 30, @@@",
       "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@          \"$flutter/devicelab_osx_sdk\": {@@@",
-      "@@@STEP_LOG_LINE@request@            \"sdk_version\": null@@@",
-      "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"$flutter/osx_sdk\": {@@@",
-      "@@@STEP_LOG_LINE@request@            \"sdk_version\": \"deadbeef\"@@@",
+      "@@@STEP_LOG_LINE@request@            \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"artifact\": \"abc\", @@@",
       "@@@STEP_LOG_LINE@request@          \"build\": {@@@",
       "@@@STEP_LOG_LINE@request@            \"drone_dimensions\": [], @@@",
       "@@@STEP_LOG_LINE@request@            \"name\": \"abc\", @@@",
       "@@@STEP_LOG_LINE@request@            \"properties\": {@@@",
-      "@@@STEP_LOG_LINE@request@              \"$flutter/devicelab_osx_sdk\": {@@@",
+      "@@@STEP_LOG_LINE@request@              \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@                \"sdk_version\": null@@@",
       "@@@STEP_LOG_LINE@request@              }, @@@",
       "@@@STEP_LOG_LINE@request@              \"artifact\": \"abc\", @@@",
diff --git a/recipes/devicelab/devicelab_drone_build_test.py b/recipes/devicelab/devicelab_drone_build_test.py
index 49aaa2b..1602108 100644
--- a/recipes/devicelab/devicelab_drone_build_test.py
+++ b/recipes/devicelab/devicelab_drone_build_test.py
@@ -6,7 +6,6 @@
 
 DEPS = [
     'depot_tools/gsutil',
-    'flutter/devicelab_osx_sdk',
     'flutter/display_util',
     'flutter/flutter_deps',
     'flutter/logs_util',
@@ -99,9 +98,7 @@
       'task_name': task_name,
       'parent_builder': api.properties.get('buildername'), 'artifact': artifact,
       'git_branch': api.properties.get('git_branch'), 'tags': tags,
-      '$flutter/devicelab_osx_sdk': {
-          'sdk_version': api.properties.get('xcode')
-      }
+      '$flutter/osx_sdk': {'sdk_version': api.properties.get('xcode')}
   }
   reqs.append({
       'name': task_name, 'properties': test_props,
diff --git a/recipes/devicelab/devicelab_test_drone.expected/mac.json b/recipes/devicelab/devicelab_test_drone.expected/mac.json
index 900f056..7351209 100644
--- a/recipes/devicelab/devicelab_test_drone.expected/mac.json
+++ b/recipes/devicelab/devicelab_test_drone.expected/mac.json
@@ -562,6 +562,46 @@
   },
   {
     "cmd": [
+      "echo",
+      "/opt/flutter/xcode/deadbeef"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "xcode not installed"
+  },
+  {
+    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -632,7 +672,8 @@
       "-output-dir",
       "/opt/flutter/xcode/deadbeef/XCode.app",
       "-cipd-package-prefix",
-      "flutter_internal/ios/xcode"
+      "flutter_internal/ios/xcode",
+      "-with-runtime=True"
     ],
     "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
     "env": {
@@ -671,6 +712,47 @@
   },
   {
     "cmd": [
+      "killall",
+      "-9",
+      "com.apple.CoreSimulator.CoreSimulatorDevice"
+    ],
+    "cwd": "[CLEANUP]/tmp_tmp_1/flutter sdk/dev/devicelab",
+    "env": {
+      "DEPOT_TOOLS": "RECIPE_REPO[depot_tools]",
+      "FLUTTER_LOGS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "FLUTTER_TEST_OUTPUTS_DIR": "[CLEANUP]/flutter_logs_dir",
+      "GIT_BRANCH": "master",
+      "LUCI_BRANCH": "",
+      "LUCI_CI": "True",
+      "LUCI_PR": "",
+      "OS": "darwin",
+      "PUB_CACHE": "[START_DIR]/.pub-cache",
+      "REVISION": "12345abcde12345abcde12345abcde12345abcde",
+      "SDK_CHECKOUT_PATH": "[CLEANUP]/tmp_tmp_1/flutter sdk"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin",
+        "[CLEANUP]/tmp_tmp_1/flutter sdk/bin/cache/dart-sdk/bin"
+      ]
+    },
+    "infra_step": true,
+    "luci_context": {
+      "realm": {
+        "name": "project:ci"
+      },
+      "resultdb": {
+        "current_invocation": {
+          "name": "invocations/build:8945511751514863184",
+          "update_token": "token"
+        },
+        "hostname": "rdbhost"
+      }
+    },
+    "name": "kill dart"
+  },
+  {
+    "cmd": [
       "sudo",
       "xcode-select",
       "--switch",
diff --git a/recipes/devicelab/devicelab_test_drone.expected/no-artifact-name.json b/recipes/devicelab/devicelab_test_drone.expected/no-artifact-name.json
index 285b968..f1fbeeb 100644
--- a/recipes/devicelab/devicelab_test_drone.expected/no-artifact-name.json
+++ b/recipes/devicelab/devicelab_test_drone.expected/no-artifact-name.json
@@ -19,7 +19,7 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
-      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_test_drone.py\", line 51, in RunSteps",
+      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_test_drone.py\", line 50, in RunSteps",
       "    raise ValueError('An artifact property is required')",
       "ValueError('An artifact property is required')"
     ]
diff --git a/recipes/devicelab/devicelab_test_drone.expected/no-task-name.json b/recipes/devicelab/devicelab_test_drone.expected/no-task-name.json
index c918fb5..259f9bc 100644
--- a/recipes/devicelab/devicelab_test_drone.expected/no-task-name.json
+++ b/recipes/devicelab/devicelab_test_drone.expected/no-task-name.json
@@ -19,7 +19,7 @@
       "The recipe has crashed at point 'Uncaught exception'!",
       "",
       "Traceback (most recent call last):",
-      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_test_drone.py\", line 46, in RunSteps",
+      "  File \"RECIPE_REPO[flutter]/recipes/devicelab/devicelab_test_drone.py\", line 45, in RunSteps",
       "    raise ValueError('A task_name property is required')",
       "ValueError('A task_name property is required')"
     ]
diff --git a/recipes/devicelab/devicelab_test_drone.py b/recipes/devicelab/devicelab_test_drone.py
index a2acaef..a5c3496 100644
--- a/recipes/devicelab/devicelab_test_drone.py
+++ b/recipes/devicelab/devicelab_test_drone.py
@@ -8,7 +8,6 @@
 
 DEPS = [
     'depot_tools/gsutil',
-    'flutter/devicelab_osx_sdk',
     'flutter/flutter_deps',
     'flutter/logs_util',
     'flutter/os_utils',
@@ -118,7 +117,7 @@
     else:
       api.os_utils.clean_derived_data()
       if str(api.swarming.bot_id).startswith('flutter-devicelab'):
-        with api.devicelab_osx_sdk('ios'):
+        with api.osx_sdk('ios', devicelab=True):
           with api.context(env=env, env_prefixes=env_prefixes):
             run_test(api, task_name, runner_params)
 
@@ -379,7 +378,7 @@
           tags=['ios'],
           dependencies=[{'dependency': 'xcode'}],
           git_branch='master',
-          **{'$flutter/devicelab_osx_sdk': {'sdk_version': 'deadbeef',}},
+          **{'$flutter/osx_sdk': {'sdk_version': 'deadbeef',}},
           artifact='def',
           parent_builder='ghi'
       ), api.repo_util.flutter_environment_data(checkout_dir=checkout_path),
diff --git a/recipes/ios_usb_dependencies/ios-usb-dependencies.py b/recipes/ios_usb_dependencies/ios-usb-dependencies.py
index e37158a..d65d32f 100644
--- a/recipes/ios_usb_dependencies/ios-usb-dependencies.py
+++ b/recipes/ios_usb_dependencies/ios-usb-dependencies.py
@@ -7,7 +7,7 @@
 
 DEPS = [
     'depot_tools/gsutil',
-    'flutter/devicelab_osx_sdk',
+    'flutter/osx_sdk',
     'flutter/zip',
     'recipe_engine/context',
     'recipe_engine/file',
@@ -295,7 +295,7 @@
 
 
 def RunSteps(api):
-  with api.devicelab_osx_sdk('ios'):
+  with api.osx_sdk('ios', devicelab=True):
     env_prefixes = {'PATH': [], 'LIBRARY_PATH': []}
     env = {}
     BuildPackage(api, env, env_prefixes, 'ios-deploy', upload=True)