[embedder] Software rendering using Flatland.

The Flutter Embedder for Fuchsia is a new in-progress version of
the Flutter runtime for Fuchsia, built on the Bazel SDK and using
the ELF runner.

- Cherrypicks in a CL for acquiring a software surface
  in the embedder API to libflutter_engine.so.
- Adds a FlatlandViewProvider to initialize the view.
- Adds software rendering callbacks to acquire and
  present the surface. Acquiring the surface is largely
  copied from our Flutter Engine code.
- Add a FlatlandConnection helper class for interacting
  with Flatland. This is a common helper that is copied
  from our Flutter Engine code.
- Currently only presents a single frame.

Next steps:

- Write unit tests.
- Write integration test once screenshot support lands
  in the SDK.
- Get fonts working.
- Get multiple frames working (add an example app with an
  animation, e.g. a spinning cube).
- Fix bug where sometimes the app fails to start rendering.

Screenshot: https://photos.app.goo.gl/DMUAdraXVEXz443h9
Bug: 46971
Change-Id: Ie6421ab03e3d9f4a0a8d53da79100c8cab1dae53
15 files changed
tree: 8713c767ce38ec34c78c66c15cf4df5b88be4cf5
  1. scripts/
  2. src/
  3. third_party/
  4. tools/
  5. .bazelrc
  6. .gitignore
  7. .gitmodules
  8. AUTHORS
  9. CONTRIBUTING.md
  10. LICENSE
  11. OWNERS
  12. PATENTS
  13. README.md
  14. WORKSPACE.bazel
README.md

flutter-embedder.git

The Flutter Embedder for Fuchsia is a new in-progress runtime for Flutter apps on Fuchsia. This runtime is built on top of Flutter's embedder platform.

This repository is a work in progress and should be considered experimental.

Requirements

  1. Install a Bazel version no older than the one defined in the WORKSPACE.bazel file, by following the instructions at https://bazel.build/install. In some Linux distributions, sudo apt-get install bazel should be enough.

  2. Make sure this repository has the required submodules:

    git submodule update --recursive --init
    
  3. Ensure that there are Fuchsia SSH keys in your host machine. You will need them for running the Fuchsia emulator.

     [[ -f "${HOME}/.ssh/fuchsia_ed25519" ]] || ssh-keygen -P "" -t ed25519 -f "${HOME}/.ssh/fuchsia_ed25519" -C "${USER}@$(hostname -f) Shared SSH Key for Fuchsia"
    
     [[ -f "${HOME}/.ssh/fuchsia_authorized_keys" ]] || ssh-keygen -y -f "${HOME}/.ssh/fuchsia_ed25519" > "${HOME}/.ssh/fuchsia_authorized_keys"
    

Build and package the sample

Now the repository is ready to build the sample.

  1. Fetch an emulator image and start an emulator:

    tools/ffx product-bundle get workstation.qemu-x64
    # If running in a graphical environment:
    tools/ffx emu start workstation.qemu-x64
    # If running in a terminal environment:
    tools/ffx emu start --headless workstation.qemu-x64
    
  2. (optional) Watch the device log in a separate window:

    tools/ffx log
    
  3. Run the sample app component:

    scripts/build_and_run_sample_app.sh
    

TODO(akbiggs): The app occasionally gets stuck on a loading screen instead of rendering. Re-running the app usually fixes it. We need to fix this.

Syncing engine artifacts

Occasionally you will need to update the Flutter Engine artifacts (embedder.h and libengine_flutter.so) that are used by the embedder to run Flutter apps. A script is provided for this workflow.

Prerequisites

  1. You will need to get the Flutter Engine source code. Note that this is not just cloning https://github.com/flutter/engine.
  2. $ENGINE_DIR should be set to the src folder of your Flutter Engine checkout, for example ~/engine/src.
  3. $FUCHSIA_EMBEDDER_DIR should be set to your flutter-embedder.git checkout, for example ~/flutter-embedder.
  4. $DEPOT_TOOLS should be set to your depot_tools location, for example ~/depot_tools.
  5. You will need to git stash or git commit any local changes to the Flutter Engine or the script will fail.

Running the script

You can run the script with a flutter/engine Git commit to sync the Engine artifacts to that revision.

scripts/sync_engine_artifacts_to_revision.sh <ENGINE_COMMIT_SHA>

A common workflow is to sync your Engine commit to the Flutter tool in this repository. To do this:

scripts/sync_engine_artifacts_to_revision.sh $(cat $FUCHSIA_EMBEDDER_DIR/third_party/dart-pkg/internal/flutter/flutter/bin/internal/engine.version)