在用 React Native 打包 Android 的时候发现每次改 APP 版本号都需要去 android/app/build.gradle 里面去改版本号,并且项目下面的 app.json 中的 Version 都没啥用感觉,想要这个版本号和 build.gradle 保持一致只能分别改两个文件?于是我很久之前就想优化这个小玩意了,我们知道 gradle 是一个脚本,于是就可以让它在运行的时候去读取这个 app.json 获取到其中的 Version 和 Build 值然后用到 versionNam 和 versionCode 上不就好了吗?

首先我需要先了解怎么将 json 文件读入 build.gradle 并使用 build.gradle 文件中的字符串值

我就拿 app.json 来说

{
    "name": "test",
    "AppID": "com.test",
    "DisplayName": "test",
    "AppSlogan": "这是好傻好天真的 App Demo",
    "Version": "1.3.2",
    "Build": 5,
    "AppVersionNumber": 2.3,
}

怎么在 build.gradle 中读取到这个 app.json 呢?

def appConfigJsonFile = file('../../app.json')
// 导入 app.json 文件

def appConfigJson = new groovy.json.JsonSlurper().parseText(appConfigJsonFile.text)
// 使用 groovy.json.JsonSlurper 将导入进来的文本内容转化为 json 对象

没错就是这么简单,然后直接用就好了

defaultConfig {
    def appConfigJsonFile = file('../../app.json')
    def appConfigJson = new groovy.json.JsonSlurper().parseText(appConfigJsonFile.text)

    applicationId appConfigJson.AppID
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode appConfigJson.Build
    versionName appConfigJson.Version
}

修改之后代码对比图

React Native 打包 Android 优化思路之将 json 文件读入 build.gradle 并使用 build.gradle 文件中的字符串值-天真的小窝

这样做有什么好处呢?对于自动化打包就写一个脚本每次打包就自动到 app.json 增加一个版本然后再打包,甚至可以在 AndroidManifest 或者 java 等地方去读取这个 build.gradle 中的配置从而达到将全部关键的 configure 全部集成到 app.json ,当然集成之后还有更多玩法我就不一一点出了…