zoukankan      html  css  js  c++  java
  • Android之通过配置Flavor实现一个项目打包成多个apk

    最近我老大问我一个问题,说Android可不可以像iOS那样,通过target对项目进行管理啊。老大提这个问题也是正常的,我公司的主要是帮别的公司做硬件定制的,每定制一个硬件就要定制一个APP,但是很多APP的定制其实都是基于同一个APP,只是改改图标,改改部分功能,但是就是这么简单的改变都需要新建一个项目,试想想如果有几十个项目,刚好修复了一个bug,那么要把这个修复同步到所有项目中,那同步代码的工作量是多么的大,而且还不能保证同步不出错。所以老大让我找找有没有方法可以像iOS的target那样处理。

    这里需要先理解iOS的target是什么。知道的同学可以自行忽略这段。iOS中project包含资源、文件、信息等等,而这些就像一些积木,而target则作为标志,通过不同的标志进行组合,这里有官方的介绍,英语好的同学可以自己去看看。这样组合的好处就是,如果一个项目只需要改变一下图标,那只需要增加图标的资源,然后再增加标志,那就可以生成一个新的APP。抱着试试的心态去寻找Android的target,但是Android并没有这个东西,不过却找到了另一个东西,那就是配置Flavor。

    productFlavors

    先来看一段代码

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.z.q.flavor"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        productFlavors{
            flavor1{//自定义flavor1的参数
                applicationId "com.z.q.flavor1"
                minSdkVersion 15
                targetSdkVersion 25
                versionCode 1
                versionName "1.0"
            }
            flavor2{//在defaultConfig的基础上做修改
                applicationIdSuffix ".flavor2"//输出:com.z.q.flavor.flavor2
                versionNameSuffix "-flavor2"//输出:1.0-flavor2
            }
        }
        ...
    }

    这个是module里面的build.gradle部分代码,这里面主要增加的productFlavors,这个就是来配置不同项目的参数。在这里我配置了两个项目,分别是flavor1和flavor2。不同的项目ID当然需要不同,配置ID的方法有两种: 
    1. 第一种就是直接使用applicationId这个属性,直接给flavor1配置一个ID; 
    2. 第二种就是使用applicationIdSuffix这个属性,这个的意思是在defaultConfig的默认ID基础上在后面追加一段。

    而versionName也是和applicationId一样有两种方法。如果没配置的属性会默认的使用defaultConfig里面的属性。到这里不同项目的build.gradle里面的配置大致完成了,如果还想了解更多的配置信息,可以到Google官网了解。

    资源文件配置

    在build.gradle我配置了两个项目,那么相应的需要建立两个资源文件夹。 

    在build.gradle我配置了两个项目,那么相应的需要建立两个资源文件夹。 
    图片 
    这两个文件名字必须和build.gradle里面配置的两个Flavors名字相同,现在可以在这两个文件夹里创建各自项目的资源了。 
    在这两个文件夹里面创建资源的时候一定要和main的文件格式一致,如图: 
    这里写图片描述 
    这个文件格式一致是指包名必须相同。这时有人可能会问为什么flavor1里面有res资源文件,为什么flavor2里面没有呢?

    我们先从main文件夹来看,在main文件夹里面有Java代码文件,res资源文件和清单文件。在配置Flavor中,在进行构建的时候会将选中的Flavor和main进行结合构建,说白了就是如果Flavor没有的东西就会使用main里面的代替。上图,我就选中了flavor2,具体怎么选着请看下图。因为flavor2中没有res资源和清单文件,那么它就会使用main里面的res资源和清单文件;而如果选着flavor1,那么就会使用flavor1中res资源里面的布局文件。在这里可以看到不同项目中的res资源可以有相同的,Android studio在编译的时候会优先使用Flavor里面的res资源,如果没有再使用main的res资源。 
    这里写图片描述 
    细心的同学可能会发现Java文件夹里面的代码文件,为什么两个Flavor中都有Flavor代码文件,而main中却没有,但是main中有MainActivity代码文件,而两个Flavor文件中却没有。这是因为在编译的时候,Flavor的Java的文件不会覆盖main里面的Java的文件,所以如果Flavor里面有的Java文件,main里面就不能有,如果是所有项目都相同的Java文件,那么就可以放在main文件里。

    到目前为止main文件里面,已经把Java代码文件和res资源文件说明,剩下就只有清单文件了,清单文件比较特殊,需要单独拿来讲解。

    清单文件

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

    在编译的时候Android studio会把main的清单文件和选中项目的清单文件合并,但是合并就会出现冲突。其实谷歌那边早就想到会有这些问题,所以已经提供了解决的方法了。

    在这里我只介绍两种合并方法:merge和replace

    这里写图片描述 
    这张是main的清单文件

    这里写图片描述
    这是flavor1的清单文件

    这里写图片描述
    这是flavor2的清单文件

    在main的清单文件中缺少了主题,而在flavor1清单文件中只有主题没有其他,那么在这里使用merge就会把main和flavor1的aplication的属性相结合。 
    而在flavor2中所有都齐全,只是label不同,这里使用replace就会把main里面的application的属性全都替换掉。

    如果在application中使用这两个属性,除了会把application的属性和main的清单文件里面的application属性结合以往,还会把application包含的activity,service等都结合,所有在这里要谨慎使用。

    还可以使用其他属性来进行结合,具体可以去查看Google的开发者文档

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7650924.html
Copyright © 2011-2022 走看看