美文网首页
FlutterEngine开发

FlutterEngine开发

作者: 今年27 | 来源:发表于2022-12-06 10:09 被阅读0次

以iOS为例,在ios工程目录下存在两个文件夹
App.frameworkFlutter工程源码即dart源码
Flutter.frameworkFlutterEngine底层代码
所以我们如果要做FlutterEngine开发实际上修改的是Flutter.framework的源码

那么系统中FlutterEnginesdk在哪呢:
我们可以执行
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 --version 可以很明显的看到我的flutter sdk1.17.1版本, engine6bc433c6b6,只能看到一个不完整的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文件夹下的所有代码了

engine

编译引擎代码
我们需要用到上图标红的gn,这是一个生成Ninja构建文件的元构建系统

#构建iOS设备使用的引擎
#真机debug版本
./gn --ios --unoptimized
#真机release版本(日常开发使用,如果我们要自定义引擎)
./gn --ios --unoptimized --runtime-mode=release
#模拟器版本
./gn --ios --simulator --unoptimized
#主机端(Mac)构建
./gn --unoptimized

构建完成会有4个Xcode项目

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文件。在里面添加两个环境变量

iOS工程
稍微解释一下
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
可执行文件为一个文件。

相关文章

网友评论

      本文标题:FlutterEngine开发

      本文链接:https://www.haomeiwen.com/subject/rwdifdtx.html