编译Flutter源码

Catalogue   

Mac下编译Engine

Engine实现了Flutter的核心库,包括动画、图形、文件、网络、访问支持、插件架构、Dart的运行时、编译工具链等

准备工作

1
2
3
4
5
6
7

# 准备depot_tools工具
# 假设当前目录是$HOME/Flutter/source
cd $HOME/Flutter/source
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
#添加环境变量
export PATH=$PATH:$HOME/Flutter/source/depot_tools

下载源码

  1. 进入github的flutter官网,fork一份engine的源码:https://github.com/flutter/engine

  2. 在$HOME/Flutter/source目录新建.gclient文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    solutions = [
    {
    "managed": False,
    "name": "src/flutter",
    "url": "git@github.com:airshu/engine.git",//这里使用自己的仓库地址
    "custom_deps": {},
    "deps_file": "DEPS",
    "safesync_url": "",
    },
    ]
  3. 运行命令:gclient sync

  4. 同步最新的分支代码

    1
    2
    3
    4
    5
    6

    cd src/flutter
    git remote add upstream git@github.com:flutter/engine.git
    cd ..
    gclient sync

调整版本

1
2
3
4
5
6
7
8
9

#查看engine对应版本获取commit id
vim src/flutter/bin/internal/engine.version

# 调整代码
cd engine/src/flutter
git reset --hard <commit id>
gclient sync -D --with_branch_heads --with_tags

编译iOS平台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cd xxx/source #source目录为自定义的源码目录
# 下载对应Engine的Flutter Framework源码 https://github.com/flutter/flutter
cd flutter
# 不建议使用master分支,这里使用2.5.1的分支
git pull origin flutter-2.5-candidate.1:flutter-2.5-candidate.1
# 查看该分支的提交版本号
cat bin/internal/engine.version
# 进入src/flutter目录,切换分支
cd ../src/flutter
git checkout -b a877f6fed68e1b961f76ec0fece9e7c684679e75
cd ..
gclient sync

./flutter/tools/gn --ios --unoptimized
./flutter/tools/gn --unoptimized
ninja -C out/ios_debug_unopt && ninja -C out/host_debug_unopt

# 使用
cd xxx/source
./flutter/bin/flutter create hello_world
cd hello_world
# 用本地编译的Engine运行项目
../flutter/bin/flutter run --local-engine-src-path ~/flutter/source/src --local-engine=ios_debug_unopt

编译Android平台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


# 预编译设备侧可执行文件
./flutter/tools/gn --android --unoptimized
#预编译arm64设备的预编译文件
./flutter/tools/gn --android --android-cpu arm64 --unoptimized
#预编译host-side可执行文件
./flutter/tools/gn --unoptimized

## 构建
# 构建设备侧可执行文件
ninja -C out/android_debug_unopt -j 8
# 构建arm64平台
ninja -C out/android_debug_unopt_arm64
# 编译host-side文件
ninja -C out/host_debug_unopt

Debug源码

Debug Java层源码

  1. 将engine/src/flutter/shell/platform/android(Flutter引擎项目)目录导入Android Studio
  2. 用本地Engine运行Flutter项目
1
2
3
4
#local-engine-src-path指向源码目录
#local-engine指向编译的目标
#也可以直接在gradle.properties中配置这两个属性
../flutter/bin/flutter run --local-engine=android_debug_unopt --local-engine-src-path=/Users/xpeng/flutter/source/src
  1. Flutter引擎项目进行attach,选中Show all processes

注意

attach的时候,有些代码已经运行过了。如果想要早一点断点,可以使用Debug.waitForDebugger(),应用一直处于等待状态,直到有Debugger连接才执行。

1
2
3
4
5
6
7
8
9
10
11
// 添加App文件,配置Application
package com.yourdomain.your_app_name
import android.os.Debug
import io.flutter.app.FlutterApplication

class App:FlutterApplication() {
override fun onCreate() {
Debug.waitForDebugger()
super.onCreate()
}
}

Debug C++层源码

参考