为什么我应该在ProGuard中保留BuildConfig?

11

我遇到了几个带有以下代码行的 ProGuard 示例:

# Keep the BuildConfig
-keep class com.example.BuildConfig { *; }

我已经在我的应用程序中加入和没有加入这行代码(当然,使用我的软件包),但是没有发现任何区别。 我还查看了生成的 ... /BuildConfig.java 文件,也没有任何更改。

我需要在ProGuard中保留我的BuildConfig的目的是什么?

谢谢!

3个回答

7

BuildConfig 包含一些在编译时设置的有用的值。具体来说,这些值包括:

boolean DEBUG – if the build is debuggable.
int VERSION_CODE
String VERSION_NAME
String APPLICATION_ID
String BUILD_TYPE – name of the build type, e.g. "release"
String FLAVOR – name of the flavor, e.g. "paidapp"

您还可以设置自己的配置值,例如针对测试和生产使用不同的URL,并从BuildConfig文件中检索它们,而不是维护自己的Config.java文件。这可以通过将buildConfigFields添加到gradle buildTypes中来完成,如下所示:

buildTypes {
    debug {
        buildConfigField "boolean", "SOME_VAR", "true"
    }
    release {
        buildConfigField "boolean", "SOME_VAR", "false"
    }
}

所以回答你的问题,据我所知你不必保留该文件,但这是一个好习惯,并可用于配置需求。

3
与其他类一样,如果您通过反射间接访问该类,则需要使用-keep命令使ProGuard不会混淆它或将其优化为未使用的状态。
通常情况下,使用BuildConfig的访问模式是直接的,而不是通过反射间接访问,因此在这些情况下,让ProGuard处理您的BuildConfig也是可以的。

1
我没有通过反射访问它(至少不是故意的;-)),即使我没有从反射中排除它,它仍然失败了。我确实通过Gradle向其添加了参数。但这应该在混淆之前完成,所以我不明白为什么会失败。 - Torge

0

一些崩溃报告库,例如ACRA,通过反射访问BuildConfig,因此如果您使用其中一个并希望在崩溃报告中获取信息,则应该-keep它。


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