- 浏览: 28321 次
最新评论
美团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 1181https://stackoverflow.com/quest ... -
缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
2017-09-09 15:05 1026//缺少编译器要求的成员“ystem.Runtime.Com ... -
[转]帧同步和状态同步
2017-03-06 12:22 659转自:http://www.gameres.c ... -
非对称加密和数字证书原理
2017-03-01 17:34 584http://www.cnblogs.com/JeffreyS ... -
Unity模糊查找MonoBehaviour
2016-11-23 17:32 1180using System; using System.Co ... -
Unity问题备份
2016-10-09 11:19 7391. Could not find file " ... -
链接-Unity Assetbundle使用填坑
2016-09-08 11:53 651http://www.cnblogs.com/ybgame/p ... -
协程执行顺序测试备份
2016-09-01 18:28 492using UnityEngine;using Syste ... -
[转]简单粗暴的so加解密实现
2016-08-12 17:03 822http://bbs.pediy.com/showthread ... -
[转]android解决apk编译方法数超过64k的问题
2016-08-05 20:59 506如果你是一个android开发者,你至少听说过的Dalvik的 ... -
svn 413 Entity too large
2016-06-29 20:58 775在apache配置conf文件中添加 LimitXMLRequ ... -
IPv4 regex
2016-06-07 12:12 452private static Regex ipv4Reg = ... -
[转]unity3d使用winphone平台的问题
2016-05-25 12:18 509最近在移植u3d的游戏到WindowsPhone8上,Wind ... -
[转]Deep link是什么
2016-05-23 12:06 702http://www.open-open.com/lib/vi ... -
苹果和google play审核时注意的问题
2016-05-16 15:18 755苹果测试沙盒充值不能用越狱手机来测 google play测试 ... -
C# MSDN地址备忘
2016-05-14 19:20 476https://msdn.microsoft.com/zh-c ... -
Windows API错误码
2016-05-14 19:19 361https://msdn.microsoft.com/en-u ... -
java 坑收集
2016-05-06 20:15 3541. Strng.getBytes() 一定要指明用的是什么编 ... -
[转]iphone不越狱抓包
2016-04-27 20:42 993Remote Virtual Interface 在iOS ... -
[转]C#程序员容易犯的10个错误
2016-04-25 16:04 373http://www.oschina.net/translat ...
相关推荐
"gradle_manifestPlaceholders实现多渠道打包.rar"示例展示了如何通过Gradle的`manifestPlaceholders`特性来修改`AndroidManifest.xml`中的内容,以适应不同渠道的需求。这种方法适用于渠道标识需要写入`...
本主题将深入探讨如何使用Android Studio和Gradle进行多渠道打包以及处理外部库依赖。 **一、多渠道打包** 多渠道打包是Android应用发布时的一个常见需求,它允许我们为不同的市场或推广渠道创建定制的应用版本。...
然后,我们可以创建一个自定义的Gradle任务,用于生成不同渠道的APK。这可以通过扩展`DefaultTask`并利用`Copy`任务来完成。例如: ```groovy task multiBuild(type: DefaultTask) { doLast { channels.each { ...
这个项目已经配置好Gradle,包含了不同渠道的资源和构建设置。通过查看和运行该项目,你可以直观地了解多渠道打包的工作原理和配置方式。 总结,Eclipse结合Gradle进行多渠道打包是一个高效且灵活的方法。通过定义...
为了简化多渠道打包流程,可以在Gradle脚本中编写自动化任务,例如动态生成渠道文件,批量修改`build.gradle`以添加新的渠道,或者生成包含所有渠道的APK的ZIP文件。 6. **打包过程** 执行`gradle assemble`命令...
这样,每个渠道包的`strings.xml`文件中都会有一个名为`service_url`的字符串资源,其值对应于渠道名。 四、生成APK 配置完成后,只需运行Gradle构建,即可生成对应渠道的APK。在命令行中,你可以使用以下命令指定...
总结起来,Android Gradle多渠道打包通过产品风味(product flavors)和资源文件的配合,实现了为不同渠道定制APK的功能。开发者可以根据需要灵活配置,以满足各种场景下的打包需求。在实际项目中,应结合团队的实际...
总结,Android Studio结合Gradle的多渠道打包功能为开发者提供了灵活的分发策略,可以根据市场需求快速定制不同渠道的APK。理解并熟练掌握这一技术,对于提高开发效率和精细化运营具有重要意义。通过合理配置和自动...
在Android开发中,经常需要为不同的市场或者客户创建定制化的应用程序包(APK),这通常被称为多渠道打包。Gradle,作为Android Studio的默认构建工具,提供了强大的灵活性来实现这一需求。本文将深入探讨如何使用...
Gradle 是 Android 的构建工具,通过 Gradle 可以实现自动打所有渠道包。实现多渠道打包的步骤如下: 1. 在 AndroidManifest.xml 中设置,用于设置友盟 Appkey 和渠道号。 2. 在 build.gradle 文件中添加 default...
在Android平台上,为了实现应用的分发和管理,开发者常常需要为不同的渠道(如Google Play、华为应用市场等)制作专属的渠道包。本教程将详细讲解如何在Unity3D中进行Android渠道包的批量构建,以便实现一键打包,...
通过在`build.gradle`中定义产品风味(product flavors),可以创建多个不同的APK,每个对应一个渠道。例如: ``` productFlavors { googlePlay { versionCode defaultConfig.versionCode + 100 } ...
描述中提到的"gradle-4.3.1-all.zip 离线包下载.zip"表明这是一份离线安装包,适用于那些无法或不想通过官方渠道在线下载,或者网络环境不佳的用户。离线包包含了Gradle运行所需的所有组件,包括JVM(Java Virtual ...
总的来说,Android自动化批量打渠道包是通过配置构建系统(如Gradle或Ant)来实现的,它允许开发者定义多渠道,然后通过脚本或命令行一次性完成所有渠道的打包,极大地提高了工作效率,减少了手动操作的错误。...
本文将详细讲解如何使用Gradle进行Android应用打包,并重点介绍如何实现外部导入签名文件、多渠道打包以及导入Ant脚本这三大核心知识点。 1. 外部导入签名文件: 在发布Android应用时,为了确保应用的安全性和完整...
在给定的压缩包"gradle-6.1.zip"中,包含的是Gradle 6.1版本的离线安装包,对于那些无法通过官方渠道快速下载或者网络环境不佳的用户来说非常方便。 Gradle 6.1 是 Gradle 的一个重要版本,它引入了一些关键改进...
手动创建这些渠道包既耗时又容易出错。Python作为一个强大的脚本语言,可以有效地自动化这个过程。下面我们将深入探讨如何使用Python批量创建Android渠道包。 首先,我们需要理解Android的构建系统。Android Studio...
渠道包允许开发者为不同的分发渠道定制apk,比如应用市场、广告联盟或者线下合作等,每个渠道包都有唯一的标识符,便于追踪安装来源。本教程将详细解释如何快速生成1000个渠道包,只需1分钟。 1. **理解渠道包**: ...
现在,我们已经了解了如何通过Gradle配置实现多渠道打包,替换资源文件、logo、包名和项目名。在实际开发中,还可以结合自动化脚本(如Python或Shell)处理渠道参数,以便快速生成大量定制的apk。 最后,提供的...
在描述中提到的 "gradle-5.6.4-all.zip 离线包下载.zip" 是一个包含Gradle 5.6.4完整版本的压缩文件,主要适用于那些无法或不便通过官方渠道在线下载的用户。这可能是由于网络连接问题或者希望快速获取特定版本的...