Flutter混合开发-Android
Why Flutter ?
Flutter框架与应用
框架与Source Code
整体框架
Source Code
所以从上面的分析可以看出,为了实现Flutter的平台无差异性,Google主要在 PlatForm Integration和Dart:UI部分做了适配工作。
APK(Android应用)结构
我们通过解压一个release的混合开发APK包,来探索一下加入了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库。
-
开发步骤
- 在Flutter模式下进行flutter相关功能的开发。
- 将代码打包成一个aar库上传到repository中去进行版本控制。
- 切换分支到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
完成混合开发模式下的打包操作。
作者:Flutter编程指南
链接:https://www.jianshu.com/p/48daeb72c44c
原文地址:https://www.cnblogs.com/wjw334/p/12693178.html
- 这样入门asp.net core 之 静态文件
- 高效能程序员的七个习惯
- 这样入门asp.net core,如何
- Javascript继承,再谈
- 程序员的暴力美学
- Reactor模式的.net版本简单实现--DEMO
- 能花钱的,就不要花时间
- Lombok介绍、使用方法和总结
- JDK1.7源码分析01-Collection
- Spring boot自定义启动字符画(banner)
- 产品解析:Github Atom
- Docker+Jenkins持续集成环境(5): android构建与apk发布
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
- 易企秀前端压缩源码分析与还原
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 听说Mysql你很豪横?-------------MySQL5.7主从同步
- 听说Mysql你很豪横?-------------MySQL5.7主从复制!读写分离!
- Vue兄弟组件传值
- Vue设置浏览器的标题title和图标icon
- VantUI封装自定义Tabbar路由跳转
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)
- jQuery实现点击添加样式同胞移除样式
- 微信小程序生命周期
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
- 微信小程序下拉刷新上拉加载
- 微信小程序引用自定义组件
- 听说Mysql你很豪横?-------------搭建MySQL MHA实现数据库高可用( MySQL MHA概述、 搭建 MySQL MHA、 MySQL MHA 故障切换)
- jQuery点击click()事件
- 大点干!早点散----------深入剖析LVS负载均衡群集原理
- javascript中元素的scrollLeft和scrollTop属性说明