使用Flutter开发Android项目的同学相信都有这个体会: 打包的apk并没有使用Flutter中设置的版本,每次都要单独gradle中维护Android的版本名和版本号。
先看下我们创建项目后,系统是如何设置版本的:
Flutter
Flutter项目的版本是在yaml文件中设置的
version: 1.0.0+1
这种带**+**形式命名的版本在Flutter中很常见,在我们引入依赖库都是这样的,但Android工程中却很少见,但作为应用开发这个version实际上没有用到。
Android
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
android {
defaultConfig {
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
}
从上面gradle中可以看出在Android项目中是通过获取在local.properties中定义flutterVersionCode和flutterVersionName来分别对应versionCode和versionName的。显然我们每次更改版本都需要在local.properties中进行更改。
我们希望的在yaml中配置版本名和版本号,打包时gradle直接使用yaml中的配置。
解决方法
需要在gradle中读取yaml,并解析。
- 在gradle中引入yaml的解析库
由于只是在打包脚本中使用解析库,项目代码中并没有使用,因此需要将依赖库放在buildscript中。
在工程的build.gradle中添加
buildscript {
...
dependencies {
...
classpath 'org.yaml:snakeyaml:1.17'
}
}
- 加载并解析yaml文件
在项目中的gradle中做解析工作
import org.yaml.snakeyaml.Yaml
BufferedReader br = new BufferedReader(new FileReader("${rootDir.parent}/pubspec.yaml"))
Yaml yaml = new Yaml()
var yamlConfig = yaml.load(br)
def flutterVersionName = yamlConfig['version']
android {
defaultConfig {
versionName flutterVersionName
}
}
这样apk中的versionName就和yaml中的version一致了。