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

Bar*_*ski 3 java android annotations gradle android-gradle-plugin

假设我有一个自定义注释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Test {
    boolean type();
}
Run Code Online (Sandbox Code Playgroud)

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

所以,我可以做一些喜欢的是:

@Test(type = BuildConfig.DEBUG)
public class Example {
} 
Run Code Online (Sandbox Code Playgroud)

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

任何人都知道为此创建解决方法吗?也许在gradle中指定一些其他参数?我对让我手动更改type特定构建的解决方案不感兴趣。这样或那样。我正在寻找一种通过构建自动执行此操作的方法。

Mim*_*oli 5

通过 gradle android 插件

您可以使用 gradle buildConfigField。例如

android {
    ...
    buildTypes {
        debug {
            buildConfigField "boolean", "TYPE", "true"
        }
        release {
            buildConfigField "boolean", "TYPE", "false"
        }
        ...
    }    
}
Run Code Online (Sandbox Code Playgroud)

进而

@Test(type = BuildConfig.TYPE)
public class Example {
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

    prod {
        buildConfigField "boolean", "IS_DEV", "false"
    }
}
Run Code Online (Sandbox Code Playgroud)

使用相同的规则,您可以使用resValue以下方法在资源中添加值:

android {
    buildTypes {
        debug{
            resValue "string", "dev_name", "Alice"
        }

        release {
            resValue "string", "dev_name", "Bob"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

按代码

您可以在 src/debug/java/your.package.name 下放置一个具有值的类,在 src/release/java/your.package.name 下放置具有不同值的相同类

调试版本

public final class MyConfigurations {
    public static final boolean TYPE = true;
    ...
}
Run Code Online (Sandbox Code Playgroud)

发布版本

public final class MyConfigurations {
    public static final boolean TYPE = false;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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