Flutter混合开发和Android动态更新实践

感谢闲鱼和csdn的文章给的思路:

本篇是实践性文章包含两部分

将Flutter工程编译后的文件集成到Android项目

将Flutter代码热更新

不涉及源码和理论,想要了解的话可以阅读上面的文章

将Flutter工程编译后的文件集成到Android项目

​ 因为Flutter无法完全替代原生绝大部分项目都是Flutter和Native混合开发的模式,所以存在一部分同学只做Native开发,并不熟悉Flutter技术。如果直接采用Flutter工程来开发,那这部分原生开发同学也需要配置Flutter环境,学习Flutter。

​ 由于上述原因,所以采用flutter项目和原生项目相互独立开发,将flutter项目编译后的文件以module的形式集成到Android项目中。

原理:Android项目依赖flutter的文件

Flutter库

主要是flutter.jar,文件位于Flutter SDK目录下flutter/bin/cache/artifacts/engine

Flutter工程编译文件

isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr、flutter_assets下所有文件

位于Flutter工程build/app/intermediates/flutter/release/下

Flutter Plugin编译文件(暂时没用到,待补充)

集成步骤

在原生项目中新建一个module例如fluttermodule

将flutter.jar放入libs文件夹

将isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr和flutter_assets下所有文件放入assets/flutter_assets/下

为了方便可以在flutter项目中用gradle脚本实现,例如

task copyAndroidFlutterModule << {

println "project.rootDir = ${project.rootDir}/"

println "buildDir = ${this.buildDir}/"

def flutterOutputDir = "${this.buildDir}/flutter_android_output/flutter_module/"

def flutterPluginFile = new File(flutterOutputDir)

if (!flutterPluginFile.exists()) {

flutterPluginFile.mkdirs()

} else {

flutterPluginFile.deleteDir()

}

def flutterReleaseBuildDir = "${this.buildDir}/app/intermediates/flutter/release/"

println "flutterReleaseBuildDir=$flutterReleaseBuildDir"

//复制snapshot_data和snapshot_instr

project.copy {

from flutterReleaseBuildDir

include "*snapshot_data"

include "*snapshot_instr"

into flutterOutputDir

}

//复制flutter_assets

project.copy {

from "${flutterReleaseBuildDir}flutter_assets/"

into flutterOutputDir

}

}

将application指定为FlutterApplication或者自定义类集成FlutterApplication

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:name="io.flutter.app.FlutterApplication"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

新建Activity继承FlutterActivity

package com.gmail.jackxuechen.fluttermodel;

import android.os.Bundle;

import io.flutter.app.FlutterActivity;

public class FlutterRootActivity extends FlutterActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

GeneratedPluginRegistrant.registerWith(this);

}

}

集成成功

Android动态更新

原理:替换/data/data/包名/app_flutter/flutter_assets/

下的isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr即可实现flutter项目的更新

为了方便可以写个gradle脚本将flutter工程编译的isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr文件放到一个单独文件夹

task copyAndroidFlutterAssets << {

println "project.rootDir = ${project.rootDir}/"

println "buildDir = ${this.buildDir}/"

def flutterOutputDir = "${this.buildDir}/flutter_android_output/flutter_assets/"

def flutterPluginFile = new File(flutterOutputDir)

if (!flutterPluginFile.exists()) {

flutterPluginFile.mkdirs()

} else {

flutterPluginFile.deleteDir()

}

def flutterReleaseBuildDir = "${this.buildDir}/app/intermediates/flutter/release/"

println "flutterReleaseBuildDir=$flutterReleaseBuildDir"

//复制snapshot_data和snapshot_instr

project.copy {

from flutterReleaseBuildDir

include "*snapshot_data"

include "*snapshot_instr"

into flutterOutputDir

}

}

注意事项

vm_snapshot_data、vm_snapshot_instr和flutter sdk版本有关,生成更新文件时应保持和集成到原生项目中的flutter sdk版本一致

因为isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr可能是在FlutterApplication中处理(需要看源码目前还没研究到)的。如果直接替换相关文件而没有冷启动,可能会导致崩溃,不过可以通过升级逻辑实现冷启更新,类型腾讯tinker。

如果flutter项目中添加新的依赖原生的插件,则无法通过替换flutter编译后的文件升级,强制升级会崩溃

android 实现表格横向混动_Flutter混合开发和Android动态更新实践相关推荐

  1. android 实现表格横向混动_「PHEVREEV」插电混动与增程系统技术特点解析:节油原理与性能...

    内容概述:两类引擎转化效率,PHEV运行模式,REEV技术定位. 自主品牌以比亚迪为代表,合资与进口汽车以宝马.吉普.沃尔沃与保时捷等品牌为代表,这些车企都在转型PHEV插电式混动汽车:甚至有些车企公 ...

  2. android 实现表格横向混动_Android图文混排实现方式详解

    在使用TextView的时候,我们经常需要在TextView中进行图文混排,比如在QQ中聊天的消息中的表情,底部tab图标等. 一.场景 二.实现方式 Android官方对TextView的图文混排提 ...

  3. 混合开发架构|Android工程集成React Native、Flutter、ReactJs

    混合开发架构|Android工程集成React Native.Flutter.ReactJs 架构设计说明 创建安卓原生工程 创建Flutter 集成嵌入原生工程 创建React Native 解决R ...

  4. Android混合开发-(Android与Web的交互)

    在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaSc ...

  5. flutter 应用场景_Flutter混合开发的路由栈管理

    为了把 Flutter 引入到原生工程,我们需要把 Flutter 工程改造为原生工程的一个组件依赖,并以组件化的方式管理不同平台的 Flutter 构建产物,即 Android 平台使用 aar.i ...

  6. 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )

    文章目录 前言 一.创建 Android 项目 二.关联 Android 工程与 Flutter Module 工程 1.配置 Flutter Module工程 2.配置 build.gradle 3 ...

  7. Flutter混合开发:Android中如何启动Flutter

    目录 现有项目中引入Flutter 启动flutter页面 加速启动 启动传参 flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡.这样就会共存native和flut ...

  8. android webview定位权限,混合开发安Android webview使用内置浏览器定位的权限

    具体步骤: 一.添加权限: 二.设置webview.setting WebSettings settings = webView.getSettings(); settings.setGeolocat ...

  9. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

最新文章

  1. 在java中建个jsp文件_第一个jsp页面
  2. python里面ca_Python SSL服务器提供中间CA证书
  3. CodeForces 321A Ciel and Robot(数学模拟)
  4. 一线城市数据分析师的薪资分布......
  5. C语言中变量的储存类别
  6. hp服务器安装win7普通系统安装,hp台式电脑安装系统一键安装win7系统
  7. mac下下载安装mat
  8. 不那么SQL的SQL代码(一)if not exists(...) insert
  9. sql取上个月年月_sql 查询本年、本月、本日记录的语句,附SQL日期函数
  10. 自古逢秋悲寂寥,奈何今秋热成雕?Python使用Pyecharts统计全国温度Top10并绘图
  11. unity中显示fps
  12. React Native基础知识
  13. java liveness_并发 - 活跃度(Liveness) - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...
  14. linux 安装 blas,Linux下Linpack安装过程
  15. # Codeforces Round #722(div2)D. Kavi on Pairing Duty
  16. 植物大战僵尸二:游戏界面的绘制
  17. matlab音乐信号处理,数字信号处理课程设计---基于 MATLAB 的音乐信号处理和分析...
  18. phinx武林秘籍(上)
  19. Python爬虫企查查
  20. 程序员必备5个编程自学网站,你都用到过吗?

热门文章

  1. python 使用 redis expire属性设置访问时间间隔
  2. linux kill信号列表
  3. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应
  4. Lucene源代码学习之 PackedInts
  5. Object-C 入门介绍
  6. 接班 RT 系统?Windows 10 云服务版首次亮相
  7. 使用GridView自带分页的代码
  8. Spring mvc-kaptcha 验证码
  9. LYNC2013部署系列PART2:后端部署
  10. Application,Session,Cookie,ViewState和Cache区别