meta-agl-flutter updates 23/27923/1
authorJoel Winarske <joel.winarske@gmail.com>
Wed, 7 Sep 2022 00:02:55 +0000 (17:02 -0700)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Mon, 12 Sep 2022 10:11:57 +0000 (10:11 +0000)
-layer README
-flutter workspace configuration file
-consolidation of gallery json files
-remove flutter sdk version pin; now happens upstream
-add engine_sdk.zip to all images (non-production)
-add SSH server to debug and profile images
-factor out flutter-auto xdg-shell-app-id patch

Signed-off-by: Joel Winarske <joel.winarske@gmail.com>
Change-Id: I6fdf1277bb4011126103f74eda5e230f34f497d7
(cherry picked from commit ee6873ad9024399cc69f81bab2745eb3a0bb3649)

15 files changed:
meta-agl-devel.md
meta-agl-flutter/README.md [new file with mode: 0644]
meta-agl-flutter/conf/include/agl-flutter.inc
meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/flutter-gallery.service
meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-debug.json [deleted file]
meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-profile.json [deleted file]
meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-release.json [deleted file]
meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery_aglflutter.inc
meta-agl-flutter/recipes-graphics/flutter-engine/flutter-engine_git.bbappend [deleted file]
meta-agl-flutter/recipes-graphics/toyota/files/0001-Add-xdg-shell-app-id-command-line-argument.patch [deleted file]
meta-agl-flutter/recipes-graphics/toyota/flutter-auto_aglflutter.inc
meta-agl-flutter/recipes-platform/images/agl-image-flutter-runtimedebug.bb
meta-agl-flutter/recipes-platform/images/agl-image-flutter-runtimeprofile.bb
meta-agl-flutter/recipes-platform/images/agl-image-flutter-runtimerelease.bb
meta-agl-flutter/tools/flutter_workspace_config.json [new file with mode: 0644]

index ee4d023..84bcfd1 100644 (file)
@@ -40,5 +40,7 @@ The following list provides a summary of these sub-layers:
 * `meta-oem-production-readiness`: Provides libraries and software packages of
   IVI product readiness
 
+* `meta-agl-flutter`: Provides Flutter support.
+
 * `templates`: Feature templates that support the `meta-agl-devel` layer.
 
diff --git a/meta-agl-flutter/README.md b/meta-agl-flutter/README.md
new file mode 100644 (file)
index 0000000..86b4f75
--- /dev/null
@@ -0,0 +1,221 @@
+# meta-agl-flutter
+
+_This documentation is expecting user to be running Ubuntu 20.04_
+
+## Steps to build `agl-ivi-demo-platform-flutter` image
+
+```
+    export AGL_TOP=$HOME/workspace_agl
+    mkdir -p $AGL_TOP && cd $AGL_TOP
+    repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo -b master
+    repo sync -j $(nproc)
+    source meta-agl/scripts/aglsetup.sh -m qemux86-64 agl-demo
+    bitbake agl-ivi-demo-platform-flutter
+```
+
+This builds AGL demo image that includes Flutter runtime=release.
+
+
+## Steps to build a minimal flutter image
+
+```
+    export AGL_TOP=$HOME/workspace_agl
+    mkdir -p $AGL_TOP && cd $AGL_TOP
+    repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo -b master
+    repo sync -j `grep -c ^processor /proc/cpuinfo`
+    source meta-agl/scripts/aglsetup.sh -m qemux86-64 agl-devel agl-flutter
+```
+
+Build one of the minimal Flutter images below using `bitbake`
+
+1. `agl-image-flutter-runtimedebug`
+  * includes Flutter Engine SDK
+  * includes SSH server
+  * live debugging with target via host
+
+2. `agl-image-flutter-runtimeprofile`
+  * includes Flutter Engine SDK
+  * includes SSH server
+  * runs only Flutter Applications built as AOT profile images
+  * live profiling with target via host
+
+3. `agl-image-flutter-runtimerelease`
+  * includes Flutter Engine SDK
+  * runs only Flutter Applications built as AOT release images
+  * Does not include SSH server
+
+
+## Flutter Engine SDK
+
+If recipe `flutter-engine-runtime<variant>-sdk-dev` is included in your AGL image, `engine_sdk.zip` will be present in `/usr/share/flutter/`.
+
+engine_sdk.zip contains
+* sdk/flutter_sdk.version - The Flutter SDK version
+* sdk/engine.version - The git commit of the Flutter Engine
+* sdk/clang_x64/gen_snapshot - used for creating release/profile AOT image
+
+This recipe should be excluded from image in a production release.
+
+
+## Flutter Workspace Automation
+
+```
+    mkdir -p <path to my workspace> && cd <path to my workspace>
+    curl --proto '=https' --tlsv1.2 -sSf https://gerrit.automotivelinux.org/gerrit/gitweb?p=AGL/meta-agl-devel.git;a=blob_plain;f=meta-agl-flutter/tools/flutter_workspace_config.json;hb=HEAD -o flutter_workspace_config.json
+    curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/meta-flutter/meta-flutter/kirkstone/tools/setup_flutter_workspace.py | python3
+```
+
+Additional documentation available [here](https://github.com/meta-flutter/meta-flutter/tree/kirkstone/tools#flutter-workspace-automation)
+
+
+## Startup Service
+
+If you include `flutter-gallery-runtime<variant>-init` it will install a systemd user service, which starts the Flutter Gallery on boot.  This is not included in the minimal images.
+
+At runtime you can edit `/usr/share/flutter/default.json` to point to any Flutter bundle.
+
+
+## `/usr/share/flutter/default.json`
+
+For more JSON key value options see [here](https://github.com/toyota-connected/ivi-homescreen/blob/agl/README.md#json-configuration-keys)
+
+
+## Custom Devices
+
+### desktop-auto
+
+This is a desktop build of flutter-auto.  The default configuration for backend is set to `egl` backend.  To change this to use the `vulkan` backend, change the `backend` key value in `meta-agl-flutter/tools/flutter_workspace_config.json` from `egl` to `vulkan`.  If you use the workspace configuration from meta-flutter it defaults to `vulkan`.
+
+If you are running a Gnome Display Manager (GDM) Wayland session, then it will be an available custom-device platform.  To enable a Wayland session, you select the gear icon at the login window.  If you don't have a gear icon available on your login screen, then you will need to adjust your system settings to enable a Wayland session.
+
+Append `--device-id=desktop-auto` to `flutter <cmd>` to select this device.
+
+### QEMU-agl
+
+This is a QEMU minimal Flutter image as referenced [here](#steps-to-build-a-minimal-flutter-image).  The required runtime packages are installed as part of setup_flutter_workspace.py.
+
+If qemu_run was sucessfully invoked, then this platform will be an available `custom-device`.  If QEMU instance is not running on port 2222, then this custom-device platform will not be available.
+
+Append `--device-id=AGL-qemu` to `flutter <cmd>` to select this device.
+
+
+## Steps to Test Flutter Images
+
+### Debug
+
+1. Set up Flutter Workspace per [Flutter Workspace Automation](#flutter-workspace-automation).
+
+2. Run the following commands on the host's terminal, a QEMU window and a new terminal for AGL will be brought up.
+
+```
+    cd $FLUTTER_WORKSPACE
+    source ./setup_env.sh
+    qemu_run
+```
+
+3. If running an updated QEMU image, edit `~/.ssh/known_hosts` and remove previous connection.
+
+4. Wait for QEMU image to boot to idle the run
+```
+    ssh -p 2222 root@localhost who
+```
+_Answering with `y` appends QEMU connection to `~/.ssh/known_hosts`_
+
+5.  From the same host terminal open Visual Studio Code Select
+   * **Run and Debug**
+   * **gallery(AGL-qemu)** from the drop down combo box
+   * **run** - this launches the Flutter gallery app in the QEMU window​
+
+6.  Or run from the same terminal as qemu_run was executed via
+```
+    cd $FLUTTER_WORKSPACE/app/gallery
+    flutter run --device-id=AGL-qemu
+```
+
+
+### Release
+
+1.  Change AGL-qemu flutter_runtime value in $AGL_TOP/sources/meta-agl-devel/meta-agl-flutter/tools/flutter_workspace_config.json to `release`.
+
+```
+    {
+        "id": "AGL-qemu",
+        "type": "qemu",
+        "arch": "x86_64",
+        "flutter_runtime": "release",
+        "runtime": {
+```
+
+This enables download of QEMU `release` variant.
+
+2. Run the flutter workspace script
+
+3. Run  the following commands on the host's terminal, a QEMU window and a new terminal for AGL will be brought up.
+
+```
+    cd $FLUTTER_WORKSPACE
+    unset QEMU_IMAGE
+    source ./setup_env.sh
+    qemu_run
+```
+
+4.  Login AGL as `root`, and execute `passwd -d agl-driver`.  Type `exit` and login as `agl-driver`.  Run the Flutter Gallery example with the command in AGL's terminal.
+
+```
+       flutter-auto --window-type="BG" --b=/usr/share/flutter/gallery --f
+```
+
+
+### Profile
+
+1.  Change AGL-qemu flutter_runtime value in $AGL_TOP/sources/meta-agl-devel/meta-agl-flutter/tools/flutter_workspace_config.json to `profile`.
+
+```
+    {
+        "id": "AGL-qemu",
+        "type": "qemu",
+        "arch": "x86_64",
+        "flutter_runtime": "profile",
+        "runtime": {
+```
+
+This enables download of QEMU `profile` variant.
+
+2. Run the flutter workspace script
+
+3. Run  the following commands on the host's terminal, a QEMU window and a new terminal for AGL will be brought up.
+
+```
+    cd $FLUTTER_WORKSPACE
+    unset QEMU_IMAGE
+    source ./setup_env.sh
+    qemu_run
+```
+
+4. If running an updated QEMU image, edit `~/.ssh/known_hosts` and remove previous connection.
+
+5. After waiting for QEMU image to boot to idle issue
+```
+    ssh -p 2222 root@localhost who
+```
+Answering with `y` appends QEMU connection to `~/.ssh/known_hosts`
+
+6.  Login AGL as `agl-driver`, and issue the following command
+```
+       flutter-auto --window-type="BG" --b=/usr/share/flutter/gallery --f --observatory-host=0.0.0.0 --observatory-port=1234
+```
+
+The last line of the output message should look similar to this:
+```
+    flutter: The Dart VM service is listening on http://0.0.0.0:1234/xxxxxxxxxxx=/
+```
+
+7. Run the following command in the host terminal, using the correct hash suffix.
+```
+       flutter attach --device-id=AGL-qemu --debug-url=http://127.0.0.1:1234/xxxxxxxxxxx=/
+```
+​
+8. Then you should see the output as below. It tells us the URL of the Flutter DevTools debugger and profiler on AGL x86_64 QEMU Image.
+`An Observatory debugger and profiler on AGL x86_64 QEMU Image is available at: http://127.0.0.1:37383/xxxxxxxxxxx=/`
+​
+9. in the terminal type `v` to launch the debugger.
index a24400c..7d6fce6 100644 (file)
@@ -1,5 +1,5 @@
 AGL_FEATURES += "agl-flutter"
 
-# Over-ride Flutter SDK tag to ensure reproducible builds.
-# This should be updated as required to match meta-flutter updates.
-FLUTTER_SDK_TAG = "3.0.5"
+#########################################
+# FLUTTER_SDK_TAG is now Pinned upstream
+#########################################
index 71ab791..3d4ecbf 100644 (file)
@@ -3,7 +3,7 @@ Requires=agl-compositor.service
 After=agl-compositor.service
 
 [Service]
-ExecStart=/usr/bin/flutter-auto --j=/usr/share/flutter/default.json
+ExecStart=/usr/bin/flutter-auto --j=/usr/share/flutter/default.json --b=/usr/share/flutter/gallery --f
 Restart=on-failure
 
 [Install]
diff --git a/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-debug.json b/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-debug.json
deleted file mode 100644 (file)
index 5a84a0b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-        "view" : [ {
-                "window_type" : "BG",
-                "bundle_path" : "/usr/share/flutter/gallery",
-                "vm_args":["--observatory-host", "0.0.0.0", "--observatory-port", "1234"],
-                "width" : 1920,
-                "height": 1080,
-                "fullscreen": true
-                }
-        ]
-}
diff --git a/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-profile.json b/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-profile.json
deleted file mode 100644 (file)
index 3309fde..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-        "view" : [ {
-                "window_type" : "BG",
-                "bundle_path" : "/usr/share/flutter/gallery",
-                "vm_args":["--observatory-host", "0.0.0.0", "--observatory-port", "1234", "--start-paused"],
-                "width" : 1920,
-                "height": 1080,
-                "fullscreen": true
-                }
-        ]
-}
diff --git a/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-release.json b/meta-agl-flutter/recipes-graphics/flutter-apps/flutter-gallery/gallery_on_bg-release.json
deleted file mode 100644 (file)
index 6a2a844..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-        "view" : [ {
-                "window_type" : "BG",
-                "bundle_path" : "/usr/share/flutter/gallery",
-                "width" : 1920,
-                "height": 1080,
-                "fullscreen": true
-                }
-        ]
-}
index 533bdd7..c618a2f 100644 (file)
@@ -2,15 +2,8 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/flutter-gallery:"
 
 SRC_URI += " \
     file://flutter-gallery.service \
-    file://gallery_on_bg-debug.json \
-    file://gallery_on_bg-profile.json \
-    file://gallery_on_bg-release.json \
 "
 
-APP_CONFIG = "gallery_on_bg-release.json"
-APP_CONFIG:class-runtimedebug = "gallery_on_bg-debug.json"
-APP_CONFIG:class-runtimeprofile = "gallery_on_bg-profile.json"
-
 # To avoid conflicts with the systemd template scheme added via bbappend in
 # meta-agl-demo, package the standalone systemd unit separately.  This is not
 # needed when meta-agl-flutter is used without meta-agl-demo, but that is not
@@ -26,14 +19,10 @@ do_install:append() {
     install -D -m 0644 ${WORKDIR}/flutter-gallery.service ${D}${systemd_user_unitdir}/flutter-gallery.service
     install -d ${D}${systemd_user_unitdir}/agl-session.target.wants
     ln -s ../flutter-gallery.service ${D}${systemd_user_unitdir}/agl-session.target.wants/flutter-gallery.service
-
-    install -D -m 0644 ${WORKDIR}/${APP_CONFIG} ${D}${datadir}/flutter/default.json
 }
 
 PACKAGE_BEFORE_PN += "${PN}-init"
 
-FILES:${PN} += "${datadir}"
-
 FILES:${PN}-init = "${systemd_user_unitdir}"
 
 RDEPENDS:${PN}-init = "${PN}"
\ No newline at end of file
diff --git a/meta-agl-flutter/recipes-graphics/flutter-engine/flutter-engine_git.bbappend b/meta-agl-flutter/recipes-graphics/flutter-engine/flutter-engine_git.bbappend
deleted file mode 100644 (file)
index b3ca883..0000000
+++ /dev/null
@@ -1 +0,0 @@
-do_install[network] = "1"
diff --git a/meta-agl-flutter/recipes-graphics/toyota/files/0001-Add-xdg-shell-app-id-command-line-argument.patch b/meta-agl-flutter/recipes-graphics/toyota/files/0001-Add-xdg-shell-app-id-command-line-argument.patch
deleted file mode 100644 (file)
index 854c8dc..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From 394f48a1e535f464879fa94196ee6d73b86894f5 Mon Sep 17 00:00:00 2001
-From: Scott Murray <scott.murray@konsulko.com>
-Date: Thu, 4 Aug 2022 14:36:08 -0400
-Subject: [PATCH] Add xdg-shell-app-id command-line argument
-
-Add a command-line argument for specifying the app id, so that basic
-applications do not need to supply a full JSON configuration just to
-do so.
-
-Signed-off-by: Scott Murray <scott.murray@konsulko.com>
----
- shell/main.cc | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/shell/main.cc b/shell/main.cc
-index deb4876..ba35acc 100644
---- a/shell/main.cc
-+++ b/shell/main.cc
-@@ -161,6 +161,16 @@ int main(int argc, char** argv) {
-       FML_DLOG(INFO) << "Window Type: " << config.view.window_type;
-       RemoveArgument(config.view.vm_args, "--window-type=" + config.view.window_type);
-     }
-+    if (cl.HasOption("xdg-shell-app-id")) {
-+      cl.GetOptionValue("xdg-shell-app-id", &config.app_id);
-+      if (config.app_id.empty()) {
-+        FML_LOG(ERROR)
-+            << "--xdg-shell-app-id option requires an argument (e.g. --xdg-shell-app-id=gallery)";
-+        return EXIT_FAILURE;
-+      }
-+      FML_DLOG(INFO) << "Application ID: " << config.app_id;
-+      RemoveArgument(config.view.vm_args, "--xdg-shell-app-id=" + config.app_id);
-+    }
-   }
-   auto vm_arg_count = config.view.vm_args.size();
--- 
-2.35.3
-
index 0b580c2..1fb1a3b 100644 (file)
@@ -1,12 +1,4 @@
-FILESEXTRAPATHS:append := "${THISDIR}/files:"
-
-SRC_URI += " \
-    file://0001-Add-xdg-shell-app-id-command-line-argument.patch \
-"
 
 # For now disable gstreamer to avoid needing to enable "commercial"
 # licenses for the stated ffmpeg dependency.
 PACKAGECONFIG:remove = "gstreamer"
-
-# Enable verbose logging on runtimedebug image
-PACKAGECONFIG:append:runtimedebug = "verbose"
index af3688e..b9260bf 100644 (file)
@@ -10,10 +10,8 @@ IMAGE_INSTALL:append = "\
     flutter-auto-runtimedebug \
     \
     flutter-engine-runtimedebug-sdk-dev \
-    \
-    flutter-gallery-runtimedebug \
-    flutter-gallery-runtimedebug-init \
-    flutter-test-texture-egl-runtimedebug \
-    flutter-test-secure-storage-runtimedebug \
-    flutter-test-localization-runtimedebug \
+    "
+
+IMAGE_FEATURES:append = "\
+    ssh-server-openssh \
     "
index 031000a..8b81992 100644 (file)
@@ -9,9 +9,18 @@ IMAGE_INSTALL:append = "\
     \
     flutter-auto-runtimeprofile \
     \
+    flutter-engine-runtimeprofile-sdk-dev \
+    \
     flutter-gallery-runtimeprofile \
-    flutter-gallery-runtimeprofile-init \
+    flutter-test-animated-background-runtimeprofile \
     flutter-test-texture-egl-runtimeprofile \
     flutter-test-secure-storage-runtimeprofile \
     flutter-test-localization-runtimeprofile \
+    \
+    flutter-app-igalia-homescreen-runtimeprofile \
+    flutter-app-pumped-fuel-ped-runtimeprofile \
+    "
+
+IMAGE_FEATURES:append = "\
+    ssh-server-openssh \
     "
index 8220e31..ffc19e8 100644 (file)
@@ -9,9 +9,14 @@ IMAGE_INSTALL:append = "\
     \
     flutter-auto-runtimerelease \
     \
+    flutter-engine-runtimerelease-sdk-dev \
+    \
     flutter-gallery-runtimerelease \
-    flutter-gallery-runtimerelease-init \
+    flutter-test-animated-background-runtimerelease \
     flutter-test-texture-egl-runtimerelease \
     flutter-test-secure-storage-runtimerelease \
     flutter-test-localization-runtimerelease \
+    \
+    flutter-app-igalia-homescreen-runtimerelease \
+    flutter-app-pumped-fuel-ped-runtimerelease \
     "
diff --git a/meta-agl-flutter/tools/flutter_workspace_config.json b/meta-agl-flutter/tools/flutter_workspace_config.json
new file mode 100644 (file)
index 0000000..bb7f23c
--- /dev/null
@@ -0,0 +1,156 @@
+{
+       "flutter-version": "3.3.1",
+       "platforms": [
+               {
+                       "id": "desktop-auto",
+                       "type": "host",
+                       "arch": "x86_64",
+                       "flutter_runtime": "debug",
+                       "runtime": {
+                               "backend": "egl",
+                               "config": {
+                                       "width": 1920,
+                                       "height": 1080,
+                                       "cursor_theme": "DMZ-White"
+                               },
+                               "install_dependent_packages": true,
+                               "artifact_source": "github",
+                               "github_owner": "toyota-connected",
+                               "github_repo": "ivi-homescreen",
+                               "github_workflow": "flutter-auto-linux.yml",
+                               "github_artifact": "flutter-auto-${BACKEND}-dbg.amd64.deb.zip"
+                       },
+                       "overwrite-existing": true,
+                       "custom-device": {
+                               "id": "desktop-auto",
+                               "label": "Toyota flutter-auto",
+                               "sdkNameAndVersion": "flutter-auto x86_64",
+                               "platform": "linux-x64",
+                               "enabled": true,
+                               "ping": ["bash", "-c", "loginctl show-session $(awk '/tty/ {print $1}' <(loginctl)) -p Type"],
+                               "pingSuccessRegex": "Type=wayland",
+                               "postBuild": null,
+                               "install": ["bash", "-c", "mkdir -p /tmp/${appName}/data/flutter_assets && cp -r ${BUNDLE_FOLDER}/* /tmp/${appName} && cp -r ${localPath}/* /tmp/${appName}/data/flutter_assets"],
+                               "uninstall": ["rm", "-rf", "tmp/${appName}"],
+                               "runDebug": ["flutter-auto", "--j=${FLUTTER_WORKSPACE}/.flutter-auto/default_config.json", "--b=/tmp/${appName}"],
+                               "forwardPort": null,
+                               "forwardPortSuccessRegex": null,
+                               "screenshot": null
+                       }
+               },
+               {
+                       "id": "AGL-qemu",
+                       "type": "qemu",
+                       "arch": "x86_64",
+                       "flutter_runtime": "debug",
+                       "runtime": {
+                               "config": {
+                                       "window_type": "BG",
+                                       "width": 1920,
+                                       "height": 1080,
+                                       "fullscreen": true
+                               },
+                               "install_dependent_packages": true,
+                               "relative_path": ".agl/agl-image-flutter-runtime${FLUTTER_RUNTIME}-qemux86-64.wic.vmdk",
+                               "artifact_source": "github",
+                               "github_owner": "meta-flutter",
+                               "github_repo": "meta-flutter",
+                               "github_workflow": "kirkstone-agl-x86_64.yml",
+                               "github_artifact": "agl-image-flutter-runtime${FLUTTER_RUNTIME}-qemux86-64-linux",
+                               "ovmf_path": "/usr/share/ovmf/OVMF.fd",
+                               "cmd": "qemu-system-x86_64",
+                               "args": "-enable-kvm -m 2048 -bios ${OVMF_PATH} -hda ${QEMU_IMAGE} -cpu kvm64 -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+popcnt -vga virtio -show-cursor -device virtio-rng-pci -serial mon:stdio -serial null -soundhw hda -device virtio-net-pci,netdev=net0,mac=52:54:00:12:35:02 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::1234-:1234"
+                       },
+                       "overwrite-existing": true,
+                       "custom-device": {
+                               "id": "AGL-qemu",
+                               "label": "AGL x86_64 QEMU Image",
+                               "sdkNameAndVersion": "agl-image-flutter-runtime${FLUTTER_RUNTIME}-qemux86-64.wic.vmdk",
+                               "platform": "linux-x64",
+                               "enabled": true,
+                               "ping": [
+                                       "bash", "-c", "(echo >/dev/tcp/localhost/2222) &>/dev/null && echo \"open 2222\" || echo \"close 2222\""
+                               ],
+                               "pingSuccessRegex": "open 2222",
+                               "postBuild": [
+                                       "bash", "-c", "mkdir -p ${localPath}/../../.flutter-auto/data/flutter_assets && cp -r ${localPath}/* ${localPath}/../../.flutter-auto/data/flutter_assets && cp -r ${FLUTTER_WORKSPACE}/.agl/default_config.json ${localPath}/../../.flutter-auto/ && ssh -p 2222 -t -oBatchMode=yes root@localhost passwd -d agl-driver"
+                               ],
+                               "uninstall": [
+                                       "bash", "-c", "ssh -p 2222 -t -t -oBatchMode=yes agl-driver@localhost rm -rf \"/tmp/${appName}\""
+                               ],
+                               "install": [
+                                       "bash", "-c", "ssh -p 2222 -t -t -oBatchMode=yes agl-driver@localhost mkdir -p \"/tmp/${appName}/data/flutter_assets\" && scp -r -P 2222 ${localPath}/../../.flutter-auto/* agl-driver@localhost:/tmp/${appName}"
+                               ],
+                               "runDebug": [
+                                       "ssh", "-t", "-t", "-p", "2222", "-oBatchMode=yes", "agl-driver@localhost",
+                                       "flutter-auto",
+                                       "--j=/tmp/${appName}/default_config.json",
+                                       "--b=/tmp/${appName}",
+                                       "--observatory-host=0.0.0.0",
+                                       "--observatory-port=1234"
+                               ],
+                               "forwardPort": null,
+                               "forwardPortSuccessRegex": null,
+                               "screenshot": null
+                       }
+               }
+       ],
+       "repos": [
+               {
+                       "uri": "https://github.com/flutter/gallery.git",
+                       "branch": "master",
+                       "rev": "9eb785cb997ff56c46e933c1c591f0a6f31454f6",
+                       "pubspec_path": "gallery"
+               },
+               {
+                       "uri": "git@github.com:meta-flutter/tests.git",
+                       "branch": "main"
+               },
+               {
+                       "uri": "https://github.com/meta-flutter/flutter_animated_background.git",
+                       "branch": "meta-flutter",
+                       "pubspec_path": "flutter_animated_background/example"
+               },
+               {
+                       "uri": "https://github.com/mogol/flutter_secure_storage.git",
+                       "branch": "develop",
+                       "rev": "e716593352b80330e05729486eade7c2167d3c71",
+                       "pubspec_path": "flutter_secure_storage/flutter_secure_storage/example"
+               },
+               {
+                       "uri": "https://github.com/felipeerias/flutter_homescreen.git",
+                       "branch": "main",
+                       "pubspec_path": "flutter_homescreen"
+               },
+               {
+                       "uri": "https://github.com/bernardpumped/ped.git",
+                       "branch": "agl",
+                       "pubspec_path": "ped"
+               },
+               {
+                       "uri": "https://gerrit.automotivelinux.org/gerrit/apps/flutter-dashboard.git",
+                       "branch": "master",
+                       "pubspec_path": "flutter-dashboard"
+               },
+               {
+                       "uri": "https://gerrit.automotivelinux.org/gerrit/apps/flutter-hvac.git",
+                       "branch": "master",
+                       "pubspec_path": "flutter-hvac"
+               },
+               {
+                       "uri": "https://gerrit.automotivelinux.org/gerrit/apps/flutter-instrument-cluster.git",
+                       "branch": "master",
+                       "pubspec_path": "flutter-instrument-cluster"
+               },
+               {
+                       "uri": "https://gerrit.automotivelinux.org/gerrit/apps/flutter-mediaplayer.git",
+                       "branch": "master",
+                       "pubspec_path": "flutter-mediaplayer"
+               },
+               {
+                       "uri": "https://gerrit.automotivelinux.org/gerrit/apps/flutter-navigation.git",
+                       "branch": "master",
+                       "pubspec_path": "flutter-navigation"
+               }
+       ]
+}