Flutter -- 18.项目代码关联渲染引擎

1.这里创建一个Flutter项目(App)

  • 使用Xcode打开其中的iOS工程
  • 打开Generated.xcconfig添加环境变量
//添加环境变量
//1.引擎代码的src路径
FLUTTER_ENGINE=/Users/mac/Desktop/Flutter-Engine/engine_download/src
//2.使用引擎对应版本,模拟器版本
LOCAL_ENGINE=ios_debug_sim_unopt
  • Command+R运行该iOS项目

2. 工程关联过程(Xcode->Dart)

  • iOS脚本配置在Target->Build Phases->Run Script
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
  • 进入$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh($FLUTTER_ROOT为FlutterSDK位置)
  • xcode_backend.sh
#!/usr/bin/env bash
# Copyright 2014 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# exit on error, or usage of unset var
set -euo pipefail

# Needed because if it is set, cd may print the path it changed to.
unset CDPATH

function follow_links() (
  cd -P "$(dirname -- "$1")"
  file="$PWD/$(basename -- "$1")"
  while [[ -h "$file" ]]; do
    cd -P "$(dirname -- "$file")"
    file="$(readlink -- "$file")"
    cd -P "$(dirname -- "$file")"
    file="$PWD/$(basename -- "$file")"
  done
  echo "$file"
)

PROG_NAME="$(follow_links "${BASH_SOURCE[0]}")"
BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
FLUTTER_ROOT="$BIN_DIR/../../.."
DART="$FLUTTER_ROOT/bin/dart"

"$DART" "$BIN_DIR/xcode_backend.dart" "$@"
  • xcode_backend.sh没有使用到Generated.xcconfig文件中的环境变量
  • xcode工程执行了这个脚本后,然后执行到了xcode_backend.dart这个文件

  • 进入xcode_backend.dart文件,之前的环境变量在这个文件使用到了。具体代码太长就没有贴出来

3.证明运行的iOS项目与我自己的渲染引擎已经关联

  • 1.在运行中的项目下一个断点touchesBegan:withEvent:
br set -n "touchesBegan:withEvent:"
  • 2.点击屏幕,过掉一些UI相关的断点后,进入FlutterViewController.mm断点
    touchBegan_breakpoint.png
  • 3.在touchesBegan添加打印语句
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    NSLog(@"123");
  [self dispatchTouches:touches pointerDataChangeOverride:nullptr event:event];
}
  • 4.通过Command+j查看不到FlutterViewController.mm文件所在位置
  • 5.猜测FlutterViewController.mm是在Flutter引擎代码里,打开ios_debug_sim_unopt工程查看
    flutter_engin_code.png

1.这里可以清晰的看到,刚才写的打印语句在Flutter引擎代码里面
2.此时Xcode工程和FLutter渲染引擎已经关联起来了

4.为什么点击屏幕控制台不执行打印语句?

  • 原因其实很简单,当我们引擎改了代码,需要使用ninja去编译一次
  • Xcode工程使用的是Flutter.framework,因此修改后必须编译一次更新Flutter.framework
mac@mac out % ninja -C host_debug_unopt && ninja -C ios_debug_sim_unopt
ninja: Entering directory `host_debug_unopt'
ninja: no work to do.
ninja: Entering directory `ios_debug_sim_unopt'
[16/16] STAMP obj/default.stamp
  • Xcode工程停掉,再运行
  • 点击模拟器屏幕,此时打印输出正常

5.原理剖析

  • 此时查看FlutterViewController.mm文件所在位置
  • 你会惊讶的发现FlutterViewController.mm文件不在ios_debug_sim_unopt目录下
  • 路径为/src/flutter/shell/platform/darwin/ios/framework/Source
  • 源码存放的位置并不在编译后的文件内,而是在引擎源码的其它目录下

    总结
  • 因此并不是每编译一次模拟器/真机(release/debug),就会重新生成一份源码
  • 它是根据同一份源码编译出不同的产物

6.md5检查Flutter.framework

  • 比对4次Flutter.framework的md5值(2次自定义版本,2次发布版本)


    Product_flutterframework.png
  • 1.Generated.xcconfig添加环境变量,使用自定义引擎
mac@mac Flutter.framework % md5 Flutter
MD5 (Flutter) = 417ded8d1d0c7999c680ac31a9aae3f3
  • 2.Generated.xcconfig注释环境变量+编译,使用发布版本引擎
mac@mac Flutter.framework % md5 Flutter
MD5 (Flutter) = 15efda2506d5e9c6904ceb1837b26124
  • 3.Generated.xcconfig添加环境变量,使用自定义引擎
mac@mac Flutter.framework % md5 Flutter
MD5 (Flutter) = 0e4c584880f59b3b35ec48d68f820c93
  • 4.Generated.xcconfig注释环境变量+编译,使用发布版本引擎
mac@mac Flutter.framework % md5 Flutter
MD5 (Flutter) = 6735d5613997e710ed37b9a27aab8bfc
  • 可以看出,每一次的md5值是不一样的
  • 工程每次编译在生成Flutter.framework都是不一样的(无论是发布版本还是自定义版本)
  • 工程在每次编译生成Flutter.framework的时候还要加入内容的,因此多次是不一样的

7.Xcode13不显示Product目录

  • 打开项目project.pbxproj
  • 搜索productRefGroup
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146E51CF9000F007C117D /* Products */;
  • productRefGroup的值换成mainGroup的(这里的我已经修改好了)
  • Command+s保存后退出,就会发现工程中的Product目录显示出来了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容