Gradle多渠道打包实例

版权声明:

本公众号发布的所有文章,均属于原创,版权归本公众号所有。

允许有条件转载,转载请附带底部二维码。

一、前言

在实际的工作中,当接手的App项目逐渐做大的时候,总有一些原因需要根据需求对项目做一些定制化的维护,例如:三方合作定制、海外版本之类的。但是通常这种方式定制,其大体的框架都是一样的,只是根据不同的需求点,做部分定制,

本文就这种定制的需求,利用Gradle做一个解决方案。

二、上古时代的做法

曾经,通用的做法是为不同的专版需求,切出一个git branch出来,然后在这个分支上根据需求,对功能进行定制。每次打包的时候,从这个分支切换代码进行打包、测试、发版。

但是这样存在一个根本上的问题,如果这种专版需求比较多的时候,对于开发而言,一个小小的改动,将它们手工同步到所有的专版分支上,将是一个噩梦。尤其是互联网公司,可能需求天天在变,就会从一个技术活变成一个体力活,并且人工修改,次数多了,难免会有错漏的时候,为了保证质量,同时也加重了测试的难度。

所以,这种方式现在已经是不可取的了。那么,有什么新的方式吗?

三、分清需求,再选方案

所有的技术选型,都要依据实际的业务。当框架的复杂度越高,维护起来就越吃力,所以最好的方案就是在现有的需求之上实现,并且保有可扩展的功能,使之在之后的迭代中,也同样可以胜任。其实就是选个平衡。

那么,如果对于专版需求而言,只是修改一些文案,各个页面的图片等等,这样的小改动,完全可以通过定制不同的productFlavors,然后根据名称,去新建对应名称的文件夹,然后替换主项目内,同名的资源文件即可。

实际操作起来,网上已经有大量的例子,并且也不是本文的主题,这里不再细说。有兴趣的可以自行查阅文档。

那么这种方案的缺陷是什么呢?

它只能简单的适应,在不同的专版之间,只是替换一下各项资源。如果有更复杂的定制功能,它是没法满足的,例如:不同的版本依赖不同的SDK。遇上这样的情况,会将所有专版需要的jar包、so等打在一起,这样无形中增大的apk安装包的体积。

四、不同专版,不同SDK如何解决?

如果遇上不同专版,需要接入不同的SDK去实现,这样的情况下,同样可以通过Gradle来处理这样的情况。

简单的思路:

在主项目之外,通过新建Module(Android Library)的方式,把不同专版间需要改动的地方抽取出来。然后将它们与主项目连接的地方抽象出来,做成接口去做交互。

也就是说,除了主项目Module之外,其他的每个专版作为一个Module存在在项目中,这样可以分别维护自己的定制逻辑,并且所有资源分开来配置,引用的包也是分开的,同事不会增加Apk安装包的体积。

五、举个例子

首先,需要把现有的项目拆分,那些功能是可以允许专版定制的,那些功能是共有的部分。

举个例子,一个视频播放的App,需要用户登录,进入之后,可以购买视频进行播放,那么这样一个App,简单的进行功能上的拆分,可以拆出如下的流程。

![Uploading gradle_module_444571.png . . .]
](http://upload-images.jianshu.io/upload_images/1420036-d528d13de8bfd97f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

从上图可以看出,除了视频播放这个功能是通用的,其他的逻辑都是需要在不同的专版之间做定制,可能购买就需要使用不同合作方的SDK等等。

把功能拆分出来之后,就可以开始着手干了,下面以一个简单的例子说明一下。

新建一个项目,并且在项目内再新建多个Module。记在,这里需要选择Android Library。这种类型的Module,可以编译成arr的包,就可以携带布局文件和so等资源。

gradle_module.png

用Android Library的方式,新建两个Module,分别表示国内版本(inland)和海外版本(overseas)。

构建好之后,在不同的Module下,分别设定同样一个Activity,完成之后,项目结构如下。

gradle_project.png

已经到这一步基本上完成了编码的工作,后面就需要配置主Module的build.gradle文件了。

gradle_gradle.png

主要需要配置的地方,已经红线标注出来了。

需要制定productFlavors,设定两个版本需要配置的基本信息。然后在dependencies中为不同的版本,做不同的引用,格式就是xxxCompile即可。

因为是个demo,在MainActivity只有一个简单的按钮,点击跳转到LoginActivity。而这里用dependencies制定了不同版本跳转的LoginActivity页面。到这里就可以直接使用了。

在AS的Build Variant窗口,选择需要运行的版本。就可以在手机上运行不同的版本进行调试。

gradle_buildVariant.png

这里只是简单的提供思路,具体Gradle每个字段表示什么意思。这个还是需要查看一下文档,每个版本的格式可能略有不同。

技术之外

这里的技术难点在于,如何将现有项目拆分,如何把拆分后的模块,用接口的形式抽象出来。

那么,在技术之外,还有什么难点?

  1. 需要和产品协调,共有逻辑尽量不要对专版进行单独定制。如果必要定制,只是简单替换资源图片。
  2. 需要和设计协调,在出设图的时候,对共有部分UI,不要有对专版的定制UI即可。

用多Module的方式重构了项目之后,核心的问题就是在于如何和多方协调不要在共有的部分进行定制,要么都改,要么就保持原样。

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

推荐阅读更多精彩内容