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

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

productFlavors

先来看一段代码

android {
compileSdkVersion
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.z.q.flavor"
minSdkVersion
targetSdkVersion
versionCode
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
productFlavors{
flavor1{//自定义flavor1的参数
applicationId "com.z.q.flavor1"
minSdkVersion
targetSdkVersion
versionCode
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的开发者文档

Android之通过配置Flavor实现一个项目打包成多个apk的更多相关文章

  1. Android Studio将项目打包成apk

    Android Studio将项目打包成apk 第一种方法:适合自己调试用. (1)直接在项目中生成: (2)位置是在你的项目中 第二种方法:适合发布应用. (1)找到Generate Signed ...

  2. AS 3.1 项目打包成jar或aar

    1.首先明白一个道理. Android Studio编译的时候会自动将项目生成jar和aar的,我一开始以为jar需要自己单独生成,其实AS已经自动生成了,网上找的很多资料都是一个复制的过程而已. 只 ...

  3. 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行

    一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...

  4. Eclipse中将含有图片资源的项目打包成jar文件

    前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...

  5. java项目打包成可运行的jar,main方法带参数

    转载 原文地址:http://www.cnblogs.com/neillee/p/6063808.html#commentform 将 java 项目打包成可运行的 jar 包(main 函数带参数) ...

  6. AndroidStudio项目打包成jar

    AndroidStudio项目打包成jar 前言:在eclipse中我们知道如何将一个项目导出为jar包,现在普遍AndroidStuido开发,这里一步一步详加介绍AS项目打包成jar,jar和ar ...

  7. springboot项目打包成jar/war包

    springboot项目打包过程中包含第三方jar 开发IDE是IntelliJ IDEA,数据库是mysql,内置服务器tomcat. 打包步骤: 1. 确定项目调试运行没问题 2. 将第三方jar ...

  8. 将项目打包成jar,如何又将jar还原成项目

    一.将项目打包成jar 第一步: 选择项目,鼠标右键,选择export ,出现如下 接下来就是点击Next,Next,最后点击Finish 后 会生成jar 二.将jar还原成项目 第一步 用反编译工 ...

  9. (3)Maven快速入门_3在Eclipse中创建Maven项目打包成jar

    Eclipse中创建Maven项目 new ---> maven project  ----> next 如下 普通java项目 选择  如下 quickstart 创建项目 : 输入 G ...

随机推荐

  1. 腾讯云,搭建LAMP服务

    lamp (Web应用软件) 编辑 Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被 ...

  2. 解决WP程序 重复打开出现 “正在加载...” 字样 解决方案

    在开发winphone程序时候 我们经常遇到调试.在调试的时候 可能会重复打开 debug一下.可是有时候 经常遇到 "正在加载...."字样.而且很慢.效率很低. 测试发现 在 ...

  3. 【BestCoder Round #93 1001】MG loves gold

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6019 [题意] 每次选择一段连续的段,使得这一段里面没有重复的元素; 问你最少选多少次; [题解] ...

  4. LINUX 内核内存管理

    https://linux-mm.org/ http://www.cnblogs.com/liloke/archive/2011/11/20/2255737.html

  5. HDU 4540

    简单得不能再简单的DP了. #include<iostream> const int inf=1<<30; using namespace std; int map[22][2 ...

  6. Kotlin和Java名称的由来

    Kotlin和Java名称的由来 学习了:http://blog.jobbole.com/111249/ JetBrains由战斗民族开发: Java来源于印尼群岛中的Java岛: Kotlin来源于 ...

  7. Android实战简易教程-第二十四枪(基于Baas的用户表查询功能实现!)

    接着上一篇,我们注冊了几个用户,用户表例如以下: 以下我们用ListView将表中数据显示出来吧. 首先看一下main.xml: <RelativeLayout xmlns:android=&q ...

  8. @PropertySource&@ImportResource&@Bean

    @**PropertySource**:加载指定的配置文件: ```java /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉 ...

  9. JS容易犯错的this和作用域

    var someuser = { name: 'byvoid', func: function() { console.log(this.name); } }; var foo = { name: ' ...

  10. OSGI依赖问题处理

    用osgi实现java的模块化和热插拔时要考虑好两个问题,不同bundle间如何通信?依赖怎么处理? OSGi的一个标准就是各个bundle之间是相互隔离的,每个bundle都有自己的classloa ...