Android多渠道打包神器ProductFlavor详解
作者:撩得Android一次心动 发布时间:2021-06-11 19:48:22
一.什么是多渠道打包
在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的各种下载量、用户数等关键数据。
多渠道打包的原理就是为我们每个平台或者市场发布的apk指定一个唯一的标识符。通过这个标识符就可以知道被下载的apk是在哪个平台市场下载的。
1.多版本
基于buildTypes
(1) debug:调试版本,无混淆
(2) release:发布版本,有混淆、压缩
2.多环境
基于productFlavors
(1)develop:开发环境,开发和自测时使用
(2)check:测试环境,克隆一份生产环境的配置,在这里测试通过后,再发布到生产环境。之所以没命名为test是因为在gradle编译时:ProductFlavornamescannotstartwith'test'
(3)product:生产环境,正式提供服务的。
3.多渠道
基于Android新的应用签名方案APKSignatureSchemev2中的APKSigningBlock区块
我这里使用的是美团封装的Walle库。使用Walle库请确保你的AndroidGradle插件版本在2.2.0以上。
为什么不直接使用productFlavors来打包多渠道?因为productFlavors打多渠道包太慢了,打30个包差不多十几分钟,无法忍受!
为什么不使用美团之前基于META-INF进行渠道标识的方案?因为Android7.0之后的这种黑科技已经失效了!
二.多渠道打包的方式(ProductFlavor&&多渠道打包插件)
1.ProductFlavor
Android基于 Gradle开发的一个插件里面的产品配置构建“变种”制作渠道包。
Gradle开发的插件是哪里来的???
1.首先项目有两层build.gradle文件:
build.gradle(本项目名称) 最外层的build.gradle文件
build.gradle(:app) app目录下build.gradle文件
在顶层build.gradle文件中添加依赖
使用Gradle插件:
上面是导入多个插件使用plugins;
plugins {
id 'com.android.application'
}
导入单个可以使用
apply plugin:'com.android.application'
就这样我们就可以在 app目录下build.gradle文件中的android节点使用ProductFlavor。
1.1 如何是使用ProductFlavor
flavorDimensions "default"
//方式1:(适用于多数据)
//读取channel.txt渠道文件 创建flavor
file('channel.txt').readLines().each {
channel->
productFlavors.create(channel,{
dimension "default"
//替换AndroidManifest中的值
manifestPlaceholders=[channel1:channel]
})
}
//方式2:(比较常用:适用于少量)
productFlavors{
ywj{
}
wyw{
}
}
访问的文件如图所示:
他会生成多少个“变种”呢???
是根据你的productFlavors中的个数与buildTypes中的类型个数(一般是release+debug)
我这里没有写debug但是下面生成了对应的“变种”:注意 buildType 类型的debug是默认的,不写也会默认存在。
这个按字母排序的。
1.2 如何是使用ProductFlavor加载apk包
使用Gradle工具栏下的Tasks中的build中的工具加载
点击assembleRelesase试试水,看看发生了什么?
1.3 该如何获取不同渠道包的信息
</activity>
<meta-data android:name="CHANNEL_VALUE" android:value="${channel1}"/>
</application>
</manifest>
再不同的apk包中可以访问不同的信息。关于怎么访问AndroidManifest.xml里的数据会在以后进行学习!!!
1.4 使用ProductFlavor加载apk包的优缺点
优点:官方,可配置性高
缺点:每个渠道包需要执行完整的构建流程,非常的慢!!!
2.多渠道打包插件
这个方法很好的弥补了上一个打包方式的缺点。此时要多加一个依赖。底下目前展示的第二个依赖不可用,不过不要紧。你可以使用美团(walle)、腾讯(VasDolly)...等的多渠道打包插件
//引入插件
apply plugin: 'com.enjoy.channel'
channel{
//基准包
baseApk "${buildDir}/outputs/apk/release/app-release.apk"
//输出目录
outDir "${buildDir}/outputs/channel"
//渠道信息
channelFile "${projectDir}/channel.txt"
}
如图所示:根据上面设置的路径输出。并且生成一个基准包后,输出不同渠道包的速度变快了许多。当你再在channel.txt文件中再多加些数据,一样也会很快的输出。
来源:https://blog.csdn.net/indeedes/article/details/124061446
猜你喜欢
- 首先javascript只有这些个类型:1、Number 在JavaScript中的双精度浮点格式 2、String 双引号的反斜杠转义的U
- 本文实例讲述了C#实现图片切割的方法。分享给大家供大家参考,具体如下:图片切割就是把一幅大图片按用户要求切割成多幅小图片。dotnet环境下
- 一. Window 分类应用 Window(ApplicationWindow: 对应一个 Acitivity)
- 一、导言1.1 介绍桥接模式及其应用背景桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以
- 本文实例讲述了Android+SQLite数据库实现的生词记事本功能。分享给大家供大家参考,具体如下:主activity命名为Dict:代码
- private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd
- 本文实例讲述了Android编程使用AlarmManager设置闹钟的方法。分享给大家供大家参考,具体如下:package com.Aina
- 一.内容抽象类当编写一个类时,常常会为该类定义一些方法,这些方法用于描述这个类的行为。但在某些情况下只需要定义出一些方法,而不需要具体的去实
- 本文主要介绍的是通过使用java的相关类可以实现对文件或文件夹的压缩。zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据
- 一、abstract 抽象的抽象类:被abstract 修饰的类语法: abstract class 类名{}抽象方法 : 被a
- 本文实例讲述了Java简单实现约瑟夫环算法。分享给大家供大家参考,具体如下:1.算法背景:罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这
- 引言:上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一
- 本文实例讲述了C#画图之饼图折线图的实现方法,是C#程序设计中非常实用的技巧。分享给大家供大家参考。具体方法分析如下:显示图像的控件定义如下
- 本文实例为大家分享了java实现选课系统的具体代码,供大家参考,具体内容如下这个程序主要是练习IO(文件读写,序列化),集合框架的使用学生端
- java的比较器有两类,分别是Comparable接口和Comparator接口。在为对象数组进行排序时,比较器的作用非常明显,首先来讲解C
- 每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖!C语言运算符优先
- Java 8的18个常用日期处理一、简介伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API。J
- 基于Java的简单的用户管理系统,供大家参考,具体内容如下此系统功能和方法都比较简单本次系统通过控制台输入商品的基本信息,加入管理员的登录与
- 进行数据源或者 FTP 服务器等资源配置时,我们可以将这些配置信息放到一个独立的外部属性文件中,并在 Spring 配置文件中通过形如 ${
- 传统的web项目,只需要在web.xml里配置多个即可,并且支持多个url-pattern在spring boot中,我们默认无需配置,系统