使用整数变量gradle buildConfigField

sal*_*and 11 variables android buildconfig gradle android-buildconfig

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

def someVar = 512
android {
...
    buildConfigField 'int', 'SOME_INT_FIELD',  someVar
}
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

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

可能的原因:

  • 项目"PROJECT"可能正在使用不包含该方法的Gradle版本.
  • 构建文件可能缺少Gradle插件.

  • 我可以使用以下引用:

    def someVar = 0
    android {
    ...
        buildConfigField 'int', 'SOME_INT_FIELD',  '"' + someVar + '"'
    }
    
    Run Code Online (Sandbox Code Playgroud)

    但这导致BuildConfig中的编译器错误

    // Fields from default config.
    public static final int SOME_INT_FILED = "512";
    
    Run Code Online (Sandbox Code Playgroud)

    所以现在我留下来:

    def someVar = 0
    android {
    ...
        buildConfigField 'String', 'SOME_INT_FIELD',  '"' + someVar + '"'
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并使用它像:

    final int value = Integer.valueOf(BuildConfig.SOME_INT_FIELD);
    
    Run Code Online (Sandbox Code Playgroud)

    有没有人有更好的解决方案或我使用buildConfigField错误?

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

    Bey*_*yka 35

    我找到了解决方案,所以也许这个答案将来会对某人有所帮助.

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

    现在在java中我可以得到DatabaseVersion变量:

    public static final int DB_VERSION = BuildConfig.DatabaseVersion;
    
    Run Code Online (Sandbox Code Playgroud)

    • 谢谢,关键是将变量定义为'String'的类型,但对buildConfigField使用'int'.这使得任何转换和解析都变得不必要了.这就是我想要的. (3认同)

    小智 9

    声明一个int字段build.gradle不应该也不需要在 java 端解析。代码中唯一的错误是使用双引号。下面给出了正确的方法-

    buildConfigField 'int', 'SOME_INT_FIELD', '512'
    
    Run Code Online (Sandbox Code Playgroud)

    在您的build.gradle文件中使用上述内容,您可以将其简单地用作intJava 代码 -

    public static final int SOME_INT_FIELD = BuildConfig.SOME_INT_FIELD;
    
    Run Code Online (Sandbox Code Playgroud)


    Ash*_*win 5

    尝试这个:

    int val = 10
    buildConfigField 'int', 'SOME_INT_FIELD', val.toString()
    
    Run Code Online (Sandbox Code Playgroud)


    And*_*Boy 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}"
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在您也可以在 java 中使用以及在 gradle 文件中使用。

    // Use for Java
    if(BuildConfig.myFlag){
        // My logic here;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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