如何生成String类型的buildConfigField
How to generate buildConfigField with String type
在我的 Android Studio
项目中有两个 build configuration
和一些 buildConfigField
:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
debug {
buildConfigField "String", SERVER_URL, "http://dev.myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
}
release {
buildConfigField "String", SERVER_URL, "https://myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我得到如下错误:
/path/to/generated/BuildConfig.java
Error:(14, 47) error: ';' expected
Error:(15, 47) error: ';' expected
生成的BuildConfig.java
如下:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.mycuteoffice.mcoapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final String APP_VERSION = 0.0.1;
public static final String SERVER_URL = http://dev.mycuteoffice.com;
}
我认为 APP_VERSION
和 SERVER_URL
没有正确生成,因为它们是字符串类型,它们没有引号。
我不确定为什么会以这种方式生成它。请让我知道如何解决这个问题。
字符串类型构建配置字段应该这样声明:
buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
引号中的字段名称,转义引号中的字段值。
转义您的字符串引号:
buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
为什么每个人都如此热衷于转义双引号?长得丑!这里是 Groovy,伙计们,你们可以混合使用单引号和双引号:
buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
我也很困惑。但有一种意义 - "String" 定义了字段的类型,而字段值不会自动被引用以便我们可以在此处使用表达式:
buildConfigField "String", "TEST", "new Integer(10).toString()"
否则就不可能了
如果 "resolving the issues" 你的意思是不必双引号文字,我没有遇到任何东西,因为它似乎按设计工作。
我一直在尝试将文字移动到“gradle.properties”作为解决方法,将可能多条难看的行变成一条难看的行。
像这样:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
def CONFIG = { k -> "\"${project.properties.get(k)}\"" }
debug {
buildConfigField "String", SERVER_URL, CONFIG("debug.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
}
release {
buildConfigField "String", SERVER_URL, CONFIG("release.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
gradle.properties
version=0.1.1
...
debug.server.url=http://dev.myserver.com
...
release.server.url=http://myserver.com
...
进一步思考:
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_DEBUG = { k -> CONFIG('debug',k) }
def CONFIG_RELEASE = { k -> CONFIG('release',k) }
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" }
...
使用
buildConfigField "String", "FILE_NAME", "\"{$fileName}\""
对于变量。参考资料来自 here
只有“my stuff
”对我有用。我在 my stuff
.
中有各种奇怪的字符
在应用程序中 build.gradle
def buildTimeAndVersion = releaseTime() + "-" + getSvnVersion()
buildTypes {
debug {
signingConfig signingConfigs.config
buildConfigField "String", 'BIULD_TIME', "\"${buildTimeAndVersion}\""
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getDefault())
}
def getSvnVersion() {
def pro = ("svnversion -c " + getBuildDir().parent).execute()
pro.waitFor()
def version = pro.in.text
Pattern p = Pattern.compile("(\d+\:)?(\d+)\D?")
Matcher m = p.matcher(version)
if (m.find()) {
version = m.group(m.groupCount())
}
try {
return version
} catch (e) {
println e.getMessage()
}
return 0
}
然后在 BuildConfig
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 53;
public static final String VERSION_NAME = "5.4.4";
// Fields from build type: debug
public static final String BIULD_TIME = "20181030-2595";
}
我们应该转义我们在 Gradle 属性或其他地方定义的 Gradle 常量:
buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
其中 CONSTANT_VALUE
在我们的 gradle.properties
或其他地方定义:
CONSTANT_VALUE=string_goes_here
从我们的环境中获取常量时,它的应用方式相同:
buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
投票最多的解决方案适用于我们只需要手动添加字符串的情况,此解决方案更进一步。
我需要 buildConfigField 和 manifestPaceholder 中的变量。
为了解决这个问题,我
def appAuthScheme= "appauth.myscheme"
buildConfigField 'String', 'APP_AUTH_SCHEME',"\"$appAuthScheme\""
manifestPlaceholders = [lowerApplicationId : applicationId.toLowerCase(),
appAuthRedirectScheme : appAuthScheme]
BuildConfig.APP_AUTH_SCHEME 是一个字符串 !
在我的 Android Studio
项目中有两个 build configuration
和一些 buildConfigField
:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
debug {
buildConfigField "String", SERVER_URL, "http://dev.myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
}
release {
buildConfigField "String", SERVER_URL, "https://myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我得到如下错误:
/path/to/generated/BuildConfig.java
Error:(14, 47) error: ';' expected
Error:(15, 47) error: ';' expected
生成的BuildConfig.java
如下:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.mycuteoffice.mcoapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final String APP_VERSION = 0.0.1;
public static final String SERVER_URL = http://dev.mycuteoffice.com;
}
我认为 APP_VERSION
和 SERVER_URL
没有正确生成,因为它们是字符串类型,它们没有引号。
我不确定为什么会以这种方式生成它。请让我知道如何解决这个问题。
字符串类型构建配置字段应该这样声明:
buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
引号中的字段名称,转义引号中的字段值。
转义您的字符串引号:
buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
为什么每个人都如此热衷于转义双引号?长得丑!这里是 Groovy,伙计们,你们可以混合使用单引号和双引号:
buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
我也很困惑。但有一种意义 - "String" 定义了字段的类型,而字段值不会自动被引用以便我们可以在此处使用表达式:
buildConfigField "String", "TEST", "new Integer(10).toString()"
否则就不可能了
如果 "resolving the issues" 你的意思是不必双引号文字,我没有遇到任何东西,因为它似乎按设计工作。
我一直在尝试将文字移动到“gradle.properties”作为解决方法,将可能多条难看的行变成一条难看的行。
像这样:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
def CONFIG = { k -> "\"${project.properties.get(k)}\"" }
debug {
buildConfigField "String", SERVER_URL, CONFIG("debug.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
}
release {
buildConfigField "String", SERVER_URL, CONFIG("release.server.url")
buildConfigField "String", APP_VERSION, CONFIG("version")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
gradle.properties
version=0.1.1
...
debug.server.url=http://dev.myserver.com
...
release.server.url=http://myserver.com
...
进一步思考:
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_DEBUG = { k -> CONFIG('debug',k) }
def CONFIG_RELEASE = { k -> CONFIG('release',k) }
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" }
...
使用
buildConfigField "String", "FILE_NAME", "\"{$fileName}\""
对于变量。参考资料来自 here
只有“my stuff
”对我有用。我在 my stuff
.
在应用程序中 build.gradle
def buildTimeAndVersion = releaseTime() + "-" + getSvnVersion()
buildTypes {
debug {
signingConfig signingConfigs.config
buildConfigField "String", 'BIULD_TIME', "\"${buildTimeAndVersion}\""
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getDefault())
}
def getSvnVersion() {
def pro = ("svnversion -c " + getBuildDir().parent).execute()
pro.waitFor()
def version = pro.in.text
Pattern p = Pattern.compile("(\d+\:)?(\d+)\D?")
Matcher m = p.matcher(version)
if (m.find()) {
version = m.group(m.groupCount())
}
try {
return version
} catch (e) {
println e.getMessage()
}
return 0
}
然后在 BuildConfig
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 53;
public static final String VERSION_NAME = "5.4.4";
// Fields from build type: debug
public static final String BIULD_TIME = "20181030-2595";
}
我们应该转义我们在 Gradle 属性或其他地方定义的 Gradle 常量:
buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
其中 CONSTANT_VALUE
在我们的 gradle.properties
或其他地方定义:
CONSTANT_VALUE=string_goes_here
从我们的环境中获取常量时,它的应用方式相同:
buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
投票最多的解决方案适用于我们只需要手动添加字符串的情况,此解决方案更进一步。
我需要 buildConfigField 和 manifestPaceholder 中的变量。 为了解决这个问题,我
def appAuthScheme= "appauth.myscheme"
buildConfigField 'String', 'APP_AUTH_SCHEME',"\"$appAuthScheme\""
manifestPlaceholders = [lowerApplicationId : applicationId.toLowerCase(),
appAuthRedirectScheme : appAuthScheme]
BuildConfig.APP_AUTH_SCHEME 是一个字符串 !