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 an Apple Silicon 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