Android多渠道打包相关介绍

一、多渠道打包概述

由于国内存在着有众多的应用市场,在不同的应用市场可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的各种效果。

因此,每当发新版本时,市场会提供一个渠道列表,Android RD会根据这些渠道相应地生成等量的渠道包。随着渠道越来越多,为了提高渠道打包的效率,因此催生了对多渠道打包的方式的研究。

本篇文章主要总结一下多渠道打包的相关知识以及美团的新旧两种多渠道打包方案。

二、渠道包生成

Maven方式: 每打一个包都要执行一遍构建过程,效率太低;

apktool: 虽然不需要重新构建,但对每个包都要重新签名;

随着渠道包的增多,每次打包动辄几个小时,以上两种方式的效率太低。

关于这两种打包方式详见:美团Android自动化之旅—生成渠道包

META-INF添加空文件

这是美团为了提高打包效率而提出的一种新的多渠道打包方式,不需要重新构建,也不需要重新签名。

介绍

通过解压apk,根目录下会有一个META-INF目录,在该目录下添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。

具体步骤

  • 利用python代码用来给apk添加空的渠道文件

  • 在Java代码中读取空渠道文件名,识别渠道

具体代码在上面美团生成多渠道包的链接中有详细给出。

Walle

Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器

瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。

原理介绍

Android 7.0(Nougat)引入一项新的应用签名方案APK Signature Scheme v2,它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未授权APK文件的更改提供更多保护,在默认情况下,Android Gradle 2.2.0插件会使用APK Signature Scheme v2和传统签名方案来签署你的应用。

新应用签名方案的签名信息会被保存在区块(APK Signing Block)中, 而区块(Contents of ZIP entries)、区块(ZIP Central Directory)、区块(ZIP End of Central Directory)是受保护的,在签名后任何对其的修改都逃不过新的应用签名方案的检查。

之前的渠道包生成方案是通过在META-INF目录下添加空文件的打包方式在Signature Scheme v2的签名方式下不可使用了,因为META-INF已经被列入了保护区了,向META-INF添加空文件的方案会对上面受保护的三个区块都有影响。

通过上面描述发现区块(APK Signing Block)是不受签名校验规则保护的,因此Walle正是通过在该区块做文章,写入渠道信息。

具体步骤

  • 对新的应用签名方案生成的APK包中区块(APK Signing Block)写入渠道信息,并保存在APK中

  • APK在安装过程中进行的签名校验,是忽略我们添加的渠道信息的,这样就能正常安装了

  • 在App运行阶段,可以通过ZIP的End of central directoryCentral directory等结构中的信息找到我们自己添加的渠道信息,从而实现获取渠道信息的功能

最终,每打一个渠道包只需复制一个APK,然后在APK中添加一个渠道信息即可,这种打包方式速度非常快。

使用方式

  • Gradle插件方式,方便快速集成

  • 命令行方式,最大化满足各种自定义需求

关于Walle两种使用方式的详细步骤,参见:Android使用walle多渠道打包

三、渠道包适配

上述多渠道打包方式解决了打包慢的问题,但是随着渠道越来越多,不同渠道对应用的要求也不尽相同。

例如,有的渠道要求app的应用名不同,有些渠道要求应用不能使用第三方统计工具,有些渠道要求应用不能自动更新。

之前的做法是为每个需要适配的渠道创建一个Git分支,发版时再切换到相应的分支,并合并主分支的代码。适配的渠道比较少的话这种方式还可以接受,随着适配渠道的增多,这种方式就变得不可取。

幸好Gradle flavor,可以满足渠道适配的需求,只需要通过配置Gradle即可以实现多渠道的适配工作,省心省力。

Flavor

先来看build.gradle文件中的一段代码:

android {
    ....

    productFlavors {
        flavor1 {
            minSdkVersion 14
        }
    }
}

上例定义了一个flavorflavor1,并指定了应用的minSdkVersion为14(当然还可以配置更多的属性,具体可参考相关文档)。与此同时,Gradle还会为该flavor关联对应的sourceSet,默认位置为src/<flavorName>目录,对应到本例就是src/flavor1

接下来,要做的就是根据具体的需求在build.gradle文件中配置flavor,并添加必要的代码和资源文件。以flavor1为例,运行gradle assembleFlavor1命令既可生成所需的适配包。通过适配不同的flavor即可以生成不同的渠道包,但该方式生成渠道包的方式需要重复编译构建。

具体示例

使用不同的包名

productFlavors {
    qq {
        applicationId "com.hello.group.qq"
    }
}

面的代码添加了一个名为qq的flavor,并指定了应用的包名为com.hello.group.qq,运行gradle assembleqq命令即可生成qq适配包。

使用不同的应用名

Gradle在构建应用时,会优先使用flavor所属sourceSet中的同名资源。所以,解决思路就是在flavorsourceSet中添加同名的字符串资源,以覆盖默认的资源。

首先,在build.gradle配置文件中添加如下flavor:

android {
    productFlavors {
        wandoujia { 
        }
    }
}

上面的配置会默认src/wandoujia目录为wandoujia flavor的sourceSet

接下来,在src目录内创建wandoujia目录,并添加如下应用名字符串资源(src/wandoujia/res/values/appname.xml):

<resources>
    <string name="app_name">wandoujia_app</string>
</resources>

默认的应用名字符串资源如下(src/main/res/values/strings.xml):

<resources>
    <string name="app_name">origin_app</string>
</resources>

最后,运行gradle assembleWandoujia命令即可生成应用名为wandoujia_app的应用了。

wandoujia包下不使用strings.xml 名是因为会出现文件重复,默认的main 文件夹里存在的文件在其他适配目录中不允许出现相同文件名的文件。

更多flavor适配示例,参见:美团Android自动化之旅—适配渠道包

以上就是最近了解关于多渠道打包的相关知识的总结。

想要实现更多自定义适配多渠道包的需求,还要更多的了解Gradle相关知识。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 关于作者: 李涛,腾讯Android工程师,14年加入腾讯SNG增值产品部,期间主要负责手Q动漫、企鹅电竞等项目的...
    稻草人_3e17阅读 3,510评论 0 10
  • 目录一、Python打包及优化(美团多渠道打包)二、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君阅读 5,622评论 4 17
  • 最近在项目中遇到需要实现 Apk 多渠道、定制化打包, Google 、百度查找了一些资料,成功实现了上述功能,在...
    看一季残花落幕阅读 2,404评论 1 8
  • 简要的力量指的是如何用尽可能精简的语言包含尽可能多的信息。 在听黄执中的语言技巧分享的时候有这么一个例子特别深刻:...
    白色的1阅读 306评论 1 1
  • 1、 数字化思维模式 将原本只是在人的思维空间中进行的思维过程,通过数字化的软件合成,借助计算机而达到可视化的效果...
    你猜_42e0阅读 167评论 0 0