BuildConfig.DEBUG(或等效)作为常量值

时间:2016-11-21 13:15:58

标签: java android gradle annotations android-gradle

假设我有自定义注释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Test {
    boolean type();
}

我希望type参数根据构建类型而不同(但会自动更改)。

所以我可以做喜欢

@Test(type = BuildConfig.DEBUG)
public class Example {
} 

但是Example类的代码当然不能编译,因为BuildConfig.DEBUG的值不是常数。

任何人都有为此创建解决方法的想法吗?也许在gradle中指定一些其他参数?我对一个能让我手动更改特定版本的type的解决方案不感兴趣。这种方式或其他方式。我正在寻找一种方法来自动完成构建。

1 个答案:

答案 0 :(得分:4)

通过gradle android插件

您可以使用gradle buildConfigField。 例如

android {
    ...
    buildTypes {
        debug {
            buildConfigField "boolean", "TYPE", "true"
        }
        release {
            buildConfigField "boolean", "TYPE", "false"
        }
        ...
    }    
}

然后

@Test(type = BuildConfig.TYPE)
public class Example {
} 

使用buildConfigField,您还可以在BuildConfig中添加其他类型。

android {
    buildTypes {
        debug {
            buildConfigField "int", "A_INT", "1"
            buildConfigField "String", "A_STRING", "\"string_1\"" // <---note the escape
        }

        release {
            buildConfigField "int", "A_INT", "2"
            buildConfigField "String", "A_STRING", "\"string_2\""
        }
    }
}

如果你有多种口味,你可以在每种口味中定义一个字段:

productFlavors {
    // Define separate dev and prod product flavors.
    dev {
        buildConfigField "boolean", "IS_DEV", "true"
    }

    prod {
        buildConfigField "boolean", "IS_DEV", "false"
    }
}

使用相同的规则,您可以使用resValue

在资源中添加值
android {
    buildTypes {
        debug{
            resValue "string", "dev_name", "Alice"
        }

        release {
            resValue "string", "dev_name", "Bob"
        }
    }
}

按代码

你可以在src / debug / java / your.package.name下放置一个带有值的Class,在src / release / java / your.package.name

下放置一个具有不同值的Class

调试版

public final class MyConfigurations {
    public static final boolean TYPE = true;
    ...
}

发布版本

public final class MyConfigurations {
    public static final boolean TYPE = false;
    ...
}

你也可以使用与android gradle插件相同的逻辑来玩味道(实际上这个解决方案也取决于该插件)