阅读 1337

Android原生集成Flutter的浅尝

简介

Flutter更新速度还是很快的为了避免带来的一些没必要的问题,这边文章是基于的版本为

感谢Flutter的先行者们对Flutter的项目的促进,以便让我们这些后来者能少跳一些坑。这篇文章之前已经有许多谈论这方面的文章了。最具代表性的就是 闲鱼技术组 的系列文章了。而这篇文章更多的是个人在实际项目中的运用与总结。

Flutter 原码集成

官方源码集成方式 Add Flutter to existing apps

这种方式是我在完成 Flutter 层开发后,为了接入原生最先尝试的方式,毕竟官方永远是最先选择的大大,官方的 Add-to-App可以看到他们在这方面的进度。而且这方式结合 flutter attach调试更为方便

aar产物集成

Flutter项目是通过flutter create -t module my_flutter生成的module工程,此工程可以为我们生成一个 arr 文件,避免自己手动创建module工程带来的不必要的坑(如果你想,也是可以,参照 flutter.gradle将相应的源码和插件打包就行,毕竟 闲鱼技术组 的文章就是这么干的)
看一下目录:

Flutter 中的 build.gradle将会在我们 执行 ./gradlew assembleRelease为我们生成一个aar文件
这里建议打release包。

Flutter 模式


对于Flutter,它支持常见的debug,release,profile等模式,但它又有其不一样。

Debug模式:对应了Dart的JIT模式,又称检查模式或者慢速模式。支持设备,模拟器(iOS/Android),此模式下打开了断言,包括所有的调试信息,服务扩展和Observatory等调试辅助。此模式为快速开发和运行做了优化,但并未对执行速度,包大小和部署做优化。Debug模式下,编译使用JIT技术,支持广受欢迎的亚秒级有状态的hot reload。

Release模式:对应了Dart的AOT模式,此模式目标即为部署到终端用户。只支持真机,不包括模拟器。关闭了所有断言,尽可能多地去掉了调试信息,关闭了所有调试工具。为快速启动,快速执行,包大小做了优化。禁止了所有调试辅助手段,服务扩展。

Profile模式:类似Release模式,只是多了对于Profile模式的服务扩展的支持,支持跟踪,以及最小化使用跟踪信息需要的依赖,例如,observatory可以连接上进程。Profile并不支持模拟器的原因在于,模拟器上的诊断并不代表真实的性能。

在 Android中引用 aar 包

//app:build.gradle
//name:与我们aar文件名一样
// ext: 此文件格式
dependencies {
    ...
    implementation(name: 'flutter-release', ext: 'aar')
    ...
}

复制代码

aar包放到 libs文件夹内

执行 Sync Project with Gadle Files

此目录中将看到引用的包

aar远程依赖

这里我将 库放到 github 上,提供原生开发远程依赖,好处是让Android开发人员只关注自己的业务开发,flutter层相关更新对他们来说是无感变化的。

  1. 在flutter项目中打开 .android/Flutter/build.gradle
dependencies {
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:support-v13:27.1.1'
    implementation 'com.android.support:support-annotations:27.1.1'
}
//添加以下代码
apply plugin: 'maven'
ext {
    // 从Github上clone下来的项目的本地地址
    GITHUB_REPO_PATH = "D:\\f\\github\\test"
    PUBLISH_GROUP_ID = 'com.test'
    PUBLISH_ARTIFACT_ID = 'flutter_library'
    PUBLISH_VERSION = '1.0.0-SNAPSHOT'//SNAPSHOT 为了原生开发时不用管具体版本
}
uploadArchives {
    repositories {
        mavenDeployer {
            //本地maven仓库地址,也可以使用远程maven仓库
            def deployPath = file(project.GITHUB_REPO_PATH)
            repository(url: "file://${deployPath.absolutePath}")
            pom.project {
                groupId project.PUBLISH_GROUP_ID
                artifactId project.PUBLISH_ARTIFACT_ID
                version project.PUBLISH_VERSION
            }
        }
    }
}
复制代码
  1. .android/ 目录下执行
./gradlew uploadArchives
复制代码
  1. 提交"D:\\f\\github\\test"该目录下的内容到github上
  2. Android 项目 project:build.gradle
allprojects{
        repositories {
        ...
        maven{ url 'https://raw.githubusercontent.com/自己github用户名/库名/master'}
        ...
    }
}
复制代码
  1. Android 项目 app:build.gradle
dependencies {
    ...
    implementation 'com.test:flutter_library:1.0.0-SNAPSHOT'
    ... 
}
复制代码
  1. Sync Project with Gadle Files 同步完后应该就能看到 External Libraries中相应的包

梳理

  1. SNAPSHOT版本 gradle 默认缓存 24h,如果想每次 build 前检查版本 在build.gradle中加入
    configurations.all {
        ...
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
        ...
    }
复制代码
  1. 由于自己对原生以及gradle不是很熟悉,在做集成的时候可能有些方式欠妥
  2. 远程依赖aar包的时候,在flutter项目中更改了build.gradle,这也是有弊端的
    官方明确告诉我们不要修改这个文件。。。
    至少每次更新Flutter时,这个文件会被官方重置
    so... 如果有更好的方式,还望告知。。。

参考

  1. 深入理解 Flutter 的编译原理与优化
  2. 闲鱼flutter混合工程持续集成的最佳实践
关注下面的标签,发现更多相似文章
评论