最近我老大问我一个问题,说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. CF997A Convert to Ones

    CF997A Convert to Ones 题目大意: 给你一个长度为 nn 的01串( n $\leq 3*10^5$ ),你有两种操作: 1.将一个子串翻转,花费 XX 2.将一个子串中的0变成 ...

  2. 洛谷——P1759 通天之潜水

    P1759 通天之潜水   题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具. ...

  3. Git ——Tool

    Git: 何为Git: Git 是一个可以实时记录文件变化.维护文件的安全的一个仓库! Git仓库是由** Linux 系统之父 Linus Torvalds ** 创建的一个开源 的软件!Githu ...

  4. 第六节:web爬虫之urllib(二)

    二.urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, metho ...

  5. sgu 176 有源汇有上下界的最小流模板题

    /*参考博文:http://hi.baidu.com/dragon_eric123/item/82e259200ece744046996282 有上下界的有源最小流 */ #include<st ...

  6. oracle导入少量数据(少于10M)

    工具用PL/SQL Developer select * from temp1 for update;开锁,点+号,直接从Excel复制,然后粘贴. 程序猿必读

  7. 洛谷 P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    P3067 [USACO12OPEN]平衡的奶牛群Balanced Cow S… 题目描述 Farmer John's owns N cows (2 <= N <= 20), where ...

  8. ddl in PL/SQL

    If you write DDL directly in PL/SQL. You will hit error. 1 DECLARE 2 str_sql varchar2(500); 3 begin ...

  9. [MongoDB]mongo命令行工具

    1.use dbname 自动创建 2.db.user.find() 空 show collections 空 show dbs 3.db.user.save({name:'',age:20}) db ...

  10. LeetCode258——Add Digits

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...