flutter 的 sdk基本的划分,engine中包含了第三方库,用于底层交互,framework封装了自己的一套render和gesture等
那么这些都是如何编译进apk中呢?
基本了解之后,构建engine开发环境
一、拉取环境
1、fork一个到自己的仓库中
2、下载depot_tools源码库 并加入环境变量中
用于gclient sync同步flutter的 engine
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
3、创建一个engine代码放置的文件夹engine ,文件夹中创建一个文件vim .gclient
内容如下
solutions = [
{
"managed": False,
"name": "src/flutter",
"url": "git@github.com:zhuang12346413/engine.git",//替换自己的名字
"custom_deps": {},
"deps_file": "DEPS",
"safesync_url": "",
},
]
4、同步代码
gclient sync --verbose
#设置--verbose可以看到下载的过程,方便下载过程中出现问题看到异常信息
gclient sync卡住问题
curl https://www.google.com是否有返回值,若无返回值说明当前网络还是存在问题的,可以尝试重启机器等多种操作
同步到100%会卡住,不要关闭 它还在下文件,网络中可以看到:ubuntu可以通过 sudo nethogs 命令看到
5、git pull upstream master在src/flutter更新
6、切换到与FlutterSDK对应的版本
方法如下:找到${flutterSDK_PATH} /flutter/bin/cache/flutter_sdk.stamp
cat flutter_sdk.stamp //得到flutter版本的commit信息
然后在engine中在src/flutter目录
git reset --hard ${commitid} //commitid替换成前面cat得到的
然后同步一下代码,gclient sync
二、编译
编译是通过flutter/tools/gn ${argument} 构建ninja 编译环境,然后通过ninja编译
1、编译android版本如下
通过命令行构建本地engine
./flutter/tools/gn --android --unoptimized 用于设备端可执行文件。 每一种特定生成一个 out/${cpu} 的文件夹
./flutter/tools/gn --android --unoptimized --android-cpu=arm64 适用于较新的64位Android设备。 不指定release 则生成debug版本
./flutter/tools/gn --android --android-cpu x86 --unoptimized 适用于x86模拟器。
./flutter/tools/gn --android --android-cpu x64 --unoptimized 适用于x64模拟器。
./flutter/tools/gn --unoptimized 对于主机端可执行文件,需要编译代码
编译
ninja -C out/android_debug_unopt 用于设备端可执行文件。
ninja -C out/android_debug_unopt_arm64 适用于较新的64位Android设备。
ninja -C out/android_debug_unopt_x86 适用于x86模拟器。
ninja -C out/android_debug_unopt_x64 适用于x64模拟器。
ninja -C out/host_debug_unopt 用于主机端可执行文件。
这些命令可以组合。例如:ninja -C out/android_debug_unopt && ninja -C out/host_debug_unopt
2、本地engine加入工程
pubspec.yaml文件添加内容如下:
dependency_overrides:
sky_engine:
path: /home/luzz/FlutterSDK/engine/src/out/android_debug_unopt_arm64/gen/dart-pkg/sky_engine
sky_services:
path: /home/luzz/FlutterSDK/engine/src/out/android_debug_unopt_arm64/gen/dart-pkg/sky_services
3、打包进apk
调试
flutter run --local-engine-src-path PATHXXXXX --local-engine=XXXX
例:flutter run --local-engine-src-path /home/luzz/FlutterSDK/engine/src --local-engine=android_debug_unopt_arm64
编译apk
flutter build apk --release --local-engine-src-path /Users/limeihong/Desktop/engine/src --local-engine=android_release
flutter build apk --debug --local-engine-src-path /Users/limeihong/Desktop/engine/src --local-engine=android_debug