如何使用String类型生成buildConfigField

Abd*_*lah 125 android android-gradle-plugin

在我的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'
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

/path/to/generated/BuildConfig.java
    Error:(14, 47) error: ';' expected
    Error:(15, 47) error: ';' expected
Run Code Online (Sandbox Code Playgroud)

生成的BuildCofig.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;
}
Run Code Online (Sandbox Code Playgroud)

我认为BuildConfig.java并且APP_VERSION没有正确生成为String类型,因为它们没有引号.

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

Vla*_*nko 221

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

buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
Run Code Online (Sandbox Code Playgroud)

引号中的字段名称,另外还有转义引号中的字段值.

  • @WillVanderhoef,是的,这就是你忘记提到的 - 你在定义中使用引号.所以你的解决方案有1个额外的行,并且也使用引号,这就是为什么它不如我的好. (2认同)

mad*_*ead 85

为什么每个人都想逃避双引号?看起来很难看!这是Groovy,伙计们,你可以混合使用单引号和双引号:

buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
Run Code Online (Sandbox Code Playgroud)

  • 这仍然不是要走的路,我们不应该逃避或使用嵌套引号,因为它是String (4认同)
  • @Fabio使用嵌套引号允许使用可以计算的表达式.请参阅[此答案](http://stackoverflow.com/a/38290751/4034572). (3认同)

小智 27

如果通过"解决问题"你的意思是不必双引号文字,我没有遇到任何东西,因为它似乎按设计工作.

我一直在尝试将文字转换为" 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'
}
}
Run Code Online (Sandbox Code Playgroud)

gradle.properties

version=0.1.1
...
debug.server.url=http://dev.myserver.com
...
release.server.url=http://myserver.com
...
Run Code Online (Sandbox Code Playgroud)

进一步思考:


def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_DEBUG = { k -> CONFIG('debug',k) }
def CONFIG_RELEASE = { k -> CONFIG('release',k) }
Run Code Online (Sandbox Code Playgroud)
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" }
def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" }
...
Run Code Online (Sandbox Code Playgroud)


Sim*_*mas 9

转义你的字符串引号:

buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
Run Code Online (Sandbox Code Playgroud)


gei*_*ger 9

我也很困惑.但有一种感觉 - "String"定义字段的类型,而字段值不会自动引用,以便允许我们在这里使用表达式:

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

否则,就不可能.


Aud*_*udi 5

使用

 buildConfigField "String", "FILE_NAME", "\"{$fileName}\"" 
Run Code Online (Sandbox Code Playgroud)

对于变量。从这里参考


ces*_*rds 5

我们应该转义在 Gradle 属性或其他地方定义的 Gradle 常量:

buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
Run Code Online (Sandbox Code Playgroud)

在我们或其他地方CONSTANT_VALUE定义的地方:gradle.properties

CONSTANT_VALUE=string_goes_here
Run Code Online (Sandbox Code Playgroud)

当从我们的环境中获取常量时,它以相同的方式应用:

buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
Run Code Online (Sandbox Code Playgroud)

投票最多的解决方案适用于我们只需要手动添加字符串的情况,该解决方案更进一步。