CONTRIBUTING.md 11.0 KB
Newer Older
1 2
Contributing to the Flutter engine
==================================
A
Adam Barth 已提交
3

4
[![Build Status](https://travis-ci.org/flutter/engine.svg)](https://travis-ci.org/flutter/engine)
A
Adam Barth 已提交
5

I
Ian Hickson 已提交
6 7 8
Things you will need
--------------------

C
Collin Jackson 已提交
9
 * Linux or Mac OS X. (Windows is not yet supported.)
I
Ian Hickson 已提交
10
 * git (used for source version control).
I
Ian Hickson 已提交
11
 * An IDE. We recommend [Atom](https://github.com/flutter/engine/wiki/Using-Atom-with-Flutter).
I
Ian Hickson 已提交
12
 * An ssh client (used to authenticate with GitHub).
A
Adam Barth 已提交
13
 * Chromium's [depot_tools](http://www.chromium.org/developers/how-tos/install-depot-tools) (make sure it's in your path). We use the `gclient` tool from depot_tools.
I
Ian Hickson 已提交
14 15
 * Python (used by many of our tools, including 'gclient').
 * curl (used by `gclient sync`).
I
Ian Hickson 已提交
16

I
Ian Hickson 已提交
17
You do not need [Dart](https://www.dartlang.org/downloads/linux.html) 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 build step below where you run `download_android_tools.py`.
I
Ian Hickson 已提交
18

I
Ian Hickson 已提交
19 20
Getting the code and configuring your environment
-------------------------------------------------
A
Adam Barth 已提交
21

I
Ian Hickson 已提交
22
 * Ensure all the dependencies described in the previous section, in particular git, ssh, depot_tools, python, and curl, are installed.
I
Ian Hickson 已提交
23
 * 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.
I
Ian Hickson 已提交
24
 * If you haven't configured your machine with an SSH key that's known to github then
H
updated  
Hans Muller 已提交
25
   follow the directions here: https://help.github.com/articles/generating-ssh-keys/.
I
Ian Hickson 已提交
26
 * Create an empty directory for your copy of the repository. For best results, call it `engine`: some of the tools assume this name when working across repositories. (They can be configured to use other names too, so this isn't a strict requirement.)
27
 * Create a `.gclient` file in the `engine` directory with the following contents, replacing
A
Adam Barth 已提交
28
   `<your_name_here>` with your GitHub account name:
A
Adam Barth 已提交
29 30 31 32 33

```
solutions = [
  {
    "managed": False,
34
    "name": "src/flutter",
35
    "url": "git@github.com:<your_name_here>/engine.git",
A
Adam Barth 已提交
36 37 38 39 40 41 42
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
  },
]
target_os = ["android"]
```
43 44

 * `cd engine` (Change to the directory in which you put the `.gclient` file.)
I
Ian Hickson 已提交
45
 * `gclient sync` This will fetch all the source code that Flutter depends on. Avoid interrupting this script, it can leave your repository in an inconsistent state that is tedious to clean up.
46
 * `cd src` (Change to the directory that `gclient sync` created in your `engine` directory.)
I
Ian Hickson 已提交
47
 * `git remote add upstream git@github.com:flutter/engine.git` (So that you fetch from the master repository, not your clone, when running `git fetch` et al.)
I
Ian Hickson 已提交
48
 * Run `./tools/android/download_android_tools.py` to add Android dependencies to your tree. You will need to run this command again if you ever run `git clean -xdf`, since that deletes these dependencies. (`git clean -df` is fine since it skips these `.gitignore`d files.)
49 50
 * Add `.../engine/src/third_party/android_tools/sdk/platform-tools` to your path so that you can run the `adb` tool more easily. This is also required by the `flutter` tool, which is used to run Flutter apps.
 * Make sure you are still in the `src` directory that the `gclient sync` step created earlier.
51 52
 * If you're on Linux, run `sudo ./build/install-build-deps-android.sh`
 * If you're on Linux, run `sudo ./build/install-build-deps.sh`
I
Ian Hickson 已提交
53
 * If you're on Mac, install Oracle's Java JDK, version 1.7 or later.
54
 * If you're on Mac, install `ant`: `brew install ant`
A
Adam Barth 已提交
55

56 57
Building and running the code
-----------------------------
A
Adam Barth 已提交
58

59 60 61 62 63 64 65 66 67 68 69 70 71
### General

Most developers will use the `flutter` tool in [the main Flutter repository](https://github.com/flutter/flutter) for interacting with their built flutter/engine.  To do so, the `flutter` tool accepts two global parameters `local-engine-src-path` and `local-engine`, a typical invocation would be: `--local-engine-src-path /path/to/engine/src --local-engine=android_debug_unopt`.

Additionally if you've modified dart sources in `flutter/engine`, you'll need to add a `dependency_overrides` section to point to your modified `package:sky_engine` and `package:sky_services` to the `pubspec.yaml` for the flutter app you're using the custom engine with.  A typical example would be:
```
dependency_overrides:
  sky_engine:
    path: /path/to/flutter/engine/out/host_debug/gen/dart-pkg/sky_engine
  sky_services:
    path: /path/to/flutter/engine/out/host_debug/gen/dart-pkg/sky_services
```

72 73
### Android (cross-compiling from Mac or Linux)

74
Run the following steps, from the `src` directory created in the steps above:
75

76
 * `gclient sync` to update your dependencies.
77
 * `./flutter/tools/gn --android --unoptimized` to prepare your build files.
78 79 80 81
 * `ninja -C out/android_debug_unopt` to actually build the Android binary.

This builds a debug-enabled ("unoptimized") binary configured to run Dart in
checked mode ("debug"). There are other versions, [discussed on the wiki](https://github.com/flutter/flutter/wiki/Flutter's-modes).
82

83 84
To run an example with your locally built binary, you'll also need to clone
[the main Flutter repository](https://github.com/flutter/flutter). See
A
Adam Barth 已提交
85
[the instructions for contributing](https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md)
86 87
to the main Flutter repository for detailed instructions. For your convenience,
the `engine` and `flutter` directories should be in the same parent directory.
A
Adam Barth 已提交
88

89 90
Once you've got everything set up, you can run an example using your locally
built engine by switching to that example's directory, running `pub get` to make
91
sure its dependencies have been downloaded, and using `flutter run` with an
92 93
explicit `--local-engine-src-path` pointing at the `engine/src` directory. Make
sure you have a device connected over USB and debugging enabled on that device:
A
Adam Barth 已提交
94

95 96
 * `cd /path/to/flutter/examples/hello_world`
 * `pub get`
97
 * `../../bin/flutter run --local-engine-src-path /path/to/engine/src --local-engine=android_debug_unopt`
A
Adam Barth 已提交
98

99 100 101
If you put the `engine` and `flutter` directories side-by-side, you can skip the
tedious `--local-engine-src-path` option and the `flutter` tool will
automatically determine the path.
102

103 104 105 106
You can also specify a particular Dart file to run if you want to run an example
that doesn't have a `lib/main.dart` file using the `-t` command-line option. For
example, to run the `tabs.dart` example in the `examples/widgets` directory on a
connected Android device, from that directory you would run:
107

108
 * `flutter run --local-engine=android_debug_unopt -t tabs.dart`
109

110 111 112 113 114
If you're going to be debugging crashes in the engine, make sure you add
`android:debuggable="true"` to the `<application>` element in the
`android/AndroidManifest.xml` file for the Flutter app you are using
to test the engine.

115 116 117 118
### iOS (cross-compiling from Mac)

* Make sure you have Xcode 7.3.0+ installed.
* `gclient sync` to update dependencies.
119
* `./flutter/tools/gn --ios --unoptimized` to prepare build files.
120 121 122 123 124 125 126 127 128
  * For a discussion on the various flags and modes, [read this discussion](https://github.com/flutter/flutter/wiki/Flutter's-modes).
* `ninja -C out/ios_debug_unopt` to build iOS artifacts.

Once the artifacts are built, you can start using them in your application by following these steps:
* `cd /path/to/flutter/examples/hello_world`
* `pub get`
* `../../bin/flutter run --local-engine-src-path /path/to/engine/src --local-engine=ios_debug_unopt`
  * Depending on the configuration you built, modify the `local-engine` flag.
* If you are debugging crashes in the engine, you can connect the `LLDB` debugger from `Xcode` by opening `ios/Runner.xcodeproj` and starting the application by clicking the Run button (CMD + R).
129 130


131 132 133
### Desktop (Mac and Linux), for tests

 * `gclient sync` to update your dependencies.
134
 * `./flutter/tools/gn` to prepare your build files.
135
 * `ninja -C out/host_debug_unopt` to build a desktop unoptimized binary.
136

137
To run the tests, you'll also need to clone [the main Flutter repository](https://github.com/flutter/flutter).
S
Seth Ladd 已提交
138
See [the instructions for contributing](https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md)
139
to the main Flutter repository for detailed instructions.
140

141 142 143 144 145 146 147 148 149 150 151 152
### Building all the builds that matter on Linux and Android

The following script will update all the builds that matter if you're developing on Linux and testing on Android:

```bash
set -ex

cd ~/dev/engine/src
git fetch upstream
git rebase upstream/master
gclient sync

153 154 155 156 157 158 159
flutter/tools/gn --unoptimized --runtime-mode=debug
flutter/tools/gn --android --unoptimized --runtime-mode=debug
flutter/tools/gn --android --unoptimized --runtime-mode=profile
flutter/tools/gn --android --unoptimized --runtime-mode=release
flutter/tools/gn --android --runtime-mode=debug
flutter/tools/gn --android --runtime-mode=profile
flutter/tools/gn --android --runtime-mode=release
160 161 162 163 164 165 166 167

cd out
ls | xargs -n 1 ninja -C

flutter update-packages --upgrade
```


A
Adam Barth 已提交
168 169 170
Contributing code
-----------------

171
We gladly accept contributions via GitHub pull requests.
172 173

To start working on a patch:
174 175 176

 * `git fetch upstream`
 * `git checkout upstream/master -b name_of_your_branch`
H
Hixie 已提交
177 178 179 180 181
 * Hack away. Please peruse our
   [style guides](https://flutter.io/style-guide/) and
   [design principles](https://flutter.io/design-principles/) before
   working on anything non-trivial. These guidelines are intended to
   keep the code consistent and avoid common pitfalls.
182
 * `git commit -a -m "<your brief but informative commit message>"`
183
 * `git push origin name_of_your_branch`
184 185 186

To send us a pull request:

187 188
 * `git pull-request` (if you are using [Hub](http://github.com/github/hub/)) or
   go to `https://github.com/flutter/engine` and click the
189
   "Compare & pull request" button
C
Collin Jackson 已提交
190

Y
yjbanov 已提交
191 192
Once you've gotten an LGTM from a project maintainer, submit your changes to the
`master` branch using one of the following methods:
193 194 195 196 197 198

* Wait for one of the project maintainers to submit it for you
* Click the green "Merge pull request" button on the GitHub UI of your pull
  request (requires commit access)
* `git push upstream name_of_your_branch:master` (requires commit access)

I
Ian Hickson 已提交
199 200 201 202 203
Then, make sure it doesn't make our tree catch fire by watching [the waterfall](https://build.chromium.org/p/client.flutter/waterfall). The waterfall runs
slightly different tests than Travis, so it's possible for the tree to go red even if
Travis did not. If that happens, please immediately revert your change. Do not check
anything in while the tree is red unless you are trying to resolve the problem.

I
Ian Hickson 已提交
204 205 206 207 208
Please make sure all your checkins have detailed commit messages explaining the patch.
If you made multiple commits for a single pull request, either make sure each one has a detailed
message explaining that specific commit, or squash your commits into one single checkin with a
detailed message before sending the pull request.

C
Collin Jackson 已提交
209 210 211 212
You must complete the
[Contributor License Agreement](https://cla.developers.google.com/clas).
You can do this online, and it only takes a minute.
If you've never submitted code before, you must add your (or your
C
Collin Jackson 已提交
213
organization's) name and contact info to the [AUTHORS](AUTHORS) file.