知识背景

Android studio升级到3.0之后,gradle增加了多维度管理配置,便于同一个项目中创建应用的不同版本,分别管理依赖项并签署配置。创建产品风味与创建构建类型类似:只需将它们添加到productFlavors {}代码块,并配置您想要的设置。产品风味支持与 defaultConfig相同的属性,这是因为defaultConfig实际上属于ProductFlavor类。

工程中配置Flavor

如下这个是module里面的build.gradle部分代码(android节点下),这里面主要增加的是productFlavors,这个就是用来配置不同项目的参数。
图片

在这里我配置了三个项目,分别是intermodalTransport、onlineBattle、convergence。不同的项目ID当然需要不同,配置ID的方法有两种: 

  1. 第一种就是直接使用applicationId这个属性,直接给intermodalTransport配置一个ID属性即可。
  2. 第二种就是使用applicationIdSuffix这个属性,这个的意思是在defaultConfig的默认ID基础上,在后面追加一段,如下图示例代码。
android {
    defaultConfig {
        applicationId "com.flavor.myapp"
    }
    productFlavors {
       intermodalTransport{
            applicationIdSuffix ".a"
        }
       onlineBattle {
            applicationIdSuffix ".b"
        }
    }
}

Ps: 如上是build.gradle文件配置,配置完成后可在如下截图的Build Variants处看到相应配置的选择菜单,截图如下:

图片

资源文件配置

我在build.gradle配置了三个项目,那么相应的需要建立三个资源文件夹,main属于工程主体,如下图所示。

图片

Ps:在这三个文件夹里面创建资源的时候一定要和main的文件格式一致,这个格式一致是指包名必须相同。在配置Flavor中,在进行构建的时候会将选中的Flavor和main进行结合构建,说白了就是如果Flavor没有的东西就会使用main里面的代替,一般来说都会各自用各自的资源,比较好管理。

Java文件:要求flavor中只存放各自特性的java文件代码,main中放置多个flavor公共的java文件代码。

清单文件Manifest

清单文件不像Java代码文件那样,每个项目相同的Java代码文件不可以和main中的Java代码文件共存,而是main和每个项目都可以有清单文件,但是又不会像res资源文件那样,项目中的res资源文件会覆盖main的res资源文件。

在编译的时候Android studio会把main的清单文件和选中项目的清单文件合并,但是合并就会出现冲突。在这里只介绍两种合并方法:merge和replace

具体配置属性位置如下截图:

图片

Application属性字段:node

Merge属性:一般来说以main中为主题,其他flavor为分支差异版本配置的时候使用,一般都是把flavor与main的清单文件合并取交集。

Replace属性:在出现flavor与main中有相同的属性名的时候,或优先使用flavor中的清单属性替换main,这个属性不建议使用。

如何代码识别当前处于哪个flavor开发环境?

代码中获取配置文件"BuildConfig.java"中的各变量,以实现对应型号产品特定的功能和逻辑。

图片


华为开发者论坛
352 声望56 粉丝

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!