当前位置: 首页 > 知识库问答 >
问题:

Gradle:如何在Android库中使用BuildConfig,并在应用程序中设置标志

顾泰平
2023-03-14

基于我(gradle 1.10和gradle plugin 0.8)的android项目由一个大型android库组成,它依赖于3种不同的android应用程序

在我的图书馆里,我希望能够使用这样的结构

if (BuildConfig.SOME_FLAG) {
    callToBigLibraries()
}

因为proguard将能够根据某个_标志的最终值来减小生成的apk的大小

但我不知道该如何处理gradle,因为:

* the BuildConfig produced by the library doesn't have the same package name than the app
* I have to import the BuildConfig with the library package in the library
* The apk of an apps includes the BuildConfig with the package of the app but not the one with the package of the library.

我试着玩建筑类型之类的东西,但没有成功

java prettyprint-override">release {
    // packageNameSuffix "library"
    buildConfigField "boolean", "SOME_FLAG", "true"
}
debug {
    //packageNameSuffix "library"
    buildConfigField "boolean", "SOME_FLAG", "true"
}

为“我的库”和“我的应用”生成共享BuildConfig的正确方法是什么?这些应用的标志将在“应用”中生成时被覆盖?

共有3个答案

严扬
2023-03-14

你不能做你想做的,因为BuildConfig。一些_标志无法正确传播到您的库中;构建类型本身不会传播到库中——它们总是作为发行版构建的。这是臭虫https://code.google.com/p/android/issues/detail?id=52962

解决方法:如果您可以控制所有库模块,那么您可以确保calltobigbraries()所涉及的所有代码都在类和包中,您可以使用ProGuard将它们完全分离,然后使用反射,这样,如果它们存在,你就可以访问它们,如果它们不存在,你就可以优雅地降级。你基本上是在做同样的事情,但你是在运行时而不是编译时进行检查,这有点难。

如果你不知道怎么做,请告诉我;如果你需要的话,我可以提供样品。

轩辕弘雅
2023-03-14

更新:对于新版Android Gradle插件,publishNonDefault已被弃用,不再有效。所有变体现在都已发布。

下面的解决方案/变通方法对我有用。它是由谷歌问题跟踪器中的某个人发布的:

尝试在库项目中将publishNonDefault设置为true

android {
    ...
    publishNonDefault true
    ...
}

并将以下依赖项添加到使用库的应用程序项目中:

dependencies {
    releaseCompile project(path: ':library', configuration: 'release')
    debugCompile project(path: ':library', configuration: 'debug')
}

这样,使用库的项目就包含了正确的库构建类型。

董阳平
2023-03-14

作为一种解决方法,您可以使用此方法,它使用反射从应用程序(而不是库)获取字段值:

/**
 * Gets a field from the project's BuildConfig. This is useful when, for example, flavors
 * are used at the project level to set custom fields.
 * @param context       Used to find the correct file
 * @param fieldName     The name of the field-to-access
 * @return              The value of the field, or {@code null} if the field is not found.
 */
public static Object getBuildConfigValue(Context context, String fieldName) {
    try {
        Class<?> clazz = Class.forName(context.getPackageName() + ".BuildConfig");
        Field field = clazz.getField(fieldName);
        return field.get(null);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

例如,要获取DEBUG字段,只需从您的活动调用该字段:

boolean debug = (Boolean) getBuildConfigValue(this, "DEBUG");

我还在AOSP问题跟踪器上分享了这个解决方案。

 类似资料:
  • 问题内容: 我刚刚在Windows上创建了我的第一个应用程序。 我如何给它一个图标? 似乎没有任何构建标记可以执行此操作,而且我知道golang不支持资源。 问题答案: 您可以使用akavel / rsrc之 类的工具来生成一个.syso文件,该文件中嵌入了指定的资源,旨在在构建Win32可执行文件时供Go链接器使用。 以lxn / walk应用程序为例,该应用程序将其他元数据嵌入其可执行文件中。

  • 我正在为windows编程JavaFX应用程序,并希望在这些情况下看到应用程序图标 快捷图标(在桌面上,windows开始菜单上) 任务栏图标(即使应用程序固定在任务栏上) (可选).exe-图标 下面的代码似乎很好地完成了它的工作,但是当应用程序运行时,我右按任务栏选择“pin this program”,默认的咖啡杯又会显示出来。当右键单击任务栏项时,杯子就会显示出来-.- 编辑:越来越傻了…

  • 我想在发布版本中只使用英语,在调试版本中使用多种语言。我可以使用ProductFlavor实现这一点,但不能使用buildType。 我正在使用重新配置。。但它不能在BuildType下使用。如果我尝试在buildTypes下使用它,构建失败,我会得到以下错误: 找不到Gradle DSL:重新配置() 任何帮助都将不胜感激 同一行中还有一个问题。我有一个场景,只有当QA_BUILD为假时,我才需

  • 问题内容: 我已经创建了一个SQLite数据库。我想将此数据库文件用于我的Android项目。我想将此数据库与我的应用程序捆绑在一起。 应用程序如何创建该数据库的访问权限并将其用作数据库,而不是创建新数据库? 问题答案: 注意: 在尝试此代码之前,请在以下代码中找到此行: 此处是你的数据库的名称。假设你在文件夹中有数据库的副本,因此,例如,如果你的数据库名称为,则的值为, 将数据库保留在资产文件夹

  • 问题内容: 我知道我可以为每种形式或根形式指定一个,然后它将级联到所有子形式,但是我想有一种方法可以覆盖所有形式的默认Java Coffee Cup,即使那些形式我可能会忘记。 有什么建议? 问题答案: 您可以将根形式(我假设是)作为自己的子类,并将标准功能放入其构造函数中,例如: 您也可以在此处捆绑其他标准内容,例如将框架的窗口度量标准存储为用户首选项,管理初始窗格等。 此框架产生的任何新框架也

  • 我对保护服务器不太熟悉,所以我对这方面不太了解,但我需要让运行在数字海洋水滴上的Spring Boot应用程序使用HTTPS。 我的想法是注册一个letsencrypt证书,然后告诉Spring使用它。 然而,我不知道如何做到这一点。 谢谢。