以iOS为例,在ios工程目录下存在两个文件夹
App.framework
:Flutter
工程源码即dart源码
Flutter.framework
:FlutterEngine
底层代码
所以我们如果要做FlutterEngine
开发实际上修改的是Flutter.framework的源码
那么系统中FlutterEngine
的sdk
在哪呢:
我们可以执行
cd /opt/flutter/bin/cache/artifacts/engine/ios/Flutter.framework
在这个文件夹下可以看到Flutter的可执行文件
执行
file Flutter
则可以看到如下信息,分别对应不同的架构
Flutter: Mach-O universal binary with 3 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm_v7] [arm64]
Flutter (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
Flutter (for architecture armv7): Mach-O dynamically linked shared library arm_v7
Flutter (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
执行 flutter version
可以看到所有的flutter 版本
我们可以通过flutter --version查看本地的版本
flutter --version 可以很明显的看到我的flutter
sdk
为1.17.1
版本, engine
为6bc433c6b6
,只能看到一个不完整的commit id
。我们需要这个
id
来拉取flutter engine
的代码。我们输入
flutter channel
,可以看到当前flutter
的分支为stable
flutter channel
我们可以通过
flutter channel
命令带不同的分支名来切换分支,比如 flutter channel master
ok接下来,我们就要开始下载我们的engine
代码了
我们依次执行
mkdir engine
//创建engine文件夹,注意不要用中文
touch .gclient
//创建.gclient文件
然后修改.gclient
文件为如下代码
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:flutter/engine.git@6bc433c6b6b5b98dcf4cc11aff31cdee90849f32",
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
其中6bc433c6b6b5b98dcf4cc11aff31cdee90849f32
这个该怎么确定呢?
我们上面也说了,通过flutter --version
并不能拿到完全的commit id
,接下来我们可以这么做
cd /opt/flutter/bin/internal
在internal文件夹下有个engine.version
文件,查看该文件即可知版本号
cat engine.version
就可以得到
6bc433c6b6b5b98dcf4cc11aff31cdee90849f32
那么我们该怎么运行.gclient
文件?这个就要用到
Chromium
提供的部署工具depot_tools
这个工具在webrtc
编译也会用到,功能很强大
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
即可下载该工具
配置环境变量
export DEPOT_TOOLS=/Users/apple/depot_tools/
export PATH=$DEPOT_TOOLS:$PATH
因为我是放在apple文件夹下的(记得source .bash_profile 来刷新配置,或者重启终端也可)
然后我们就可以运行.gclient
文件了,即
gclient sync
接下来就是漫长的下载过程了,下载完毕之后
我们就可以看到engine
文件夹下的所有代码了
编译引擎代码
我们需要用到上图标红的gn
,这是一个生成Ninja
构建文件的元构建系统
#构建iOS设备使用的引擎
#真机debug版本
./gn --ios --unoptimized
#真机release版本(日常开发使用,如果我们要自定义引擎)
./gn --ios --unoptimized --runtime-mode=release
#模拟器版本
./gn --ios --simulator --unoptimized
#主机端(Mac)构建
./gn --unoptimized
构建完成会有4个Xcode
项目
然后用Ninja
编译这四个Xcode
项目,你也可以只编译其中一个,针对版本编译
ninja -C host_debug_unopt && ninja -C ios_debug_sim_unopt && ninja -C ios_debug_unopt && ninja -C ios_release_unopt
配置项目代码
以iOS
为例,在iOS
工程中,找到Generated.xcconfig
文件。在里面添加两个环境变量
稍微解释一下
Debug.xcconfig
是调试配置Release.xcconfig
是发布版本Generated.xcconfig
是通用版本,即Debug与Release同时生效
再提一嘴,在Build Phases有个脚本
script
这个脚本用来执行这些环境变量
FLUTTER_ENGINE=你存放引擎代码的路径/engine/src
#使用的引擎对应版本(这里是iOS-debug模式下-模拟器的版本)
LOCAL_ENGINE=ios_debug_sim_unopt
然后运行Xcode
工程, 我们自己的flutter engine
就加载好了
那么如何去验证呢?
我们可以在控制台输入
br set -n "touchBegan:withEvent:"
然后点击模拟器屏幕就会跳转到对应的引擎代码处
当我们修改的引擎的代码后,我们需要继续用Ninja
编译修改后的代码,然后用Xcode
运行项目。
这差不多是FlutterEngine开发的整个过程了
小知识
engine/ios/Flutter.framework
文件夹下的Flutter
可执行文件与项目ios/Flutter.framework
文件夹下的Flutter
可执行文件为一个文件。
网友评论