如何进行Flutter混合开发

栏目: IOS · Android · 发布时间: 7年前

内容简介:所以从上面的分析可以看出,为了实现Flutter的平台无差异性,Google主要在 PlatForm Integration和Dart:UI部分做了适配工作。我们通过解压一个release的混合开发APK包,来探索一下加入了Flutter之后的包到底发生了哪些变化以及这些变化对应的作用是什么。从上图的标记中可以清楚的看出变化点
如何进行Flutter混合开发

所以从上面的分析可以看出,为了实现Flutter的平台无差异性,Google主要在 PlatForm Integration和Dart:UI部分做了适配工作。

APK(Android应用)结构

我们通过解压一个release的混合开发APK包,来探索一下加入了Flutter之后的包到底发生了哪些变化以及这些变化对应的作用是什么。

如何进行Flutter混合开发

从上图的标记中可以清楚的看出变化点

  • 变化1

    未在图中标出,但是我相信大部分的开发者应该可以猜的到,就是在dex中打入了 PlatForm Integration的代码(FutterActivity,FlutterApplication,FlutterView etc.)

  • 变化2

    assets下面的4个文件,内容均为arm指令

    • isolate_snapshot_data/isolate_snapshot_instr

      对应了我们的Flutter代码进行AOT编译,用于创建一个新isolate

    • vm_snapshot_data/vm_snapshot_instr

      用于初始化Dart VM,提供 runTime,gc等服务

    由于该部分内容通过gen_snapshot编译生成,且存放在App的data目录下面,所以

    为以后的动态更新提供了可能。

  • 变化3

    ICU Dart Language包,提供语言相关的数据信息。

  • 变化4

​ Flutter Engine层的代码

Flutter混合模式

相信对于绝大多数应用来说,从零开始重新做一个App的成本是相当高的,所以混合开发成了它们尝试Flutter的首选。

闲鱼模式

双Branch共存(Flutter模式 && Standalone模式)

Standalone模式:纯Native开发或者是平台打包下的模式

Flutter模式:进行flutter相关功能的开发,库生成,编译和调试走的都是Flutter定义的流程。

  • 优点

在Standalone模式下,纯Native开发者和打包平台,对Flutter是无感知的。在这种情况下,Flutter相关的代码可以认为是一个常规的第三方库文件。

  • 前期准备

    理清Standalone模式下对Flutter的依赖并将它们提取成一个aar库。

  • 开发步骤

    1. 在Flutter模式下进行flutter相关功能的开发。
    2. 将代码打包成一个aar库上传到repository中去进行版本控制。
    3. 切换分支到Standalone模式,修改相关依赖包的版本号。

    当然这种方法在实际的开发过程中还会遇到很多其他问题,比如复杂流程下生成aar库脚本的编写,比如两个模式下的代码同步等。

Google模式

对与方便的进行Flutter的混合模式开发呼声有多高,Google专门为了这个问题建立了Wiki并且进行了持续4个月42个版本的更新。

创建Flutter Module模式

1.1.1 切换flutter分支

假如直接使用

$ cd some/path/
$ flutter create -t module my_flutter
复制代码

会出现无法识别 command module的错误,查找其原因发现我们默认clone的分支是flutter的beta版本并不支持module命令所以首先需要

flutter channel
flutter channel master
flutter upgrade
复制代码

将分支切换到master并且进行upgrade操作。

1.1.2 创建Flutter module模版

flutter create -t module flutter_module
复制代码

这个时候会看到project中新增加了一个flutter_module,其中包含了.android,.ios和关键的include_flutter.groovy文件

1.1.3 将Flutter添加到现有工程中

  • 在android工程的根目录的settings.gradle中添加

    include ':app'                                     // assumed existing content
    setBinding(new Binding([gradle: this]))                                 // new
    evaluate(new File(                                                      // new
      settingsDir.parentFile,                                               // new
      'flutter_module/.android/include_flutter.groovy'                      // new
    )) 
    复制代码
  • 在app的build.gradle中添加依赖

    dependencies {
      implementation project(':flutter')
    复制代码

1.1.4 总而言之

简单的说,Google在兼顾维护成本和开发成本的前提下,为了Insert flutter module ,建立了一个逻辑依赖链

flutter_module/.android/include_flutter.groovy ->
flutter_module/.android/Flutter/build.gradle ->
$flutterRoot/packages/flutter_tools/gradle/flutter.gradle 
复制代码

利用 $flutterRoot/packages/flutter_tools/lib/中的flutter command &&

$AndroidRoot/build-tools/buildToolsVersion/中的android command

完成混合开发模式下的打包操作。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ethnography and Virtual Worlds

Ethnography and Virtual Worlds

Tom Boellstorff、Bonnie Nardi、Celia Pearce、T. L. Taylor / Princeton University Press / 2012-9-16 / GBP 21.00

"Ethnography and Virtual Worlds" is the only book of its kind - a concise, comprehensive, and practical guide for students, teachers, designers, and scholars interested in using ethnographic methods t......一起来看看 《Ethnography and Virtual Worlds》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具