个人博客:

http://www.milovetingting.cn

Android Gradle 多渠道构建

多渠道构建的基本原理

在Android Gradle中,定义了一个叫Build Variant的概念,一个Build Variant=Build TYpe+Product Flavor,Build Type就是我们构建的类型,比如release和debug;Product Flavor就是我们构建的渠道,比如Baidu,Google等,它们加起来就是baiduRelease,baiduDebug,googleRelease,googleDebug,共有这几种组合的构件产出。Product Flavor也就是我们多渠道构建的基础。以下是新增一个ProductFlavor:

android{
productFlavors{
google{}
baidu{}
}
}

以上的发布渠道配置后,Android Gradle就会生成很多Task。其中,assemble开头的负责生成构件产物(apk)。除此之外,还有compile系列,install系列等。除了生成的Task外,每个ProductFlavor还可以有自己的SourceSet,还可以有自己的dependencies依赖。

Flurry多渠道和友盟多渠道构建

Flurry本身没有渠道的概念,它有Application,所以可以把一个Application当成一个渠道。

android{
productFlavors{
google{
buildConfigField 'String','FLURRY_KEY','"ABADFASSDFAS"'
}
baidu{
buildConfigField 'String','FLURRY_KEY','"JKKJKHKJHIHIUY"'
}
}
}

这样每个渠道的BuildConfig类中都会有名字为FLURRY_KEY的常量定义,它的值是我们在渠道中使用buildConfigField指定的值,每个渠道不一样,我们只需要在代码中指定使用这个常量即可,这样每个渠道的统计分析就可以做到了。

Flurry.init(this,FLURRY_KEY);

友盟本身有渠道的概念。不过它不是在代码中指定的,而是在AndroidManifest.xml中配置的,通过配置meta-data标签来设置:

<meta-data android:name="UMENG_CHANNEL" android:value="Channel ID"/>

多渠道构建定制

多渠道的定制,其实就是对Android Gradle插件的ProductFlavor的配置,通过配置ProductFlavor达到灵活控制每一个渠道的目的。

applicaitonId

用于设置渠道的包名

consumerProguardFiles

只对Android库项目有用。当我们发布库项目生成一个aar包的时候,使用consumerProguardFiles配置的混淆文件列表也会被打包到aar里一起发布,这样当应用引用这个aar包,并且启用混淆的时候,会自动使用aar包里的混淆文件对aar包里的代码进行混淆,这样我们就不用对该aar包进行混淆配置了。

android{
productFlavors{
google{
consumeProguardFiles 'proguard-rules.pro','proguard-android.txt'
}
}
}

除了这种方法,还有一种属性设置的方法,区别在于:consumerProguardFiles方法是一直添加,不会清空以前的混淆文件,而consumerProguardFiles属性配置的方式是每次都是新的混淆文件列表,以前配置的会先被清空。

manifestPlaceholders

multiDexEnabled

用来启用多个dex的配置,主要用来突破65535方法的问题

proguardFiles

混淆使用的文件列表

signingConfig

签名配置

testApplicationId

用来适配测试包的包名

testFunctionalTest和testHandleProfiling

testFunctionalTest表示是否为功能测试,testHandleProfiling表示是否启用分析功能

testInstrumentationRunner

用来配置运行测试使用的Instrumentation Runner的类名,是一个全路径的类名,而且必须是android.app.Instrumentation的子类,一般情况下,我们使用android.test.InstrumentationTestRunner,当然也可以自定义。

testInstrumentationRunnerArguments

配合上一个属性用的,用来配置Instrumentation Runner使用的参数,它们最终都是使用adb shell am instrument这个命令。

versionCode和versionName

配置渠道的版本号和版本名称。

useJack

用于标记是否启用Jack和Jill这个全新的,高性能的编译器。

dimension

dimension是ProductFlavor的一个属性,接受一个字符串,作为该ProdoctFlavor的维度。可以简单理解为对ProductFlavor进行分组,dimension接受的参数就是我们分组的组名,也就是维度名称。维度名称不能随便指定,在使用前,必须先声明。

flavorDimension是我们使用的android{}里面的方法,它和productFlavors{}是平级的,一定要先使用flavorDimension声明维度,才能在ProductFlavor中使用。

我们同时指定多个维度,但是一定要,这些维度是有顺序的,有优先级的,第一个参数的优先级最大,其实是第二个,以此类推。

android{
flavorDimensions "abi","version"
}

声明维度后,就可以使用了:

android{
flavorDimensions "abi","version" productFlavors{
free{
dimension 'version'
}
paid{
dimension 'version'
}
x86{
dimension 'abi'
}
arm{
dimension 'abi'
}
}
}

提高多渠道构建的效率

参考美团方案

利用在apk的META-INF目录下添加空文件不用重新签名的原理

1、利用Android Gradle打一个基本包(母包)

2、基于该包复制一个,文件名要能区分出产品、打包时间 、版本、渠道等

3、对复制出来的apk进行修改,在其META-INF目录下新增空文件,但空文件的文件名要有意义,必须包含能区分渠道的名字

4、重复步骤2、3生成我们所需的所有渠道包apk

【Gradle】Android Gradle 多渠道构建的更多相关文章

  1. Android Gradle defaultConfig详解及实用技巧

    实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...

  2. The Android Gradle Plugin and Gradle version-compatibility

    http://tools.android.com/tech-docs/new-build-system/version-compatibility Version Compatibility Post ...

  3. 【Gradle】 Gradle 综合

    Gradle User Guide:http://www.gradle.org/docs/current/userguide/userguide.html 针对它的中文翻译:http://ask.an ...

  4. 《Gradle权威指南》--Android Gradle多渠道构建

    No1: Build Variant = Build Type + Product Flavor Build Variant:构建的产物 Build Type:构建的类型 Product Flavor ...

  5. Android Studio的构建系统:Gradle

    原文作者:youxiachai <用Gradle 构建你的android程序> 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android st ...

  6. Android Gradle实用技巧——多渠道打包

    友盟有很多不错的功能,例如渠道统计等. 想要做渠道统计,有一个要求就是要在manifest文件中添加各个渠道的配置.只有一两个渠道还好说,但是渠道多了的话,手动修改然后打包简直是噩梦. 幸好现在And ...

  7. Android Gradle Plugin指南(六)——高级构建定制

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization ...

  8. Android Gradle基于参数化配置实现差异化构建

    一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...

  9. 《Gradle权威指南》--Android Gradle多项目构建

    No1: Android多项目设置 目录结构: MyProject/ setting.gradle app/ build.gradle libraries/ lib1/ build.gradle li ...

随机推荐

  1. shell 循环读取文件及字符串转为数组

    文件/etc/hdocker_config内容如下: 30.72.63.94 30.72.63.95 30.72.63.96 30.72.63.97 /tmp/lasclocker.tar maste ...

  2. postman+newman+html测试报告(接口自动化)

    1.安装node.js(Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境) 下载安装node.js,下载地址:https://nodejs.org/en/ 2.安 ...

  3. EditText 无法失焦与失焦后键盘不收缩解决方案

    背景 有一个需求,比方说下图: 点击了上图的Image 区域才可以编辑. 那么我首先想到的就是: android:focusable="false" 不让它获取到焦点不就ok吗? ...

  4. python3如何随机生成大数据存储到指定excel文档里

    本次主要采用的是python3的第三方库xlwt,来创建一个excel文件.具体步骤如下: 1.确认存储位置,文件命名跟随时间格式 2.封装写入格式 3.实现随机数列生成 4.定位行和列把随机数写入 ...

  5. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  6. asp.net core 配置微信返回信息接口

    这玩意弄了两天 微信的API需要升级了 只有一份PHP的DEMO 还有个坑 返回值一定要是 微信传入的echostr 否则 出现配置失败,这个问题耗了我俩小时 最后还是在论坛看到的解决方案. 项目必须 ...

  7. 打样ov9650,无一幸免,失败告终,之调试记录

    新打样的ov9650,焊接了4块,其中只有2块有反应,另外两块无反应,于是使用热风台助焊,调试 助焊无效,怀疑焊盘有问题,于是拆掉 有问题的图像不正常 已看图像,只知道缺位,于是使用示波器检查,发现d ...

  8. 浅谈Redis面试热点之工程架构篇[1]

    前言 前面用两篇文章大致介绍了Redis热点面试中的底层实现相关的问题,感兴趣的可以回顾一下:[决战西二旗]|Redis面试热点之底层实现篇[决战西二旗]|Redis面试热点之底层实现篇(续) 接下来 ...

  9. JAVA使用SnakeYAML解析与序列化YAML

    1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...

  10. 深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...