美文网首页
Android之通过配置Flavor实现一个项目打包成多个apk

Android之通过配置Flavor实现一个项目打包成多个apk

作者: 我给你想的好名字 | 来源:发表于2021-02-07 08:32 被阅读0次

    productFlavors

    先来看一段代码

    [ 复制代码

    ](javascript:void(0); "复制代码")

    <pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">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
    }
    }
    ...
    }</pre>

    [ 复制代码

    ](javascript:void(0); "复制代码")

    这个是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我配置了两个项目,那么相应的需要建立两个资源文件夹。
    [图片上传失败...(image-472c82-1597806735941)]

    这两个文件名字必须和build.gradle里面配置的两个Flavors名字相同,现在可以在这两个文件夹里创建各自项目的资源了。
    在这两个文件夹里面创建资源的时候一定要和main的文件格式一致,如图:
    [图片上传失败...(image-91ae17-1597806735941)]

    这个文件格式一致是指包名必须相同。这时有人可能会问为什么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资源。
    [图片上传失败...(image-c3c3e1-1597806735941)]

    细心的同学可能会发现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

    [图片上传失败...(image-e0f689-1597806735941)]

    这张是main的清单文件

    [图片上传失败...(image-dfa0a5-1597806735941)]

    这是flavor1的清单文件

    image.png

    这是flavor2的清单文件

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

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

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

    相关文章

      网友评论

          本文标题:Android之通过配置Flavor实现一个项目打包成多个apk

          本文链接:https://www.haomeiwen.com/subject/avuydktx.html