转载自https://www.cnblogs.com/zhujiabin/p/7650924.html

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

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

productFlavors

先来看一段代码

android {compileSdkVersion 25buildToolsVersion "25.0.2"defaultConfig {applicationId "com.z.q.flavor"minSdkVersion 15targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}productFlavors{flavor1{//自定义flavor1的参数applicationId "com.z.q.flavor1"minSdkVersion 15targetSdkVersion 25versionCode 1versionName "1.0"}flavor2{//在defaultConfig的基础上做修改applicationIdSuffix ".flavor2"//输出:com.z.q.flavor.flavor2versionNameSuffix "-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的开发者文档

Android之通过配置Flavor实现一个项目打包成多个apk(转载)相关推荐

  1. 如何把一个项目打包成jar包并运行

    1.基于jdk环境,使用Eclipse 2.首先建立一个简单的案例,去maven官网下载fastjson.jar并导入(本案例中使用JSONArray()方法) 3.右键整个项目,选择Build Pa ...

  2. 将Eclipse Android项目打包成APK文件

    将Eclipse Android项目打包成APK文件是本文要介绍的内容,主要是来了解并学习Eclipse Android打包的内容,具体关于Eclipse Android内容的详解来看本文  . Ec ...

  3. java eclipse生成apk,将Eclipse Android项目打包成APK文件

    将Eclipse Android项目打包成APK文件是本文要介绍的内容,主要是来了解并学习Eclipse Android打包的内容,具体关于Eclipse Android内容的详解来看本文. Ecli ...

  4. 转:教大家如何用HBuilder将web项目打包成apk

    链接:https://www.jianshu.com/p/d86bf569295d 将我们的web项目打包成一个apk文件并不难,首先准备好软件HBuilder还有你的项目,注意这里只献给那些不是真正 ...

  5. mvn打包并部署本地tomcat_Maven项目打包成war包部署到Tomcat的方法

    Maven项目打包成war包部署到Tomcat的方法 有关于 Maven 项目的打包部署,我这里用的是 Eclipse 编辑器,以此来做个简单的记录. 实践环境 操作系统: Windows IDE: ...

  6. web项目打包成Native App

    web项目打包成Native App 好长时间没有写过博客了,闲暇时分静下心来给大家分享一下web项目打包成Native App的小知识,最近公司的web项目都开发到收尾阶段了,也在把web项目打包成 ...

  7. 将Spring Boot项目打包成jar包war包

    任务一:将Spring Boot项目打包成jar包 1.在pom.xml文件中添加依赖 2.通过cmd命令行来进行打包jar包(首先进入项目的目录中) 3.进入项目中的target目录下查看包 4.使 ...

  8. java普通项目打包成exe可执行文件

    · 提示,无论打包成jar还是exe程序,运行都需要JDK,需要给没有安装JDK的电脑安装: · maven项目有自己的打jar包方式,我们普通的java项目,可以安照步骤一打包成jar: 步骤一.先 ...

  9. AndroidStudio项目打包成jar

    前言:在eclipse中我们知道如何将一个项目导出为jar包,现在普遍AndroidStuido开发,这里一步一步详加介绍AS项目打包成jar,jar和arr的使用 一.作用: 为了供其它项目使用,将 ...

最新文章

  1. Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)
  2. 短信验证码的登录流程
  3. python换中包_在Linux中替换已安装的python包中的源代码
  4. 用ABAP 生成二维码 QR Code
  5. python字符串填充_填充函数(Python)字符串.zfi
  6. linux xd命令,看Linux文件的内容:用cat,less,more,head,tail,nl,od,xxd,gv,xdvi命令
  7. [实验手册]MPLS/×××分解:防止PE-CE的路由环路
  8. python环境设置和OpenCV-python配置
  9. Vue使用Vditor编辑器
  10. ffffffffffffffffff
  11. Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本
  12. 天天生鲜项目——登录页面
  13. Lumerical官方案例、FDTD时域有限差分法仿真学习(五)——液晶(liquid crystal)
  14. 使用拟合方法实现光敏电阻传感器数值与光照强度的近似转换
  15. java实训自我总结_java实训个人总结
  16. 戴尔电脑,耳机插入无反应解决办法
  17. activiti学习之回退实现
  18. 任泽平最新演讲:从这6个周期,读懂中国经济未来走势
  19. 这几个UP主真的是宝藏,快来看看有没有你认识的
  20. nvenc硬件编码相关设置

热门文章

  1. fingerGgesture
  2. 单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台
  3. PySimpleGUI教程
  4. 计算机专业英语教程比较实用,计算机专业英语教程(经典版).ppt
  5. T57 在线编程网站
  6. timestampdiff的一个BUG
  7. supermap:创建一个imobile【supermap-java】项目,并添加天地图/百度地图
  8. 华为设备配置使用静态端口实现基于VLAN的二层组播
  9. 基于Lattice的密码学
  10. java 图片服务器 上传_Java向服务器上传图片