All of these are non-semantics changing and all were auto-applied by IntelliJ: - Make always `final` stuff final - Avoid unnecessary casts - Annotate `@NonNull` overrides - Avoid initializing callbacks outside of the constructor, and use Java lambdas when applicable - Avoid cases where something is known to be non-null or non-false - Use `<>` when applicable
Android Platform Embedder
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:
- Initializing the Flutter engine.
- Providing a platform view for the Flutter engine to render into.
- Dispatching events to the Flutter engine.
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- Android Platform Views
- Hosting native Android views in your Flutter app with Platform Views
- Testing Android Changes in the Devicelab on an Emulator
- Texture Layer Hybrid Composition
Developing
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.
Editing C++ code
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 byandroid_lint.BUILD.gn: Used by GN to build the C++-side embedder tests and theflutter.jarfile 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-dirmust 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.
Editing Java code
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/androidin Android Studio. -
Configure the following:
-
Preferences | Build, Execution, Deployment | Gradle-Android CompilerCommand-line Options:
-Pbuild_dir="/tmp/build_dir" -Pflutter_jar="$ENGINE/src/out/android_debug_unopt_arm64/flutter.jar" -
Preferences | Build, Execution, Deployment | Build Tools | GradleDistribution of
Local Installationwith:$ENGINE/src/third_party/gradleGradle 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: