如何使用String类型生成buildConfigField


145

在我的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_VERSIONSERVER_URL没有得到正确的生成,因为它们是String类型,没有引号。

我不确定为什么会以这种方式生成它。请让我知道如何解决此问题。


只需在值前后加上双引号即可:(buildConfigField "String", APP_VERSION, ' "0.0.1" '当然不能有空格)
Pierre

Answers:


254

字符串类型的构建配置字段应这样声明:

buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""

引号中的字段名称,转义引号中的字段值另外。


1
该课题打算使用“ SERVER_URL”作为变量。将“ SERVER_URL”放在引号中会使该值成为String文字。因此,@ madhead的答案更正确(更漂亮)。
Will Vanderhoef

1
@WillVanderhoef,你完全错了。如果不加SERVER_URL引号,它根本行不通。如果您在发表评论之前亲自尝试过,就会知道。错误消息是Error:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Vladyslav Matviienko '16

我的错。我以Simas的答案为基础,并复制了它。我的意思不是关于第三字段(变量名),而是关于使用双引号来转义变量值:如果变量本身没有双引号,则可以简单地使用单引号来消除反斜杠。我已经编辑了两个答案。
madhead '16

@VladMatvienko绝对有效,我实际上按照我的描述使用它。 def FIELD_NAME = "SERVER_URL"并且buildConfigField "boolean", FIELD_NAME, "false"工作得很好在一起。如果缺少SERVER_URL的定义,则会崩溃,这可能是您做错了。
Will Vanderhoef

2
@WillVanderhoef,是的,那是您忘记提及的内容-您在定义时使用引号。因此,您的解决方案有1条额外的行,并且也使用引号,这就是为什么它不如我的好。
弗拉迪斯拉夫·马特维琴科

95

为什么每个人都对转义双引号感到如此生气?看起来很丑!伙计们,这是Groovy,您可以将单引号和双引号混合使用:

buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'

5
那仍然不是要走的路,我们不必逃避或使用嵌套引号,因为它是字符串
Fabio

4
@Fabio使用嵌套引号允许使用可以求值的表达式。看到这个答案
艾伯特·维拉·卡尔沃

31

如果通过“解决问题”来表示不必用双引号引起来,那么我似乎没有遇到任何问题,因为它似乎可以按设计工作。

我一直在尝试将文字移至“ 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)}" }
...

我有一个构建配置字段,我想在同一gradle中访问myn def中的该变量..我是gradle plz helpp的新手!
Adeel Turk

感谢CONFIG脚本!在团队中,我们对它进行了一些改进,如果var不存在,则抛出异常: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee '18

9

我也很困惑。但是有一种意义-“字符串”定义字段的类型,而字段值不会自动加引号,以便允许我们在此处使用表达式:

buildConfigField "String", "TEST", "new Integer(10).toString()"

否则,将不可能。


如果使用字符串插值,则是可能的,例如:buildConfigField“ String”,“ TEST”,“ \” $ {10} \“”这样,您也可以在构建文件中使用方法或变量。
Szörényi亚当

9

转义您的字符串引号:

buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""

5

 buildConfigField "String", "FILE_NAME", "\"{$fileName}\"" 

对于变量。从这里参考


2

在应用程序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";  
}

1
不鼓励仅使用代码的答案。为了帮助将来的读者,请解释一下您在做什么!
itsmysterybox '18 -10-31

下次参考您以前的答案stackoverflow.com/a/53056170/1084764,而不仅仅是复制粘贴
Raykud

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.