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
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的更多相关文章
- Android Studio将项目打包成apk
Android Studio将项目打包成apk 第一种方法:适合自己调试用. (1)直接在项目中生成: (2)位置是在你的项目中 第二种方法:适合发布应用. (1)找到Generate Signed ...
- AS 3.1 项目打包成jar或aar
1.首先明白一个道理. Android Studio编译的时候会自动将项目生成jar和aar的,我一开始以为jar需要自己单独生成,其实AS已经自动生成了,网上找的很多资料都是一个复制的过程而已. 只 ...
- 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行
一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...
- Eclipse中将含有图片资源的项目打包成jar文件
前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...
- java项目打包成可运行的jar,main方法带参数
转载 原文地址:http://www.cnblogs.com/neillee/p/6063808.html#commentform 将 java 项目打包成可运行的 jar 包(main 函数带参数) ...
- AndroidStudio项目打包成jar
AndroidStudio项目打包成jar 前言:在eclipse中我们知道如何将一个项目导出为jar包,现在普遍AndroidStuido开发,这里一步一步详加介绍AS项目打包成jar,jar和ar ...
- springboot项目打包成jar/war包
springboot项目打包过程中包含第三方jar 开发IDE是IntelliJ IDEA,数据库是mysql,内置服务器tomcat. 打包步骤: 1. 确定项目调试运行没问题 2. 将第三方jar ...
- 将项目打包成jar,如何又将jar还原成项目
一.将项目打包成jar 第一步: 选择项目,鼠标右键,选择export ,出现如下 接下来就是点击Next,Next,最后点击Finish 后 会生成jar 二.将jar还原成项目 第一步 用反编译工 ...
- (3)Maven快速入门_3在Eclipse中创建Maven项目打包成jar
Eclipse中创建Maven项目 new ---> maven project ----> next 如下 普通java项目 选择 如下 quickstart 创建项目 : 输入 G ...
随机推荐
- 本地文件与服务器文件同步shell脚本
为何创建此脚本是因为方便项目的布署,不需要手动地去同步不同的项目,而只需要简单的执行shell脚本,输入项目名就能发布到服器上. 1.shell文件代码 #!/bin/sh read -t 30 -p ...
- java折半插入排序
代码如下: public class BinaryInsertSort { public static void binaryInsertSort(DataWrap [] data) { System ...
- 消除input框的默认样式
input, button, select, textarea { outline: none; -webkit-appearance: none; border-radius: 0; } outli ...
- Git 基础教程 之 标签
所谓标签:就是一个让人容易记住的有意义的名字,与某个commit绑在一起. 创建标签:①切回需要打标签的分支上 ② git tag <name> 默认标 ...
- 51nod1103 N的倍数
[题解] 先预处理出模N意义下的前缀和sum[i]. 1.如果sum[i]=0,那么1~i的数之和就是N的倍数 2.sum[i]%N总共有0~N-1这N种情况:根据1,如果sum[i]为0则必定有解: ...
- PAT 1104 Sum of Number Segments
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For exam ...
- 查看Linux中自带的jdk ,设置JAVA_HOME
在配置hadoop是,进行格式化hadoop的时候,出现找不到jdk 我用centos7是64位的, 发现本机有java ,就找了一下其位置 找到了jdk-1.7.0_75 which java [r ...
- ajax学习----json,前后端交互,ajax
json <script> var obj = {"name": "xiaopo","age": 18,"gender ...
- 【codeforces 509E】Pretty Song
[题目链接]:http://codeforces.com/contest/509/problem/E [题意] 让你计算一个字符串的所有子串里面元音字母出现的频率的和; [题解] 先处理出前缀和-&g ...
- nyoj_111_分数加减法_201311281341
分数加减法 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个C程序,实现两个分数的加减法 输入 输入包含多行数据 每行数据是一个字符串, ...