简介
Android Studio 为其 Android 项目提供了十分方便的 BuildConfig
功能,该功能在运行编译时自动生成 BuildConfig.java
文件,其中储存了编译时的一些系统信息(如APP版本号、渠道、编译时间、编译器等),并可以用于条件编译。
所幸,有人已经仿照出了具有类似功能的 Gradle 插件。本文将说明如何使用这个插件。
使用方法
1. 添加依赖
在 build.gradle
文件中
plugins {
id 'java'
id 'de.fuerstenau.buildconfig' version '1.1.8' //添加 BuildConfig 插件
}
plugins
节应位于 import
和 buildscript
节的后面。
2. 定义项目属性
例如,对于项目 com.kenvix.moecraftbot.ng
group 'com.kenvix'
version '1.0'
def applicationName = 'MoeCraftBotNG'
def versionCode = 1
archivesBaseName = 'moecraftbot.ng'
def mainSrcDir = 'src/main/java' //项目java源代码目录
def fullPackageName = "${group}.$archivesBaseName"
def fullPackagePath = fullPackageName.replaceAll('.', '/')
def isReleaseBuild = System.getProperty("isReleaseBuild") != null //根据环境变量判断是否为正式发行版(判断是否是Release版本的构建)
3. 添加 BuildConfig 信息
/*********************************************************************/
/** Application Build Config Settings **/
/*********************************************************************/
buildConfig {
appName = project.name // sets value of NAME field
version = project.version // sets value of VERSION field,
// 'unspecified' if project.version is not set
clsName = 'BuildConfig' // sets the name of the BuildConfig class
packageName = fullPackageName // sets the package of the BuildConfig class,
// 'de.fuerstenau.buildconfig' if project.group is not set
charset = 'UTF-8' // sets charset of the generated class,
// 'UTF-8' if not set otherwise
buildConfigField 'String', 'APPLICATION_NAME', applicationName
buildConfigField 'String', 'VERSION_NAME', version as String
buildConfigField 'int', 'VERSION_CODE', versionCode as String
buildConfigField 'long', 'BUILD_UNIXTIME', System.currentTimeMillis() + 'L'
buildConfigField 'java.util.Date', 'BUILD_DATE', 'new java.util.Date(' + System.currentTimeMillis() + 'L)'
buildConfigField 'String', 'BUILD_USER', System.getProperty("user.name")
buildConfigField 'String', 'BUILD_JDK', System.getProperty("java.version")
buildConfigField 'String', 'BUILD_OS', System.getProperty("os.name")
buildConfigField 'boolean','IS_RELEASE_BUILD', isReleaseBuild as String
其中,buildConfigField
表示这是自定义字段,后面紧随的是字段类型,要用字符串书写类名。(例如 'String'
)
其后是字段名称 'APPLICATION_NAME'
(同样用字符串),其后是内容,也必须是字符串。如果内容为 int 或 boolean 等类型,则必须强制转换。
内容部分可以书写代码,以字符串形式书写即可。
4. 让 IDE 识别代码
默认 IDE 不会识别 BuildConfig 生成的代码,为此要手动将其加入 sourceSets
// Add generated build-config directories to the main source set, so that the
// IDE doesn't complain when the app references BuildConfig classes
sourceSets.main.java {
srcDirs += new File(mainSrcDir) //项目本身源代码
srcDirs += new File(buildDir, 'gen/buildconfig/src') //BuildConfig
}
5. 生成项目
刚才我有提到“判断是否是Release版本的构建”,可以这样使用它:
例如,在打包 jar 时,可以在 gradle 命令上添加 JVM 参数 -DisReleaseBuild=true
来将 isReleaseBuild
设置为 true
,让项目执行在 BuildConfig.IS_RELEASE_BUILD == true
时的代码,从而达到条件编译的效果。
项目生成后, BuildConfig
效果应该如下图所示:
配置到此结束。
我们还可以在项目启动时打印一下版本信息:
println("${BuildConfig.APPLICATION_NAME} Ver.${BuildConfig.VERSION_NAME} By Kenvix")
println("Built at ${BuildConfig.BUILD_DATE.format()} By ${BuildConfig.BUILD_USER} @ ${BuildConfig.BUILD_OS} JDK ${BuildConfig.BUILD_JDK}")
if (!BuildConfig.IS_RELEASE_BUILD)
println("Debug build")