在现有 Android 项目中集成 Flutter 官方给出两种方案。
-
将 Flutter 打包成 AAR 包,然后在现有项目引入。
-
将 Flutter 源码视为 Gradle Module 引入现有项目。
1. 将 Flutter 打包成 AAR 包,然后在现有项目引入
使用 AAR 形式集成 Flutter 可以不用安装 Flutter SDK。可以将 AAR 上传到Maven 或 jcenter 仓库(jcenter 即将停止服务,所以还是使用 maven 吧)。这样应用起来更方便。如果代码更新比较频繁使用 AAR 形式集成则需要经常构建、发布,所以大家根据自己的项目及使用场景自行选择集成方案。
如何生成 AAR 包
生成 AAR 包通常有两种方式。
1. 使用 flutter 命令
假设构建一个 Flutter 模块 some/path/my_flutter,然后运行:
$ cd some/path/my_flutter
$ flutter build aar
至此 flutter 命令会在本地创建一个 maven 仓库,其目录结构如下:
build/host/outputs/repo
└── com
└── example
└── my_flutter
├── flutter_release
│ ├── 1.0
│ │ ├── flutter_release-1.0.aar
│ │ ├── flutter_release-1.0.aar.md5
│ │ ├── flutter_release-1.0.aar.sha1
│ │ ├── flutter_release-1.0.pom
│ │ ├── flutter_release-1.0.pom.md5
│ │ └── flutter_release-1.0.pom.sha1
│ ├── maven-metadata.xml
│ ├── maven-metadata.xml.md5
│ └── maven-metadata.xml.sha1
├── flutter_profile
│ ├── …
└── flutter_debug
└── …
如果要引用本地仓库中的 aar 包则需要在宿主应用的 build.gradle 中做如下配置即可:
android {
// …
}
repositories {
maven {
url ‘some/path/my_flutter/build/host/outputs/repo’
// This is relative to the location of the build.gradle file
// if using a relative path.
}
maven {
url ‘https://storage.googleapis.com/download.flutter.io’
}
}
dependencies {
// …
debugImplementation ‘com.example.flutter_module:flutter_debug:1.0’
profileImplementation ‘com.example.flutter_module:flutter_profile:1.0’
releaseImplementation ‘com.example.flutter_module:flutter_release:1.0’
}
2. 使用 Android Studio
第二种生成 AAR 包的方式就是使用 Android Studio,这用方式比较简单,依次选择 AS > Build > Flutter > Build AAR
然后等着就行了。剩下的步骤和使用 flutter 命令一样。
2. 将 Flutter 源码视为 Gradle Module 引入现有项目。
这种方式是推荐的方式,因为在团队协作过程中这种方式更方便,相对于 AAR 方式可以省掉每次单独构建 AAR 包的步骤。可以一键构建 Android、Flutter 代码。
使用此种集成方式可以按照如下步骤进行。
1. 组织目录结构
因为绝大多数的现有 Android、iOS 项目都是作为独立项目使用 svn 或 git 进行版本管理的(这里以 git 为例)。在不改变原有项目管理方式的前提下集成 Flutter 需要将 Flutter 的代码作为独立的工程使用 git 进行管理,并在 Android 项目中以 module 的形式进行依赖。其目录结构如下。
workspace
├── android_project
└── flutter_module
android_project
是我们现有的 Android 工程代码目录。flutter_module
是我们新增的 fluuter 模块代码目录,将两个工程放到同一目录下。为了统一配置,建议必须按照这个目录结构进行管理两个工程的代码。
注意:flutter_module是 module,不是 project 类型,在 Android Studio 中一定要选择 File > New > New Module > Flutter Module,不要选择File > New > New Flutter Project
创建 flutter module 也可以使用如下命令:
$ flutter create -t module name_of_module
2. 配置 settings.gradle
在 Android 工程的 settings.gradle做如下修改
// Include the host app project.
include ‘:app’ // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
‘my_flutter/.android/include_flutter.groovy’ // new
)) // new
3. 依赖 flutter 模块
在 Android 模块的 build.gradle中加入如下依赖。
dependencies {
implementation project(‘:flutter’)
}
然后单击Sync Now
同步 Gradle 即可。
完成这一步就可以在 Android 原生代码中使用 flutter 模块了。
4. 配置 AndroidManifest.xml
启动 flutter 模块需要使用FlutterActivity
,所以需要在 AndroidManifest.xml 中注册一下。
<activity
android:name=“io.flutter.embedding.android.FlutterActivity”
android:theme=“@style/LaunchTheme”
android:configChanges=“orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode”
android:hardwareAccelerated=“true”
android:windowSoftInputMode=“adjustResize”/>
5. 启动 Flutter 模块
在任意地方执行如下代码即可启动 Flutter 模块。
startActivity(FlutterActivity
.withNewEngine()
.initialRoute(“splashRoute”) // 启动指定 Flutter page,没有可以省略
.build(requireContext()))
=======================================================================
因为 Flutter 目前仅支持x86_64、armeabi-v7a和arm64-v8a架构. 所以为了避免运行时崩溃建议在 build.gradle中做如下配置。
android {
//…
defaultConfig {
ndk {
// Filter for architectures supported by Flutter.
abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86_64’
}
}
}
因为Flutter Android 引擎需要使用 Java 8。所以需要在宿主 Android 工程的 build.gradle中做如下配置。
android {
//…
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
3. storage.googleapis.com 国内访问不了?
-
“学会科学上网”
Android Studio 默认创建的模块名称是app
。在 settings.gradle中有如下配置。
include ‘:app’
只有在这里 include 的模块才能通过 gradle 进行构建。
模块的名字是可以修改的,如果你改过 app 模块的名字,则在集成 flutter 时会报错。
java.lang.AssertionError: Project :app doesn't exist. To custom the host app project name, set org.gradle.project.flutter.hostAppProjectName=<project-name> in gradle.properties.. Expression: (appProject != null). Values: appProject = null
因为 flutter 默认会认为名为“app”的模块依赖自己,如果你修改过名字则会报错,此时只需要根据报错信息提示在宿主工程的gradle.properties
中加入如下配置即可。
flutter.hostAppProjectName = your_module_name
将your_module_name
修改成你真是的模块名称即可。
5. flutter module 不支持自定义 buildType?
如果 app module 的 buildType 中除了release
、debug
之外有自定义的 variant那么在打包的时候可能会报错,因为在 flutter module 并没有你定义的 variant 类型,但是release
、debug
这两种 variant 是所有 module 都包含的。所以可以在 app module 的 buildType 中的自定义 buildType 中增加如下配置。
matchingFallbacks = [‘debug’, ‘release’]
例如:
buildTypes {
release {…}
debug {…}
beta {
…
matchingFallbacks = [‘debug’, ‘release’]
}
}
=======================================================================
作为一个多年经验的移动开发者,我深以为,想学好 Flutter,我们不应该仅停留细节层面,更要深入它的原理、设计思路和通用理念。
下面的是一张大佬分享出来的 Flutter 核心知识图谱,里面涵盖了开发、调试、测试、发布、线上运维及工程管理。相信大家如果可以掌握其中80%的知识点,就可以搞懂 Flutter 了。
作为辅助,为了让大家快速无痛上手 Flutter,在这里免费分享给大家一份来自阿里大佬Git高星的 Flutter 学习笔记。
-
为什么Flutter是跨平台开发的终极之选
-
在Windows上搭建Flutter开发环境
-
编写您的第一个 Flutter App
-
Flutter开发环境搭建和调试
-
Dart语法篇之基础语法(一)
-
Dart语法篇之集合的使用与源码解析(二)
-
Dart语法篇之集合操作符函数与源码分析(三)
-
Dart语法篇之函数的使用(四)
-
Dart语法篇之面向对象基础(五)
-
Dart语法篇之面向对象继承和Mixins(六)
-
Dart语法篇之类型系统与泛型(七)
-
Flutter中的widget
注:鉴于目前网上没有比较规范、系统的整理,该学习手册中的内容都是根据笔者的一个框架在网上进行的搜集整理。本文开源,仅用于技术交流分享,感谢大佬熊猫先生对Dart语法
部分的博客分享,感谢一同整理资料的小伙伴。大家可以动动小手,点波关注,了解更多flutter内容!
有需要的朋友给个免费的【一键三连】,然后点击【此处】进入群共享资源自取,或者直接通过下方代码块找我领取。
// Wechat number(可复制):
study5233
为什么Flutter是跨平台开发的终极之选
-
这是为什么?
-
跨平台开发
-
什么是 Flutter
-
Flutter 的特性
-
Flutter 构建应用的工具
-
使用 Flutter 构建的热门应用
-
构建 Flutter 应用的成本
-
……
在Windows上搭建Flutter开发环境
-
使用镜像
-
系统要求
-
获取Flutter SDK
-
编辑器设置
-
Android设置
-
起步: 配置编辑器
-
起步: 体验
-
体验热重载
-
创建新的应用
-
运行应用程序
-
……
第三章 编写您的第一个 Flutter App
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档
喜欢的朋友可以关注、转发、点赞 感谢!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
9K3OHH0-1712882805642)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-0dg4cYBL-1712882805643)]
最后
考虑到文章的篇幅问题,我把这些问题和答案以及我多年面试所遇到的问题和一些面试资料做成了PDF文档
[外链图片转存中…(img-rDMkVGVD-1712882805643)]
[外链图片转存中…(img-AkmqxmLM-1712882805644)]
喜欢的朋友可以关注、转发、点赞 感谢!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ki53vmjN-1712882805644)]