Gradle使用buildConfigField设置整型变量

25

我想定义一个构建配置文件,在其中可以使用在gradle脚本中定义的变量:

def someVar = 512
android {
...
    buildConfigField 'int', 'SOME_INT_FIELD',  someVar
}

但是这会产生以下错误:

Error:(25, 0) Gradle DSL方法未找到:'buildConfigField()'

可能的原因:

  • 项目 'PROJECT' 可能使用不包含此方法的Gradle版本。
  • 构建文件可能缺少Gradle插件。

  • 我可以使用引号,例如:

    def someVar = 0
    android {
    ...
        buildConfigField 'int', 'SOME_INT_FIELD',  '"' + someVar + '"'
    }
    

    但是这会导致BuildConfig编译错误。

    // Fields from default config.
    public static final int SOME_INT_FILED = "512";
    

    所以现在我仍然坚持:

    def someVar = 0
    android {
    ...
        buildConfigField 'String', 'SOME_INT_FIELD',  '"' + someVar + '"'
    }
    

    并像这样使用:

    final int value = Integer.valueOf(BuildConfig.SOME_INT_FIELD);
    

    有没有更好的解决方案,或者我是不是错误地使用了 buildConfigField?

    (我还尝试过将括号与上述任何可能性结合使用。)

    5个回答

    56

    我找到了一个解决方案,也许这个答案能帮助今后的某个人。

    def String globalVersionCode
    
    defaultConfig {
        applicationId "com.test.gradle.build"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "0.1"
    
        globalVersionCode = versionCode
    }
    
    buildTypes {
        release {
             buildConfigField ("int", "DatabaseVersion", globalVersionCode)
        }
    }
    

    现在我可以在Java中获取DatabaseVersion变量:

    public static final int DB_VERSION = BuildConfig.DatabaseVersion;
    

    3
    谢谢,关键是将变量定义为'String'类型,但在buildConfigField中使用'int'。这样可以避免任何强制转换和解析操作。这正是我想要的。 - salcosand
    不要忘记逗号,大家。 - Karuhanga

    13

    build.gradle 中声明一个 int 字段不需要在 Java 端进行解析。你的代码唯一的错误是使用了双引号。正确的方法如下所示-

    buildConfigField 'int', 'SOME_INT_FIELD', '512'
    

    在您的build.gradle文件中加入上述内容后,您可以将其在Java代码中简单地使用为int类型。

    public static final int SOME_INT_FIELD = BuildConfig.SOME_INT_FIELD;
    

    8

    试试这个:

    int val = 10
    buildConfigField 'int', 'SOME_INT_FIELD', val.toString()
    

    5

    你可能有理由使用相同的Gradle文件并在Java文件中使用它。

    def boolean isMyFlag
    
    compileSdkVersion 30
    defaultConfig {
        applicationId "com.test.gradle.build"
        minSdkVersion 21
        targetSdkVersion 22
        buildConfigField 'int', 'Version_code', "3"
        buildConfigField 'String', 'Version_Name', "'0.1'"
        buildConfigField "boolean", "myFlag", "${isMyFlag}"
    
    }
    

    现在你可以在Java中使用,也可以在Gradle文件中使用。

    // Use for Java
    if(BuildConfig.myFlag){
        // My logic here;
    }
    

    并且

    // Use for gradle
    if (isMyFlag) {
        implementation 'com.my.dependency.classes:my-module:2.3'
    }
    

    我的解决方案适用于Java和build.gradle文件,因为您可能会遇到类似这样的逻辑。


    请注意,您还可以覆盖buildTypesproductFlavors块中的默认值。结合属性文件,这使您能够拥有一致的构建和运行时配置。 - cji

    2
    def someVar = 100
    
    buildConfigField 'int', 'SOME_INT_FIELD',  String.valueOf(someVar)
    

    我使用以上方法来解决问题,希望能对您有所帮助。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接