- 浏览: 25770 次
最新评论
美团Android自动化之旅—适配渠道包
zhihu ·2014-09-01 16:06
概述
前一篇文章(美团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;
@override
public void onCreate(Bundle savedInstanceState) {
try {
Class.forName("com.qihoo360.union.sdk.UnionManager");
useQihuSdk = true;
} catch (ClassNotFoundException ignored) {
}
}
}
最后,运行gradle assembleQihu360命令即可生成包含360精品应用模块的渠道包了。
总结
适配是一项dirty工作,尤其是适配的渠道比较多的时候。上面介绍了几种使用Gradle flavor进行适配的例子,基本解决了繁杂的适配工作。
zhihu ·2014-09-01 16:06
概述
前一篇文章(美团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;
@override
public void onCreate(Bundle savedInstanceState) {
try {
Class.forName("com.qihoo360.union.sdk.UnionManager");
useQihuSdk = true;
} catch (ClassNotFoundException ignored) {
}
}
}
最后,运行gradle assembleQihu360命令即可生成包含360精品应用模块的渠道包了。
总结
适配是一项dirty工作,尤其是适配的渠道比较多的时候。上面介绍了几种使用Gradle flavor进行适配的例子,基本解决了繁杂的适配工作。
发表评论
-
Xcode9解决exportArchive: requires a provisioning profile
2017-09-23 15:15 994https://stackoverflow.com/quest ... -
缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
2017-09-09 15:05 830//缺少编译器要求的成员“ystem.Runtime.Com ... -
[转]帧同步和状态同步
2017-03-06 12:22 598转自:http://www.gameres.c ... -
非对称加密和数字证书原理
2017-03-01 17:34 449http://www.cnblogs.com/JeffreyS ... -
Unity模糊查找MonoBehaviour
2016-11-23 17:32 1053using System; using System.Co ... -
Unity问题备份
2016-10-09 11:19 6101. Could not find file " ... -
链接-Unity Assetbundle使用填坑
2016-09-08 11:53 537http://www.cnblogs.com/ybgame/p ... -
协程执行顺序测试备份
2016-09-01 18:28 442using UnityEngine;using Syste ... -
[转]简单粗暴的so加解密实现
2016-08-12 17:03 743http://bbs.pediy.com/showthread ... -
[转]android解决apk编译方法数超过64k的问题
2016-08-05 20:59 459如果你是一个android开发者,你至少听说过的Dalvik的 ... -
svn 413 Entity too large
2016-06-29 20:58 680在apache配置conf文件中添加 LimitXMLRequ ... -
IPv4 regex
2016-06-07 12:12 381private static Regex ipv4Reg = ... -
[转]unity3d使用winphone平台的问题
2016-05-25 12:18 414最近在移植u3d的游戏到WindowsPhone8上,Wind ... -
[转]Deep link是什么
2016-05-23 12:06 622http://www.open-open.com/lib/vi ... -
苹果和google play审核时注意的问题
2016-05-16 15:18 696苹果测试沙盒充值不能用越狱手机来测 google play测试 ... -
C# MSDN地址备忘
2016-05-14 19:20 421https://msdn.microsoft.com/zh-c ... -
Windows API错误码
2016-05-14 19:19 293https://msdn.microsoft.com/en-u ... -
java 坑收集
2016-05-06 20:15 3121. Strng.getBytes() 一定要指明用的是什么编 ... -
[转]iphone不越狱抓包
2016-04-27 20:42 941Remote Virtual Interface 在iOS ... -
[转]C#程序员容易犯的10个错误
2016-04-25 16:04 293http://www.oschina.net/translat ...
相关推荐
gradle多渠道打包的两种实现demo
androidstudio工程已经实现从外部读取渠道号批量打包 外部library依赖
Gradle多渠道打包完整代码,下载即用,只需添加你需要的平台,更改你所需的配置即可!
Eclipse下用Gradle多渠道打包简单Demo,有部分备注。本人亲测成功后上传的,希望大家相互学习!
android gradle多渠道打包
Gradle多渠道打包完整代码,下载即用,只需添加你需要的平台,更改你所需的配置即可!
通过打包的不同自动更换服务地址,能够更好地避免在上线时去手动切换到线上的服务地址,完全自动替换,一次编写终身受益。
AndroidStudio--gradle多渠道打包示例
博客 Android Studio使用Gradle实现自动打包,签名,自定义apk文件名,多渠道打包,集成系统签名证书【附效果图附源码】 使用的资源,详细介绍请查看本人博客
1.gradle基本介绍 2.gradle构建一个java项目 3.gradle构建一个Android项目与编译打包. 4.gradle的多渠道打包 5.gradle依赖管理 ......................
单独打包小米应用市场渠道的debug和release版本项目介绍2017-07-25 10:10Notes:Gradle定制三种不同环境(生产环境、测试环境、开发环境)。切换不同的Build Variants实现。测试/开发环境Apk与生成环境Apk可以同时安装...
什么是多渠道打包以及多渠道打包可以做什么,这里就不做介绍了,相信看到这篇文章的你已经了解了,多渠道打包的方式比较多,这里我们用Gradle多渠道打包方式。 和其他文章有什么不同 网上看到的大多数文章都只讲解了...
GradleDemo 这个是我的blog上讲解gradle多渠道打包的demo源码 文章地址
gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
渠道包数量很多(如100个以上),对打包速度有要求的建议使用新版极速打包工具 Packer-Ng,100个渠道包只需10秒。 最新版本 2014.12.20 发布1.0.0版,支持渠道打包和版本号自增等功能 2014.12.24 发布1.0.1版,...
主要介绍了使用Android Studio Gradle实现友盟多渠道打包,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻辑,这就需要根据渠道使用选择差异化代码。 这里把简单的代码记一下。 首先,分渠道打包很简单。 在项目的build.gradle里...
Gradle多渠道打包(动态设定App名称,应用图标,背景图片,状态栏颜色.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
packer-ng-plugin是下一代Android渠道打包工具Gradle插件,支持极速打包,**100**个渠道包只需要**10**秒钟,速度是 [**gradle-packer-plugin**](https://github.com/mcxiaoke/gradle-packer-plugin) 的**300**倍...
对Android studio Gradle常用功能的演示,并用代码验证打包和配置是否一致