配置Android工程同时支持Flutter源码集成和AAR集成

293 阅读2分钟

背景

项目很早就集成了Flutter,一开始用来写一些非核心的界面,采用的是打包成aar然后集成的方式,当时是为了考虑到一些没有在本地安装Flutter的开发也可以运行项目。后面随着Flutter应用范围的扩大,越来越多的界面开始使用,并且很多的核心界面也都是用Flutter来实现,安装Flutter已经成为开发项目必需的配置,所有就开始考虑改用直接集成Flutter工程源码的形式。

实现

因为已经使用aar集成模式了比较长的时间,不想直接替换成新方案,所有就考虑两种集成方式并存,通过配置的方式来切换,实现平滑的过度。先前aar的集成方式也比较简单,打包Flutter工程成aar之后,通过Maven本地仓库的形式引入进来即可,这个官方文档上讲的很清晰。

首先因为我们要兼容两种集成模式,所以需要在配置中增加一个属性来标识当前使用哪些模式,这里我选了两个配置文件,gradle.properties和local.properties。gradle.properties文件会被上传到git仓库里,可以用来在开发之间同步配置,缺点也同样,有人提交了新的配置,其他人更新代码就会强制切换到新的配置上,不利于差异化的配置,可以用来设定默认的初始化值。local.properties文件是本地构建项目时自动生成的,不会被上传到git仓库中,是个纯本地的配置,不会影响其开发,缺点就是初始化工程时候,这个文件里不会有我们自定义的配置项,需要手动设置。

我在两个properties中加了flutter集成模式的配置项,然后优先使用local.properties中的配置。存放这个方法判断,增加了一个flutter.gradle文件,会有多个地方使用到。

// flutter.gradle

ext.useFlutterSourceCode = {
    // 优先获取在local.properties中的配置
    Properties properties = new Properties()
    properties.load(new File('local.properties').newDataInputStream())
    if (properties.getProperty('flutter.useSourceCode') != null) {
        return properties.getProperty('flutter.useSourceCode', 'false').toBoolean()
    }

    return providers.gradleProperty('flutter.useSourceCode').getOrElse('false').toBoolean()
}

接下去在settings.gralde文件中增加flutter源码工程的相关配置。

// settings.gradle

apply from: 'stitches.gradle'

if (useFlutterSourceCode()) {
    setBinding(new Binding([gradle: this]))
    evaluate(new File(
            settingsDir,
            'lib_flutter/.android/include_flutter.groovy'
    ))
}

然后还需要修改工程引入flutter的地方。

// app/build.gradle

apply from: 'stitches.gradle'

dependencies {
    if (useFlutterSourceCode()) {
        api project(":flutter")
    } else {
        debugApi 'com.example:flutter_debug:1.0'
        releaseApi 'com.example:flutter_release:1.0'
    }
}

最后在gradle.properties和local.properties中加入配置,gradle.properties先默认设置为false,其他开发可以继续使用aar的集成方式,未来普及了,再改成true。local.properties设置为true,本地使用源码集成flutter工程。

# gradle.properties

flutter.useSourceCode=false
# local.properties

flutter.useSourceCode=false

参考资料