假设我有自定义注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Test {
boolean type();
}
我希望type
参数根据构建类型而不同(但会自动更改)。
所以我可以做喜欢:
@Test(type = BuildConfig.DEBUG)
public class Example {
}
但是Example
类的代码当然不能编译,因为BuildConfig.DEBUG
的值不是常数。
任何人都有为此创建解决方法的想法吗?也许在gradle中指定一些其他参数?我对一个能让我手动更改特定版本的type
的解决方案不感兴趣。这种方式或其他方式。我正在寻找一种方法来自动完成构建。
答案 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插件相同的逻辑来玩味道(实际上这个解决方案也取决于该插件)