-
Notifications
You must be signed in to change notification settings - Fork 1
Setting up the Engine development environment
If you've already built the engine and have the configuration set up but merely need a refresher on actually compiling the code, see Compiling the engine.
Make sure you have the following dependencies available:
- Linux, macOS, or Windows.
- Linux supports cross-compiling artifacts for Android and Fuchsia, but not iOS.
- macOS supports cross-compiling artifacts for Android and iOS.
- Windows doesn't support cross-compiling artifacts for any of Android, Fuchsia, or iOS.
- git (used for source version control).
- An IDE. See also the section at the bottom of this page for advice on setting up syntax highlighting while editing the engine.
- An ssh client (used to authenticate with GitHub).
- Chromium's
depot_tools
(make sure it's in your path). We use the
gclient
tool from depot_tools. - Python (used by many of our tools, including
gclient
). - On macOS and Linux: curl and unzip (used by
gclient sync
). - On Windows:
- Visual Studio 2017 or later (required for non-Googlers only).
- Windows 10 SDK (required for non-Googlers only).
- Be sure to install the "Debugging Tools for Windows" feature.
- On macOS: the latest Xcode.
- Recommended for Googlers: Goma for distributed builds. The compiling page has more information on how to set this up.
You do not need Dart installed,
as a Dart tool chain is automatically downloaded as part of the "getting the code"
step. Similarly for the Android SDK, it's downloaded by the gclient sync
step below.
Run the following steps to set up your environment:
- Fork
https://github.com/flutter/engine
into your own GitHub account. If you already have a fork, and are now installing a development environment on a new machine, make sure you've updated your fork so that you don't use stale configuration options from long ago. Do not clone this repo locally, scripts will take care of that for you. - If you haven't configured your machine with an SSH key that's known to github then follow the directions here: https://help.github.com/articles/generating-ssh-keys/.
- Create an empty directory called
engine
for your copy of the repository andcd
into it. (It is possible to use a different name, but some tools assume this name unless configured otherwise, so calling itengine
will make thing easier.) - Create a
.gclient
file in theengine
directory with the following contents, replacing<your_name_here>
with your GitHub account name:solutions = [ { "managed": False, "name": "src/flutter", "url": "[email protected]:<your_name_here>/engine.git", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", }, ]
-
gclient sync
in that directory. This will fetch all the source code that Flutter depends on. Avoid interrupting this script, as doing so can leave your repository in an inconsistent state that is tedious to clean up. (This step automatically runsgit clone
, among other things.) - Add a remote for the upstream repository:
-
cd src/flutter
(This was created in yourengine
directory bygclient sync
.) -
git remote add upstream [email protected]:flutter/engine.git
(So that you fetch from the masterflutter/engine
repository, not your clone, when runninggit fetch
et al.) -
cd ..
(Return to thesrc
directory thatgclient sync
created in yourengine
directory.)
-
- If you're on Linux, the following may or may not help you install
required dependencies. Note: These scripts are
distro- and version-specific, so are not guaranteed to work on
any configuration. If they fail, you may need to find comparable
packages to the ones that weren't found. You are free to update
them if you wish for your distribution, but it is often easier to
just install the packages you need as you go, particularly for the
install-build-deps.sh
script.sudo ./build/install-build-deps-android.sh
sudo ./build/install-build-deps.sh
sudo ./flutter/build/install-build-deps-linux-desktop.sh
- If you're on Mac:
- install Oracle's Java JDK, version 1.8 or later
- If you're planning on working on the
buildroot repository as
well, and have a local checkout of that repository, run the
following commands in the
src
directory to update your git remotes accordingly:git remote rename origin upstream git remote add origin [email protected]:<your_name_here>/buildroot.git
Next steps:
- Compiling the engine explains how to actually get builds, now that you have the code.
- The flutter tool has a section explaining how to use custom engine builds.
On Mac, you can simply use Xcode (e.g., open out/host_debug_unopt/products.xcodeproj
).
VSCode can provide some IDE features using the C/C++ extension. It will provide basic support on install without needing any additional configuration. There will probably be some issues, like header not found errors and incorrect jump to definitions.
Intellisense can also use our compile_commands.json
for more robust functionality. Either symlink src/out/compile_commands.json
to the project root at src
or provide an absolute path to it in the c_cpp_properties.json
config file. See "compile commands" in the c_cpp_properties.json reference. This will likely resolve the basic issues mentioned above.
For adding IDE support to the Java code in the engine with VSCode, see "Using VSCode as an IDE for the Android Embedding".
Alternatively, cquery and a derivative ccls are highly scalable C/C++/Objective-C language server that supports IDE features like go-to-definition, call hierarchy, autocomplete, find reference etc that works reasonably well with our engine repo.
They(https://github.com/cquery-project/cquery/wiki/Editor-configuration) supports editors like VSCode, emacs, vim etc.
To set up:
- Install cquery
-
brew install cquery
orbrew install ccls
on osx; or - Build from source
-
- Generate compile_commands.json which our GN tool already does such as via
src/flutter/tools/gn --ios --unoptimized
- Install an editor extension such as VSCode-cquery or vscode-ccls
- VSCode-query and vscode-ccls requires the compile_commands.json to be at the project root. Copy or symlink
src/out/compile_commands.json
tosrc/
orsrc/flutter
depending on which folder you want to open. - Follow Setting up the extension to configure VSCode-query.
- VSCode-query and vscode-ccls requires the compile_commands.json to be at the project root. Copy or symlink
-
Install the extensions vscjava.vscode-java-pack and vscjava.vscode-java-dependency.
-
Right click on the
shell/platform/android
folder in the engine source and click onAdd Folder to Java Source Path
. This creates an anonymous workspace and turns those files from "syntax mode" to "compile mode". At this point, you should see a lot of errors since none of the external imports are found. -
Find the "Java Dependencies" pane in your Explorer view. Use the "Explorer: Focus on Java Dependencies View" command if hidden.
-
Refresh the view and find the "flutter_*" project. There should be a "_/shell/platform/android" source folder there.
-
In the "Referenced Libraries" sibling node, click the + button, navigate to
engine/src/third_party/android_embedding_dependencies
and add the entire folder. This is the equivalent of adding"java.project.referencedLibraries": [ "{path to engine}/src/third_party/android_embedding_dependencies/lib/**/*.jar" ]
to your VSCode's settings.json for your user or for your workspace.
-
If you previously had a
shell/platform/android/.classpath
, delete it.
-
Create snippets for header files with this configuration. This will let you use
hdr
keyboard macro to create the boiler plate header code. Also consider some of these settings and more tips. -
To format GN files on save, consider using this extension.
- Home of the Wiki
- Roadmap
- API Reference (stable)
- API Reference (master)
- Glossary
- Contributor Guide
- Chat on Discord
- Code of Conduct
- Issue triage reports
- Our Values
- Tree hygiene
- Issue hygiene and Triage
- Style guide for Flutter repo
- Project teams
- Contributor access
- What should I work on?
- Running and writing tests
- Release process
- Rolling Dart
- Manual Engine Roll with Breaking Commits
- Updating Material Design Fonts & Icons
- Postmortems
- Setting up the Framework development environment
- The Framework architecture
- The flutter tool
- API Docs code block generation
- Running examples
- Using the Dart analyzer
- The flutter run variants
- Test coverage for package:flutter
- Writing a golden-file test for package:flutter
- Setting up the Engine development environment
- Compiling the engine
- Debugging the engine
- Using Sanitizers with the Flutter Engine
- Testing the engine
- The Engine architecture
- Flutter's modes
- Engine disk footprint
- Comparing AOT Snapshot Sizes
- Custom Flutter engine embedders
- Custom Flutter Engine Embedding in AOT Mode
- Flutter engine operation in AOT Mode
- Engine-specific Service Protocol extensions
- Crashes
- Supporting legacy platforms
- Metal on iOS FAQ
- Engine Clang Tidy Linter
- Why we have a separate engine repo
- Reduce Flutter engine size with MLGO
- Setting up the Plugins development environment
- Setting up the Packages development environment
- Plugins and Packages repository structure
- Plugin Tests
- Contributing to Plugins and Packages
- Releasing a Plugin or Package
- Unexpected Plugins and Packages failures