文档章节

Android使用Gradle进行多渠道打包统计

沐风storm
 沐风storm
发布于 2016/09/28 09:40
字数 770
阅读 15
收藏 0

有做Android App的同志们应该都知道渠道包是什么,得力于Android生态的多样性,我等写Android应用的人类每次发布App都需要面对数十个市场,而为了能够采集到市场的表现数据,就必须为每一个市场生成相应的apk包,也就是俗称的渠道包。

如此这般,如何更加便捷的生成渠道包就成了各显神通的地方。

友盟、酷传等第三方都有自动化工具来做,同行们也各自写了很多脚本,但我觉得似乎没必要那么复杂。Gradle本身就是一个构建工具,用它应该就能做到。一番研究之后发现果然是可以的,做出来效果也还算不错,再次跟大家分享一下。

基本原理是利用Gradle的 **manifest merger **功能,这个功能的主要用途是能够在运行时替换AndroidManifest.xml里面的内容,具体功能大家自行查看文档吧,这里就不赘述了。

我用的是友盟的统计,所以现在AndroidManifest.xml里面会有这么一段:

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

里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。

第一步 在AndroidManifest.xml里配置PlaceHolder

<meta-data
        android:name="UMENG_CHANNEL"
        android:value="${UMENG_CHANNEL_VALUE}" />

第二步 在模块的build.gradle文件的defaultConfig里加上PlaceHolder定义

android {
  ...

  defaultConfig {
    	...
    	manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
  }	
}

这里的作用有两个,一是声明 UMENG_CHANNEL_VALUE 是可替换值的PlaceHolder,二是为其设置默认值。

第三步 在模块的build.gradle文件里添加ProductFlavors配置


android {
  ...

  defaultConfig {
    ...
    manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
  }	
  productFlavors {
    default_channel{}
    wandoujia{}
    _360{}
    yingyongbao{}
    xiaomi{}
    baidu{}
    huawei{}
    jifeng{}
  }
  productFlavors.all { flavor ->
    flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
  }
}

所谓ProductFlavors其实就是可定义的产品特性,配合 manifest merger 使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。

上面这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。

第四步 一次生成所有渠道包

到工程目录下运行 gradlew assembleRelease 试试看吧。应该能看到这次编译一共产生了8个apk,分别对应在productFlavors段定义的8个渠道。

可以用 apktools 反编译每个apk,打开 AndroidManifest.xml 看看,就会发现友盟这一段的配置已经相应的被修改了。


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

如果只是想生成单个渠道的包呢?

打开AndroidStudio的Gradle tasks面板,会发现模块多了很多任务,如下图所示。

此时可以直接双击该任务生成对应的apk,也可以用命令行单独生成,比如

gradlew assembleWandoujiaRelease

好了,到此任务就完成了。当然,这个方式也是有缺陷的,有一些特定的渠道包不是仅仅修改 AndroidManifest.xml 就可以的,比如小米就要求app本身不能有自动更新功能,这需要改动代码,所以就无能为力了。

© 著作权归作者所有

沐风storm
粉丝 0
博文 10
码字总数 4795
作品 0
武汉
程序员
私信 提问
Android的多渠道打包|SquirrelNote

系列文章: Android的反编译和代码混淆 Android的打包签名 [Android的多渠道打包 前言 本篇包括以下内容: 多渠道打包概述 友盟的多渠道打包 美团的多渠道打包 360的多渠道打包 多渠道打包概...

跳动的松鼠
2017/11/21
0
0
Android多渠道打包相关介绍

一、多渠道打包概述 由于国内存在着有众多的应用市场,在不同的应用市场可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在...

Ruheng
2018/06/23
0
0
Android studio 使用心得(十)---android studio 多渠道打包(三)

关于使用android studio 如何打包 大家可以看这两篇文章 Android studio 使用心得(四)---android studio 多渠道打包 Android studio 使用心得(四)---android studio 多渠道打包(二) 真正的项...

veidy
2015/07/28
1K
0
Android Gradle 常用使用场景实现方式的总结

Gradle 作为一款灵活多变的构建插件,与 Android Studio 的结合,能够解决过去使用 Eclipse 开发 App 时所遇到的诸多问题。同时,基于 Groove 这样一款 DSL 语言的脚本特性,记住各种语法显然...

亦枫
2018/10/29
0
0
SimpleNews 项目的重构之旅(5) - Android Gradle 打包&混淆应用

应用场景 之前一直没有做 Android APK 发包管理,所以这次重构把这打包这部分考虑进去,之后可能会发布到一些应用市场。 要实现的功能 混淆代码 实现签名 过滤无用资源 生成 release 版本 AP...

無名小子的杂货铺
2017/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 你已经是个成熟的熊猫了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Sharon啊 :#今日歌曲推荐# 分享黑鸭子的单曲《羞答答的玫瑰静悄悄的开》 《羞答答的玫瑰静悄悄的开》- 黑鸭子 手机党少年们想听歌,请使劲儿...

小小编辑
今天
370
8
结合Spring Security进行web应用会话安全管理

在本文中,将为大家说明如何结合Spring Security 和Spring Session管理web应用的会话。 一、Spring Security创建使用session的方法 Spring Security提供4种方式精确的控制会话的创建: alwa...

fightinging
今天
6
0
83、Mybatis和Hibernate重要区别

Mybatis;入门简单,程序容易上手开发,节省开发成本。Mybatis需要程序猿自己编写sql语句,是一个不完全的ORM框架,对sql修改和优化非常容易实现。 Mybatis适合开发需求变更频繁的系统,比如...

lianbang_W
今天
8
0
设计模式之状态模式

定义 Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改...

陈年之后是青葱
今天
6
0
Python常用模块之os.path

os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32Type "copyright", "credits" or "lic......

松鼠大帝
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部