美团Android自动化之旅—适配渠道包

概述

前一篇文章(美团Android自动化之旅—生成渠道包)介绍了Android中几种生成渠道包的方式,基本解决了打包慢的问题。

但是,随着渠道越来越多,不同渠道对应用的要求也不尽相同。例如,有的渠道要求美团客户端的应用名为美团,有的渠道要求应用名为美团团购。又比如,有些渠道要求应用不能使用第三方统计工具(如flurry)。总之,每次打包都需要对这些渠道进行适配。

之前的做法是为每个需要适配的渠道创建一个Git分支,发版时再切换到相应的分支,并合并主分支的代码。适配的渠道比较少的话这种方式还可以接受,如果分支比较多,对开发人员来说简直就是噩梦。还好,自从有了Gradle flavor,一切都变得简单了。本文假定读者使用过Gradle,如果还不了解建议先阅读相关文档。

Flavor

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

android {....productFlavors {flavor1 {minSdkVersion 14}}
}

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

接下来,要做的就是根据具体的需求在build.gradle文件中配置flavor,并添加必要的代码和资源文件。以flavor1为例,运行gradle assembleFlavor1命令既可生成所需的适配包。下面主要介绍美团团购Android客户端的一些适配案例。

案例

使用不同的包名

美团团购Android客户端之前有两个版本:手机版(com.meituan.group)和hd版(com.meituan.group.hd),两个版本使用了不同的代码。目前hd版对应的代码已不再维护,希望能直接使用手机版的代码。解决该问题可以有多种方法,不过使用flavor相对比较简单,示例如下:

productFlavors {hd {applicationId "com.meituan.group.hd"}
}

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

控制是否自动更新

美团团购Android客户端在启动时会默认检查客户端是否有更新,如果有更新就会提示用户下载。但是有些渠道和应用市场不允许这种默认行为,所以在适配这些渠道时需要禁止自动更新功能。

解决的思路是提供一个配置字段,应用启动的时候检查该字段的值以决定是否开启自动更新功能。使用flavor可以完美的解决这类问题。

Gradle会在generateSources阶段为flavor生成一个BuildConfig.java文件。BuildConfig类默认提供了一些常量字段,比如应用的版本名(VERSION_NAME),应用的包名(PACKAGE_NAME)等。更强大的是,开发者还可以添加自定义的一些字段。下面的示例假设wandoujia市场默认禁止自动更新功能:

android {defaultConfig {buildConfigField "boolean", "AUTO_UPDATES", "true"}productFlavors {wandoujia {buildConfigField "boolean", "AUTO_UPDATES", "false"}		}}

上面的代码会在BuildConfig类中生成AUTO_UPDATES布尔常量,默认值为true,在使用wandoujia flavor时,该值会被设置成false。接下来就可以在代码中使用AUTO_UPDATES常量来判断是否开启自动更新功能了。最后,运行gradle assembleWandoujia命令即可生成默认不开启自动升级功能的渠道包,是不是很简单。

使用不同的应用名

最常见的一类适配是修改应用的资源。例如,美团团购Android客户端的应用名是美团,但有的渠道需要把应用名修改为美团团购;还有,客户端经常会和一些应用分发市场合作,需要在应用的启动界面中加上第三方市场的Logo,类似这类适配形式还有很多。 Gradle在构建应用时,会优先使用flavor所属dataSet中的同名资源。所以,解决思路就是在flavor的dataSet中添加同名的字符串资源,以覆盖默认的资源。下面以适配wandoujia渠道的应用名为美团团购为例进行介绍。

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

android {productFlavors {wandoujia { }}
}

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

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

<resources><string name="app_name">美团团购</string>
</resources>

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

<resources><string name="app_name">美团</string>
</resources>

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

使用第三方SDK

某些渠道会要求客户端嵌入第三方SDK来满足特定的适配需求。比如360应用市场要求美团团购Android客户端的精品应用模块使用他们提供的SDK。问题的难点在于如何只为特定的渠道添加SDK,其他渠道不引入该SDK。使用flavor可以很好的解决这个问题,下面以为qihu360 flavor引入com.qihoo360.union.sdk:union:1.0 SDK为例进行说明:

android {productFlavors {qihu360 {}}
}
...
dependencies {provided 'com.qihoo360.union.sdk:union:1.0'qihu360Compile 'com.qihoo360.union.sdk:union:1.0'
}

上例添加了名为qihu360的flavor,并且指定编译和运行时都依赖com.qihoo360.union.sdk:union:1.0。而其他渠道只是在构建的时候依赖该SDK,打包的时候并不会添加它。

接下来,需要在代码中使用反射技术判断应用程序是否添加了该SDK,从而决定是否要显示360 SDK提供的精品应用。部分代码如下:

class MyActivity extends Activity {private boolean useQihuSdk;@overridepublic void onCreate(Bundle savedInstanceState) {try {Class.forName("com.qihoo360.union.sdk.UnionManager");useQihuSdk = true;} catch (ClassNotFoundException ignored) {}}
}

最后,运行gradle assembleQihu360命令即可生成包含360精品应用模块的渠道包了。

总结

适配是一项dirty工作,尤其是适配的渠道比较多的时候。上面介绍了几种使用Gradle flavor进行适配的例子,基本解决了繁杂的适配工作。

参考资料

  • http://www.gradle.org/
  • Product flavors

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文浅尝 - CIKM2021 | DT-GCN: 一种双曲空间中的数据类型感知的知识图谱表示学习模型...

论文作者&#xff1a;申雨鑫&#xff0c;天津大学硕士发表会议&#xff1a;CIKM 2021链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3459637.3482421动机知识图谱表示学习旨在将实体和关系编码到一个连续的低维向量空间中。大多数现有方法主要在欧氏空间中学习结构三元组…

NLP太难学了!?吃透NLP的方法来拿走

最近有粉丝私信我&#xff0c;NLP很难学&#xff0c;这条路能坚持走吗&#xff1f;有相同困惑的朋友可以一起探讨一下&#xff1a;大佬你好&#xff0c;我目前从事ERP运维工作&#xff0c;想转行NLP&#xff0c;开始是学数据结构和c刷了些leetcode题&#xff0c;然后把cs224n和…

LeetCode 1161. 最大层内元素和(层序遍历)

1. 题目 给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层&#xff0c;而根节点的子节点位于第 2 层&#xff0c;依此类推。 请你找出层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个。 示例&#xff1…

图谱实战 | 京东商品图谱构建与实体对齐

转载公众号 | DataFunTalk 分享嘉宾&#xff1a;赵学敏博士 京东科技编辑整理&#xff1a;蔡丽萍 TRS出品平台&#xff1a;DataFunTalk导读&#xff1a;在电商企业采购和运营过程中&#xff0c;如果要想掌握商品的实时价格等行情信息&#xff0c;就需要对齐各个电商网站的商品…

Quartz应用与集群原理分析

一、问题背景 美团CRM系统中每天有大量的后台任务需要调度执行&#xff0c;如构建索引、统计报表、周期同步数据等等&#xff0c;要求任务调度系统具备高可用性、负载均衡特性&#xff0c;可以管理并监控任务的执行流程&#xff0c;以保证任务的正确执行。 二、历史方案 美团CR…

卖萌屋新闻联播栏目,倾情上线~

编 | 小轶感谢提供本期内容的 iven、ZenMoore、 jxyxiangyu、付瑶今天这篇推文是卖萌屋全新的原创系列———暂且取名为“卖萌屋新闻联播”节目。卖萌屋的作者、小编日常都会在团队群里分享各种最新发现的实用资源、有意思的学术工作。小伙伴们在互相分享的过程中都受益匪浅。我…

LeetCode 386. 字典序排数(DFS循环)

1. 题目 给定一个整数 n, 返回从 1 到 n 的字典顺序。 例如&#xff0c; 给定 n 1 3&#xff0c;返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。 请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。来源&#xff1a;力扣&#xff08;LeetCode&#…

论文浅尝 | 基于多模态特征的视觉实体链接

转载公众号 | 数据智能英文刊文章题目&#xff1a;Visual Entity Linking via Multi-modal Learning作者&#xff1a;郑秋硕&#xff0c;闻浩&#xff0c;王萌&#xff0c;漆桂林引用&#xff1a;Zheng, Q.S., et al.: Visual Entity Linking via Multi-modal Learning. Data I…

一训练就显存爆炸?Facebook 推出 8 比特优化器,两行代码拯救你的显存!

文 | jxyxiangyu编 | 小轶“小夕&#xff0c;小夕&#xff01;又出来了个 SOTA 模型&#xff01;赶紧 follow &#xff01;”小夕看了看新模型的参数量&#xff0c; 然后看了看实验室服务器的几张小破卡。小夕&#xff0c;陷入了沉默。自从人们发现越大的模型性能越好后&#x…

论文浅尝 | 基于正交普鲁克分析的高效知识图嵌入学习

笔记整理&#xff1a;朱渝珊&#xff0c;浙江大学在读博士&#xff0c;研究方向为快速知识图谱的表示学习&#xff0c;多模态知识图谱。1.Motivation知识图谱是许多NLP任务和下游应用的核心&#xff0c;如问答、对话代理、搜索引擎和推荐系统。知识图中存储的事实总是以元组的形…

LeetCode 979. 在二叉树中分配硬币(DFS)

文章目录1. 题目2. DFS 解题1. 题目 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应有 node.val 枚硬币&#xff0c;并且总共有 N 枚硬币。 在一次移动中&#xff0c;我们可以选择两个相邻的结点&#xff0c;然后将一枚硬币从其中一个结点移动…

有福利! 好书推荐:从《实用推荐系统》学习寻找用户行为之法

大多数关于推荐系统的图书都讲述了算法及其优化方法。这些书都认为你已经有了一个大的数据集来供算法使用。数据集不会像变魔术那样凭空出现。要想收集到正确的用户偏好数据&#xff0c;就需要投入精力和进行思考。它会成就你的系统&#xff0c;或者搞砸你的系统。“垃圾进&…

灵活强大的构建系统Gradle

前言 构建&#xff0c;软件生命周期中重要的一环&#xff0c;在现代软件开发过程中&#xff0c;起着越来越重要的作用。过去在Java或类Java的世界里&#xff0c;Ant、Maven再熟悉不过了&#xff0c;Maven凭借其强大的依赖配置战胜Ant&#xff0c;基本上成为了Java构建的标准。而…

LeetCode 791. 自定义字符串排序(map)

1. 题目 字符串S和 T 只包含小写字符。在S中&#xff0c;所有字符只会出现一次。 S 已经根据某种规则进行了排序。我们要根据S中的字符顺序对T进行排序。更具体地说&#xff0c;如果S中x在y之前出现&#xff0c;那么返回的字符串中x也应出现在y之前。 返回任意一种符合条件的…

6万字解决算法面试中的深度学习基础问题

文 | 清卢雨源 | 对白的算法屋前言真的是千呼万唤始出来emmmm&#xff0c;去年春招结束写了篇面试的经验分享。在文中提到和小伙伴整理了算法岗面试时遇到的常见知识点及回答&#xff0c;本想着授人以渔&#xff0c;但没想到大家都看上了我家的 &#xff01;但因本人执行力不足…

OpenKG开源系列 | 海洋鱼类百科知识图谱(浙江大学)

OpenKG地址&#xff1a;http://openkg.cn/dataset/ocean开放许可协议&#xff1a;CC BY-SA 4.0贡献者&#xff1a;浙江大学&#xff08;徐雅静、邓鸿杰、唐坤、郑国轴&#xff09;1、背景海洋是生命的摇篮,是人类文明的重要发祥地,在人类社会发展的进程中起着举足轻重的作用。海…

Presto实现原理和美团的使用实践

Facebook的数据仓库存储在少量大型Hadoop/HDFS集群。Hive是Facebook在几年前专为Hadoop打造的一款数据仓库工具。在以前&#xff0c;Facebook的科学家和分析师一直依靠Hive来做数据分析。但Hive使用MapReduce作为底层计算框架&#xff0c;是专为批处理设计的。但随着数据越来越…

图谱实战 | 徐美兰:深度应用驱动的医学知识图谱构建

转载公众号 | DataFunSummit分享嘉宾&#xff1a;徐美兰 浙江数字医疗卫生技术研究院 数字医学知识中心主任编辑整理&#xff1a;李杰 京东出品平台&#xff1a;DataFunTalk导读&#xff1a;数研院这些年在知识图谱建设上取得了丰硕成果&#xff0c;今天我们将图谱构建过程中的…

6 年大厂面试官,谈谈我对算法岗面试的一些看法

文 | 不敢透露姓名的 Severus 和小轶面试官坐在那撇着大嘴的&#xff0c;“咳&#xff0c;给你一机会&#xff0c;最短的时间内让我记住你。”这个我会&#xff0c;我抡圆了“啪&#xff01;”&#xff0c;扭头我就走。我刚到家&#xff0c;录取通知书就来了&#xff0c;请你务…

美团Android自动化之旅—生成渠道包

每当发新版本时&#xff0c;美团团购Android客户端会被分发到各个应用市场&#xff0c;比如豌豆荚&#xff0c;360手机助手等。为了统计这些市场的效果&#xff08;活跃数&#xff0c;下单数等&#xff09;&#xff0c;需要有一种方法来唯一标识它们。 团购客户端目前通过渠道号…