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

3
假设我有一个自定义注释:
@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个回答

6

通过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下放置一个带有值的类,在src/release/java/your.package.name下放置一个相同的类,但值不同。

调试版本

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

发布版本

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

您也可以按照 Android Gradle 插件的逻辑来玩味不同的风味(实际上,此解决方案也依赖于该插件)。


这实际上很令人惊讶,因为它似乎有两个原因可以工作。1. 我几乎确定我尝试使用自己的自定义 buildConfigField(我经常使用它们)而不是只是 BuildConfig.DEBUG,但我不记得成功过:D 2. 如果您查看 BuildConfig 类,DEBUG 字段和您的 TYPE 字段看起来完全相同,尽管 Android Studio 不允许您使用 BuildConfig.DEBUG - Bartek Lipinski
到目前为止,你是赏金的最佳候选人。让我们继续保持下去,看看是否还有其他人提出了解决方案。 - Bartek Lipinski
实际上,BuildConfig.DEBUG 和 BuildConfig.TYPE 是非常不同的。是的,它们都是静态常量,但是 TYPE 具有静态和预定义的值,而 BuildConfig.DEBUG 则通过 parseBoolean("true/false") 进行评估。 - Mimmo Grottoli
哦,实际上,我想我记错了:P - Bartek Lipinski

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