转自https://www.jianshu.com/p/572b59829a08

为什么要打多个渠道的包?

大家都知道,android应用商店大大小小有几百个,作为一个有志向的app,就需要做到统计各个应用商店的下载量,不同渠道下的app使用时长、安装数量、使用用户数等等信息,这个时候就需要打多个渠道包。渠道包的原理大致就是往apk中写入不同的渠道信息,对这个问题有疑问的同学可以看看gradle官网或者看看这篇文章

传统多渠道打包

用android studio开发的同学都知道,传统的多渠道打包方法是通过gradle配置productFlavors,在配合grade的manifestPlaceholders插件,就可以实现task打多渠道包了,具体如下。

    //app目录下在build.gradle文件中添加如下代码
productFlavors {
yingyongbao {
manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "yingyongbao"]
}
baidu {
manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "baidu"]
}
} //在AndroidManifest.xml中添加如下代码 如果有使用友盟把CUSTOM_CHANNEL换成UMENG_CHANNEL即可
<meta-data
android:name="CUSTOM_CHANNEL"
android:value="${CUSTOM_CHANNEL_VALUE}" />

这个时候就可以用task要打包了,双击即可。或者直接在命令行输入

./gradlew assembleRelease//打包所有渠道
./gradlew assembleWandoujiaRelease//打包单个渠道 Wandoujia
 
1490758426(1).jpg

没出现渠道打包task的同学请点击左上角的刷新按钮。

Walle多渠道打包

这种方法是很简单省事,但是并不省时啊!通过这种方式打包,gradle每次都要从资源文件开始到生成apk重新走一遍,所以很耗时,每次打包一次要等十几分钟,如果渠道多的app估计要等上半小时以上。这时候我们就要想想有没有其他的打包方式了,刚好在推酷上看到了美团开源的Android Signature V2 Scheme 签名下的新一代渠道包打包神器Walle,跟gradle打包不一样,walle是在APK Signature Block区块添加自定义的渠道信息,具体如下。

 
1490759814(1).jpg

当然了,Walle并不是为了解决打包速度而产生的一个工具,美团研究walle的原因是因为在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅—生成渠道包)已经行不通了,具体可以看看Walle自己是怎么说的。

Walle简单使用

Gradle 插件使用方式

//配置 build.gradle
//在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下: buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.0.3'
}
} //并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR, apply plugin: 'walle' //如果不需要通过walle获取渠道号 则不需要加
dependencies {compile 'com.meituan.android.walle:library:1.0.3'}
Walle信息配置
//在当前App的 build.gradle 中添加如下信息
walle {
// 指定渠道包的输出路径
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名称 ${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk
apkFileNameFormat = '${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel") }

配置项具体解释:
apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")

apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk'
可使用以下变量:

projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名

channelFile:包含渠道配置信息的文件路径,channel文件放在module的同级目录下。 具体内容格式详见:渠道配置文件示例,支持使用#号添加注释。

获取渠道

在需要获取渠道信息的地方使用如下代码获取渠道信息

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

通过读取<meta-data>来获取渠道号

    private void readMetaDataFromApplication() {
try {
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
String mTag = appInfo.metaData.getString("mTag"); Log.e(TAG, "mTag=" + mTag); } catch (NameNotFoundException e) {
e.printStackTrace();
}
}
打包

生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录

用法示例:

  • 生成渠道包 ./gradlew clean assembleReleaseChannels
  • 支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels
  • 生成单个渠道包 ./gradlew clean assembleReleaseChannels -PchannelList=google
  • 生成多个渠道包 ./gradlew clean assembleReleaseChannels -PchannelList=google,dianping
更多用法

github

作者:tse1y 链接:https://www.jianshu.com/p/572b59829a08 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
 

[转]安卓新一代多渠道打包工具Walle 解决渠道包V2签名问题的更多相关文章

  1. 多渠道打包工具Walle源码分析

    一.背景 首先了解多渠道打包工具Walle之前,我们需要先明确一个概念,什么是渠道包. 我们要知道在国内有无数大大小小的APP Store,每一个APP Store就是一个渠道.当我们把APP上传到A ...

  2. Android 新一代多渠道打包神器

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:李涛 ApkChannelPackage是一种快速多渠道打包工具,同时支持基于V1签名和V2签名进行多渠 ...

  3. 【腾讯Bugly干货分享】Android 新一代多渠道打包神器

    关于作者: 李涛,腾讯Android工程师,14年加入腾讯SNG增值产品部,期间主要负责手Q动漫.企鹅电竞等项目的功能开发和技术优化.业务时间喜欢折腾新技术,写一些技术文章,个人技术博客:www.lt ...

  4. Android多渠道打包工具

    http://www.cnblogs.com/huangtianhui/archive/2012/07/14/2591382.html 鉴于Android市场众多,基于各种利益考虑,以及未来app能够 ...

  5. Android 多渠道打包,上百渠道,秒打签名

    具体工具参见:https://github.com/hpu-spring87/MultiSignTools

  6. ”只用 1 分钟“ - 超简极速 Apk 签名 & 多渠道打包神器

    众所周知,渠道包作为当下国内 Android 应用市场常见的分发方式,当 APP 和后台交互或进行数据上报时,会带上各自的 channel 渠道信息,以此方便企业 & 开发者统计 APP 在各 ...

  7. android 7.0 多渠道打包 - 美团开源工具Walle 命令行打包

    在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,之前快速生成渠道包的方式(美团Android自动化之旅-生成渠道包)已经行不通了,对此美 ...

  8. 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!

    一.前言 Hi,大家好,我是承香墨影! 当我们需要发布一款 App 到应用市场的时候,一般需要我们针对不同的市场生产不同的渠道包,它们使用的是同一套代码,只是会包含一些各自的渠道信息,用于我们做数据分 ...

  9. Android 多渠道打包原理和使用

    每次中午吃饭总会和技术同学聊天.当做 iOS 开发的做安卓开发的人员在一起的时候,他们中间又多了一个话题:iOS 开发难还是安卓开发难. 这个时候做安卓开发的同学最激动说安卓开发要自己画界面.机型复杂 ...

随机推荐

  1. Linux环境下安装weblogic10.3.2

    附件:weblogic10.3.2版本zip包和部署war包提取地址: weblogic.zip:https://pan.baidu.com/s/1Y1tmAhlXsO5Q4zPvOKGG5g  提取 ...

  2. 值得 .NET 开发者了解的15个特性

    本文列举了 15 个值得了解的 C# 特性,旨在让 .NET 开发人员更好的使用 C# 语言进行开发工作. 1. ObsoleteAttribute ObsoleteAttribute 适用于除组件. ...

  3. python web开发-flask中response,cookies,session对象使用详解

    Response响应对象: 当一个web请求被服务器处理完后,会返回用户请求的响应,这时候就要用到响应对象,根据响应给用户的形式不同,响应对象有以下几种处理方式 如果返回的是一个合法的响应对象,它会从 ...

  4. The POM for ... is missing, no dependency information available

    今天在重温淘淘商城的项目,准备用idea重写次,换个bootstrap的前端框架,但是在用idea构建maven项目后编译时却报错了: 经再三确认,common工程自身并没有任何问题,引用这个工程的地 ...

  5. eclipse异常解决:Errors occurred during the build.........

    在MyEclipse下编辑文件保存时,编译java工程,出现以下弹出提示.每次保存都会弹出,不堪其扰. "Errors occurred during the build.......... ...

  6. poj-1045(数学不好怪我咯)

          Description Consider the AC circuit below. We will assume that the circuit is in steady-state. ...

  7. 关于Spring注解@Async引发其他注解失效

    概述 在前面一篇文章中,介绍,在一个Bean中注入自己,如果有@Async和@Transaction,如果使用@Autowire注入自身,会报循环依赖,如果使用BeanFactoryAware注入自己 ...

  8. 线程池的submit和execute方法区别

    线程池中的execute方法大家都不陌生,即开启线程执行池中的任务.还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果.下面简要介绍一下两者的三个 ...

  9. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  10. virtualbox主机与虚拟机之间互相通信教程

    前言 在使用虚拟机搭建集群时,需要实现虚拟机与虚拟机之间互相ping通,并且主机与虚拟机也可以互相ping通. 一.环境准备: 1.主机为win7 2.virtualbox下创建两台ubuntu虚拟机 ...