android 实现表格横向混动_Flutter混合开发和Android动态更新实践
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动态更新实践相关推荐
- android 实现表格横向混动_「PHEVREEV」插电混动与增程系统技术特点解析:节油原理与性能...
内容概述:两类引擎转化效率,PHEV运行模式,REEV技术定位. 自主品牌以比亚迪为代表,合资与进口汽车以宝马.吉普.沃尔沃与保时捷等品牌为代表,这些车企都在转型PHEV插电式混动汽车:甚至有些车企公 ...
- android 实现表格横向混动_Android图文混排实现方式详解
在使用TextView的时候,我们经常需要在TextView中进行图文混排,比如在QQ中聊天的消息中的表情,底部tab图标等. 一.场景 二.实现方式 Android官方对TextView的图文混排提 ...
- 混合开发架构|Android工程集成React Native、Flutter、ReactJs
混合开发架构|Android工程集成React Native.Flutter.ReactJs 架构设计说明 创建安卓原生工程 创建Flutter 集成嵌入原生工程 创建React Native 解决R ...
- Android混合开发-(Android与Web的交互)
在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaSc ...
- flutter 应用场景_Flutter混合开发的路由栈管理
为了把 Flutter 引入到原生工程,我们需要把 Flutter 工程改造为原生工程的一个组件依赖,并以组件化的方式管理不同平台的 Flutter 构建产物,即 Android 平台使用 aar.i ...
- 【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
文章目录 前言 一.创建 Android 项目 二.关联 Android 工程与 Flutter Module 工程 1.配置 Flutter Module工程 2.配置 build.gradle 3 ...
- Flutter混合开发:Android中如何启动Flutter
目录 现有项目中引入Flutter 启动flutter页面 加速启动 启动传参 flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡.这样就会共存native和flut ...
- android webview定位权限,混合开发安Android webview使用内置浏览器定位的权限
具体步骤: 一.添加权限: 二.设置webview.setting WebSettings settings = webView.getSettings(); settings.setGeolocat ...
- android 加载三方so的方法_Android开发教程之动态加载so库文件的方法
Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...
最新文章
- 在java中建个jsp文件_第一个jsp页面
- python里面ca_Python SSL服务器提供中间CA证书
- CodeForces 321A Ciel and Robot(数学模拟)
- 一线城市数据分析师的薪资分布......
- C语言中变量的储存类别
- hp服务器安装win7普通系统安装,hp台式电脑安装系统一键安装win7系统
- mac下下载安装mat
- 不那么SQL的SQL代码(一)if not exists(...) insert
- sql取上个月年月_sql 查询本年、本月、本日记录的语句,附SQL日期函数
- 自古逢秋悲寂寥,奈何今秋热成雕?Python使用Pyecharts统计全国温度Top10并绘图
- unity中显示fps
- React Native基础知识
- java liveness_并发 - 活跃度(Liveness) - 《Java 编程要点(Essential Java)》 - 书栈网 · BookStack...
- linux 安装 blas,Linux下Linpack安装过程
- # Codeforces Round #722(div2)D. Kavi on Pairing Duty
- 植物大战僵尸二:游戏界面的绘制
- matlab音乐信号处理,数字信号处理课程设计---基于 MATLAB 的音乐信号处理和分析...
- phinx武林秘籍(上)
- Python爬虫企查查
- 程序员必备5个编程自学网站,你都用到过吗?