android studio gradle多渠道打包,Android Studio使用gradle进行多渠道打包

其使用的基本原理是Gradle的 manifest merger 功能,这个功能的主要用途是能够在运行时替换AndroidManifest.xml里面的内容,由于使用不同的渠道(或者第三方发布市场),从而在AndroidManifest.xml写上不同的渠道ID,而避免重复多余的工作,统一在gradle写.如在AndroidManifest.xml可能要写上以下代码:

android:name="TD_APP_ID"

android:value="C3FE75F5BE72B521C04C55B62E4E5D19" />

android:name="TD_CHANNEL_ID"

android:value="${CHANNEL_NAME}" />

android:name="com.amap.api.v2.apikey"

android:value="dcc98525f96d4cd62f5d3006e7fea013" />

android:name="channelname"

android:value="${CHANNEL_NAME}" />

android:name="channelid"

android:value="${CHANNEL_ID}" />

那么针对 android:value的值我们可以在gradle这样写:

android{

.........

defaultConfig{

.........

manifestPlaceholders = [ CHANNEL_NAME : "官网", CHANNEL_ID : "l79000i4:ts5x38dl:kxi542in:l79000hu"]

}

}

manifestPlaceholders里的值可以有多个用","隔开, 上文提到的android:value的值就是在manifestPlaceholders 定义的值,相当于自定义了一个类型.

然后使用productFlavors打出各个渠道的包:

android{

..........

productFlavors.all { flavor ->

flavor.manifestPlaceholders = [CHANNEL_NAME: name]

}

productFlavors {

home {

manifestPlaceholders = [CHANNEL_NAME: "官网", CHANNEL_ID: "l79000i4:ts5x38dl:kxi542in:l79000hu"]

}

samsung {

manifestPlaceholders = [CHANNEL_NAME: "三星应用市场", CHANNEL_ID: "moi000qp:al80ssgp:kxi542in:moi000qj"]

}

oppo {

manifestPlaceholders = [CHANNEL_NAME: "OPPO可可应用市场", CHANNEL_ID: "moi000qq:al80ssgp:kxi542in:moi000qk"]

}

meizu {

manifestPlaceholders = [CHANNEL_NAME: "魅族flyme应用商店", CHANNEL_ID: "moi000qr:al80ssgp:kxi542in:moi000ql"]

}

}

}

productFlavors.all中的写法表明了各个渠道的CHANNEL_NAME所对应的值是productFlavors 里面的子项的名字,如三星的samsung 也可以这样写:

productFlavors {

wandoujia {}

baidu {}

c360 {}

uc {}

productFlavors.all { flavor ->

flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]

}

}

productFlavors.all其实是可以不用写的,只不过上文的写法使用汉字标明了各个渠道的意思,一目了然.而且各个渠道除了CHANNEL_NAME, 还有CHANNEL_ID所以要添加了一个productFlavors.all

在productFlavors 的各个子项里可以自定义其applicationId、versionCode以及versionName等信息,以便打出不同包名的apk.

批量修改生成的apk文件名

def buildTime() {

def date = new Date()

def formattedDate = date.format('yyyyMMdd')

return formattedDate

}

android {

buildTypes {

release {

applicationVariants.all { variant ->

variant.outputs.each { output ->

if (output.outputFile != null && output.outputFile.name.endsWith('.apk')

&&'release'.equals(variant.buildType.name)) {

def apkFile = new File(

output.outputFile.getParent(),

"Mymoney_${variant.flavorName}_v${variant.versionName}_${buildTime()}.apk")

output.outputFile = apkFile

}

}

}

}

}

}

通过这种方式我们可以知道这个apk是哪个版本的,哪个渠道的,是哪天打的包等等, 例如生成的Mymoney_baidu_v9.5.2.6_20150330.apk.

定义不同的通信方式

在平时Android开发中会有生产和测试环境,在发布正式版本时可以通过以下方式:

android {

defaultConfig {

buildConfigField("String", "URL_UPDATE", "\"http://api2.okzaijia.com.cn/\"")

}

productFlavors {

google{

buildConfigField("String", "URL_UPDATE", "\"http://api2.okzaijia.com.cn/\"")

}

baidu{

buildConfigField("String", "URL_UPDATE", "\"http://api2.okzaijia.com.cn/\"")

}

}

}

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说他是动态可配置的.buildConfigField 一共有3个参数,第一个是数据类型,就是你定义的常量值是一个什么类型,和Java的类型是对等的,这里是String。第二个参数是常量名,这里是 API_SERVER_URL。第三个参数是常量值。如此定义之后,就会在BuildConfig.java中生成一个常量名为 API_SERVER_URL的常量定义。默认配置的生成是:

public final static String API_SERVER_URL = "http://test.flysnw.org/" 当是baidu和google渠道的时候生成的就是http://www.flysnow.org/了。这个常量可以在我们编码中引用。在我们进行打包的时候会根据Gradle配置动态替换。

一般渠道版本都是用来发布的,肯定用的是生产服务器,所以我们可以使用批处理来搞定这个事情,而不用在一个个渠道里写这些配置。

productFlavors.all { flavor -> buildConfigField("String", "URL_UPDATE", "\"http://api2.okzaijia.com.cn/\"") }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值