【问题标题】:How to generate buildConfigField with String type如何生成字符串类型的 buildConfigField
【发布时间】:2015-08-28 01:52:06
【问题描述】:

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

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

【问题讨论】:

  • 只需在带有双引号的值周围添加单引号:buildConfigField "String", APP_VERSION, ' "0.0.1" '(当然没有空格)
  • stackoverflow.com/a/65624195/3970630 可以在你的 gradle 文件中定义:)

标签: android android-gradle-plugin


【解决方案1】:

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

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

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

【讨论】:

  • 该问题旨在使用“SERVER_URL”作为变量。将 "SERVER_URL" 放在引号中会使值成为字符串文字。因此,@madhead 的答案更正确(也更漂亮)。
  • 我的错。我以 Simas 的答案为基础并复制了它。我的观点不是关于第三个字段(变量名),而是关于使用双引号来转义变量值:如果变量本身没有双引号,您可以简单地单外引号来摆脱反斜杠。我已经编辑了两个答案。
  • @VladMatvienko 绝对有效,我实际上是按照我描述的方式使用它。 def FIELD_NAME = "SERVER_URL"buildConfigField "boolean", FIELD_NAME, "false" 一起工作得很好。如果您缺少 SERVER_URL 的定义,您将崩溃,这可能是您做错了。
  • 使用 buildConfigField "String", "FILE_NAME", "\"{$fileName}\"" 作为变量名。
  • @Audi,谢谢,但这正是我的回答所说的(已经 3 年了)
【解决方案2】:

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

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

【讨论】:

  • 这仍然不是要走的路,我们不应该转义或使用嵌套引号,因为它是字符串
  • @Fabio 使用嵌套引号允许使用可以评估的表达式。见this answer
  • 你有什么理由把String放在双引号里,把SERVER_URL放在单引号里?
  • @AdamJohns,我猜没有。只是为了证明'" 都可以使用。
【解决方案3】:

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

我一直在尝试将文字移入“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 的新手,请帮助!
  • 感谢配置脚本!在团队中,我们稍微改进了它以在 var 不存在时抛出异常:CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
【解决方案4】:

使用

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

用于变量。参考来自here

【讨论】:

    【解决方案5】:

    转义字符串引号:

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

    【讨论】:

      【解决方案6】:

      我也很困惑。但是有一种意义——“字符串”定义了字段的类型,而字段值不会自动被引用,以便我们在这里使用表达式:

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

      否则不可能。

      【讨论】:

      • 如果你使用字符串插值是可能的,例如:buildConfigField "String", "TEST", "\"${10}\"" 这样你就可以在你的构建文件中使用方法或变量作为好吧。
      【解决方案7】:

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

      buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
      

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

      CONSTANT_VALUE=string_goes_here
      

      在从我们的环境中获取常量时应用相同的方式:

      buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
      

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 不鼓励仅使用代码的答案。为了帮助未来的读者,请解释一下你在做什么!
        • 下次参考你之前的答案stackoverflow.com/a/53056170/1084764,而不是复制粘贴
        【解决方案9】:

        我需要 buildConfigField 和 manifestPaceholder 中的变量。 为了解决这个问题,我这样做了

        def appAuthScheme= "appauth.myscheme"
        buildConfigField 'String', 'APP_AUTH_SCHEME',"\"$appAuthScheme\""
        
        manifestPlaceholders = [lowerApplicationId : applicationId.toLowerCase(),
                                appAuthRedirectScheme : appAuthScheme]
        

        BuildConfig.APP_AUTH_SCHEME 是一个字符串!

        【讨论】:

          【解决方案10】:

          只有 \"my stuff\" 对我有用。我在my stuff 里有各种奇怪的字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-10
            • 2021-11-05
            • 1970-01-01
            • 2013-05-09
            • 1970-01-01
            • 1970-01-01
            • 2016-03-18
            • 2019-12-29
            相关资源
            最近更新 更多