Android embedder for Flutter, including Java io.flutter
sources and Android specific engine-side C++.
This code provides the glue between the Flutter engine and the Android platform, and is responsible for:
[!CAUTION] This is a best effort attempt to document the Android embedder. It is not guaranteed to be up to date or complete. If you find a discrepancy, please send a pull request!
See also:
../../tools/android_lint/bin/main.dart
How to edit and contribute to the Android embedder.
![TIP] This guide assumes you already have a working Engine development environment:
You should also have a working Android development environment:
It is also recommended (but not required) to install Visual Studio Code.
Depending on what you are trying to do, you may need to edit the Java code in io.flutter
or the C++ code in shell/platform/android
, sometimes both. Let's start with the C++ code, as it is more similar to developing for other platforms or platform-agnostic parts of the engine.
The C++ code for the Android embedder is located in shell/platform/android
and subdirectories.
Some notable files include:
context/android_context.h
: Holds state that is shared across Android surfaces.jni/platform_view_android_jni.h
: Allows calling Java code running in the JVM.AndroidManifest.xml
: Used by android_lint
.BUILD.gn
: Used by GN to build the C++-side embedder tests and the flutter.jar
file for the engine.ndk_helpers.h
: Helper functions for dynamically loading and calling Android NDK (C/C++) functions.platform_view_android.h
: The main entry point for the Android embedder.See VSCode with C/C++ Intellisense for how to use the clangd
extension to get C++ code completion:
![NOTE] >
--compile-commands-dir
must point to an Android build output:{ /* ... */ "clangd.path": "buildtools/mac-arm64/clang/bin/clangd", "clangd.arguments": ["--compile-commands-dir=out/android_debug_unopt_arm64"] /* ... */ }... but remember to change it back when editing other parts of the engine.
The Java code for the Android embedder is located in io/flutter/
and subdirectories.
The tests are located in test/io/flutter/
, and the test runner in test_runner
.
Some notable files include:
io/flutter/embedding/android/FlutterActivity.java
: An activity that displays a full-screen Flutter UI.io/flutter/embedding/engine/FlutterJNI.java
: The Java interface for the C++ engine.io/flutter/view/TextureRegistry.java
: Registry of backend textures used by a Flutter View.It is non-trivial to get a working IDE setup for editing Java code in the Flutter engine. Some developers have had success using VSCode as an IDE for the Android Embedding, but the following instructions are for if that doesn't work, or you want to use Android Studio:
Open shell/platform/android
in Android Studio.
Configure the following:
Preferences | Build, Execution, Deployment | Gradle-Android Compiler
Command-line Options:
-Pbuild_dir="/tmp/build_dir" -Pflutter_jar="$ENGINE/src/out/android_debug_unopt_arm64/flutter.jar"
Preferences | Build, Execution, Deployment | Build Tools | Gradle
Distribution of Local Installation
with:
$ENGINE/src/third_party/gradle
Gradle SDK using Android Studio (path depends on your machine):
/Applications/Android Studio.app/Contents/jbr/Contents/Home
Sync Gradle.
At this point you should be able to open Java files in Android Studio and get code completion in the io/flutter
folder (additional, undocumented work is required for test/io/flutter
). For example, FlutterJNI.java
: