Flutter Engine notes

Saturday, 25 November 2023

This is a quick-start guide of setting up the Flutter engine development environment, making a simple change, and using it in a Flutter app.

My setup is fairly standard – I’m on M1 Mac, Android emulator is arm64, iOS simulator is arm64 as well. No Rosetta2 involved.

Prepare

This step is well explained by the official guide.

First step is to clone depot_tools into $HOME:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools

Since I don’t do Engine development often, I don’t want depot_tools in my $PATH by default. Instead, I export it only when I need it:

export PATH="$HOME/depot_tools:$PATH"

Build

Build host-side executables

Generate build files:

./flutter/tools/gn --unoptimized --mac-cpu arm64

Run build:

ninja -C out/host_debug_unopt_arm64

Build for Android emulator

Generate build files:

./flutter/tools/gn --android --android-cpu arm64 --unoptimized

Run build:

ninja -C out/android_debug_unopt_arm64

To build only the JAR (skipping things like generating javadoc, linting):

ninja -C out/android_debug_unopt_arm64 android_jar

Build for iOS simulator

Generate build files:

./flutter/tools/gn --ios --unoptimized --simulator --simulator-cpu arm64

Run build:

ninja -C out/ios_debug_sim_unopt_arm64

Run

Let’s assume that:

export FLUTTER_ENGINE=~/dev/bartekpacia/engine/src/

Android emulator ARM64:

flutter \
    --local-engine android_debug_unopt_arm64 \
    --local-engine-host host_debug_unopt_arm64 \
    --local-engine-src-path "$FLUTTER_ENGINE" \
    run

iOS simulator ARM64 (only the --local-engine argument differs):

flutter \
    --local-engine ios_debug_sim_unopt_arm64 \
    --local-engine-host host_debug_unopt_arm64 \
    --local-engine-src-path "$FLUTTER_ENGINE" \
    run

Theoretically, passing --local-engine-src-path $FLUTTER_ENGINE is redundant - the default value is $FLUTTER_ENGINE. For example you could set:

export FLUTTER_ENGINE=~/dev/bartekpacia/engine/src

Unfortunately I’ve found it to be a bit flaky, and prefer to pass --local-engine-src-path explicitly and not set $FLUTTER_ENGINE envvar.

Test

Run Android tests of AccessibilityBridge with Roboelectric:

./testing/run_tests.py \
    --type java \
    --variant host_debug_unopt_arm64 \
    --android android_debug_unopt_arm64 \
    --java-filter io.flutter.view.AccessibilityBridge

2024-08-18 – frp (Fast Reverse Proxy) instead of ngrok
2024-08-16 – Cirrus CI is the best CI system out there
2024-08-14 – Going to Berlin for Droidcon/Fluttercon
2024-06-25 – I was awarded Google Open Source Peer Bonus
2024-06-04 – My journey to Google I/O ’24
2024-05-11 – GitHub Actions beg for a supply chain attack
2024-03-19 – Writing a custom Dart VM service extension (part 1)
2024-02-08 – On using smartphone for things that make sense
2023-11-30 – Semantics in Flutter - under the hood
2023-11-25 – Flutter Engine notes
2023-09-17 – Creating and managing Android Virtual Devices using the terminal
2023-05-27 – Suckless Android SDK setup
2023-05-26 – Let’s start over
2023-05-21 – Short thought on “The Zen of Unix”
2023-05-15 – Notes about “flutter assemble”
2019-01-07 – Google Code-in 2018