写点什么

Android 原生项目集成 Flutter,零基础 android

用户头像
Android架构
关注
发布于: 31 分钟前


Root project




allprojects: [root project 'MiniApp', project ':app', project ':thirdlib']


android.agp.version.check.performed: true


android.enableJetifier: true


android.enableR8: true


android.enableR8.libraries: true


android.useAndroidX: true


buildDir: /Users/username/Documents/mygithub/MinApp/build


buildFile: /Users/username/Documents/mygithub/MinApp/build.gradle


projectDir: /Users/username/Documents/mygithub/MinApp


rootDir: /Users/username/Documents/mygithub/MinApp


rootProject: root project 'MiniApp'


这里当前有一些是我们配置的,比如 useAndroidX,但也有一些是约定的,比如 对于整个 project 来说 buildDir 就是项目根目录的 build 文件夹等。


执行


./gradlew :app:properties


节选部分结果


buildDir: /Users/username/Documents/mygithub/MinApp/app/build


buildFile: /Users/username/Documents/mygithub/MinApp/app/build.gradle


就会得到关于 app 整个 module 现阶段的一些配置信息,当然这些配置信息除了约定的,还有你自己配置的,比如 buildToolsVersion ,签名等相关信息。可以看到 buildDir 和整个 project 的是不一样的。


回到主题, 看看如何把我们刚才创建的 sub_flutter 模块集成到项目中。(严格来说并不是集成 sub_flutter 模块,因为他只是一个 flutter 的模块,而在 Android 主项目只能集成子 Android module,那么具体改怎么做呢,下面就来看看其中的奥秘)


按照官方的操作方法,会要求我们添加以下配置到 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


首先看看 这里的 settingsDir 的值。在 settings.gradle 中直接添加


println "settings.dir=" + settingsDir


println "settings.dir.parent=" + settingsDir.parent


sync 之后就会看到输出


settings.dir=/Users/username/Documents/mygithub/MinApp


settings.dir.parent=/Users/username/Documents/mygithub


所以,上面的配置信息,就是说结合 settings 所在目录的父目录和我们配置的目录结合,找到一个名为 include_flutter.groovy 的文件,然后去执行他。


前面说了,创建子 module 的时候,可以是在项目根目录,也可以是在其他位置,如果是在其他位置,这里的 my_flutter 可以替换为你创建目录的绝对路劲。


这里是在根目录直接创建的,那么以上的配置就可以简化为


setBinding(new Binding([gradle: this]))


evaluate(new File(settingsDir, 'sub_flutter/.android/include_flutter.groovy'))


include ':sub_flutter'

[](

)关于 i


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


nclude_flutter.groovy


上面说了,settings.gradle 的配置,其实就是去执行 include_flutter.groovy 这个文件,可以简单看一下这个文件


def scriptFile = getClass().protectionDomain.codeSource.location.toURI()


def flutterProjectRoot = new File(scriptFile).parentFile.parentFile


gradle.include ":flutter"


gradle.project(":flutter").projectDir = new File(flutterProjectRoot, ".android/Flutter")


def localPropertiesFile = new File(flutterProjectRoot, ".android/local.properties")


def properties = new Properties()


assert localPropertiesFile.exists(), ":exclamation:?The Flutter module doesn't have a $localPropertiesFile file." +


"\nYou must run flutter pub get in $flutterProjectRoot."


localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }


def flutterSdkPath = properties.getProperty("flutter.sdk")


assert flutterSdkPath != null, "flutter.sdk not set in local.properties"


gradle.apply from: "$flutterSdkPath/packages/flutter_tools/gradle/module_plugin_loader.gradle"


.android 其实就是一个 Android 项目,他包含一个 Flutter 文件夹,这 Flutter 是一个 library 类型的 Android module ,这个一点从他的 build.gradle 文件就可以看出。 include_flutter.groovy 所做的事情,就是将当前 library 命名为 flutter 的一个 moudle。然后检查项目中 local.properties 中 sdk 的相关配置,最后去执行 FlutterSDK 的中 gradle 脚本,这里具体的分析就不再展开了。


也就是说,现在有一个名为 flutter 的 Android Library Module 。这个 module 包含 flutter 的所有配置。我们如果依赖了这个 module ,那么就相当于是依赖了 Flutter .

[](

)依赖 flutter

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android 原生项目集成 Flutter,零基础android